1   package com.aragost.javahg;
2   
3   import java.io.IOException;
4   import java.util.List;
5   
6   import com.aragost.javahg.commands.AddCommand;
7   import com.aragost.javahg.commands.BranchCommand;
8   import com.aragost.javahg.commands.MergeCommand;
9   import com.aragost.javahg.commands.ParentsCommand;
10  import com.aragost.javahg.commands.RemoveCommand;
11  import com.aragost.javahg.commands.StatusCommand;
12  import com.aragost.javahg.commands.StatusResult;
13  import com.aragost.javahg.merge.MergeContext;
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  public class WorkingCopy {
24  
25      private Repository repository;
26  
27      private boolean parentsRetrieved = false;
28  
29      private Changeset parent1;
30  
31      private Changeset parent2;
32  
33      private String branchName;
34  
35      WorkingCopy(Repository repository) {
36          this.repository = repository;
37      }
38  
39      public Changeset getParent1() {
40          ensureParentsRetrieved();
41          return this.parent1;
42      }
43  
44      public Changeset getParent2() {
45          ensureParentsRetrieved();
46          return this.parent2;
47      }
48  
49      
50  
51  
52      public synchronized String getBranchName() {
53          if (this.branchName == null) {
54              this.branchName = BranchCommand.on(this.repository).get();
55          }
56          return this.branchName;
57      }
58  
59      
60  
61  
62  
63  
64      public synchronized void setBranchName(String branchName) {
65          BranchCommand.on(this.repository).set(branchName);
66          this.branchName = branchName;
67      }
68  
69      public void remove(String... files) {
70          RemoveCommand.on(this.repository).execute(files);
71      }
72  
73      public void add(String... files) {
74          AddCommand.on(this.repository).execute(files);
75      }
76  
77      
78  
79  
80  
81  
82  
83  
84      public MergeContext merge(Changeset remote) throws IOException {
85          return MergeCommand.on(this.repository).rev(remote.getNode()).execute();
86      }
87  
88      
89  
90  
91  
92      public StatusResult status() {
93          return StatusCommand.on(this.repository).execute();
94      }
95  
96      
97  
98  
99  
100     public StatusResult parent2Status() {
101         if (getParent2() == null) {
102             return null;
103         }
104         return StatusCommand.on(this.repository).rev(getParent2().getNode()).execute();
105     }
106 
107     private synchronized void ensureParentsRetrieved() {
108         if (!this.parentsRetrieved) {
109             retrieveParents();
110             this.parentsRetrieved = true;
111         }
112     }
113 
114     private void retrieveParents() {
115         List<Changeset> parents = ParentsCommand.on(this.repository).execute();
116         switch (parents.size()) {
117         
118         case 2:
119             this.parent2 = parents.get(1);
120         case 1:
121             this.parent1 = parents.get(0);
122         case 0:
123             break;
124         default:
125             throw new RuntimeException("More that 2 parents from parents command");
126         }
127     }
128 
129 }