Mercurial > hg4j
comparison src/org/tmatesoft/hg/core/HgManifestCommand.java @ 231:1792b37650f2
Introduced access to conflict resolution information (merge state)
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Wed, 01 Jun 2011 05:44:25 +0200 |
parents | 373e07cd3991 |
children | 4c3b9f679412 |
comparison
equal
deleted
inserted
replaced
230:0dd9da7489dc | 231:1792b37650f2 |
---|---|
23 import java.util.ConcurrentModificationException; | 23 import java.util.ConcurrentModificationException; |
24 import java.util.LinkedHashMap; | 24 import java.util.LinkedHashMap; |
25 import java.util.LinkedList; | 25 import java.util.LinkedList; |
26 import java.util.List; | 26 import java.util.List; |
27 | 27 |
28 import org.tmatesoft.hg.core.HgLogCommand.FileRevision; | |
29 import org.tmatesoft.hg.repo.HgManifest; | 28 import org.tmatesoft.hg.repo.HgManifest; |
30 import org.tmatesoft.hg.repo.HgRepository; | 29 import org.tmatesoft.hg.repo.HgRepository; |
31 import org.tmatesoft.hg.util.Path; | 30 import org.tmatesoft.hg.util.Path; |
32 import org.tmatesoft.hg.util.PathPool; | 31 import org.tmatesoft.hg.util.PathPool; |
33 import org.tmatesoft.hg.util.PathRewrite; | 32 import org.tmatesoft.hg.util.PathRewrite; |
122 * Callback to walk file/directory tree of a revision | 121 * Callback to walk file/directory tree of a revision |
123 */ | 122 */ |
124 public interface Handler { | 123 public interface Handler { |
125 void begin(Nodeid manifestRevision); | 124 void begin(Nodeid manifestRevision); |
126 void dir(Path p); // optionally invoked (if walker was configured to spit out directories) prior to any files from this dir and subdirs | 125 void dir(Path p); // optionally invoked (if walker was configured to spit out directories) prior to any files from this dir and subdirs |
127 void file(FileRevision fileRevision); // XXX allow to check p is invalid (df.exists()) | 126 void file(HgLogCommand.FileRevision fileRevision); // XXX allow to check p is invalid (df.exists()) |
128 void end(Nodeid manifestRevision); | 127 void end(Nodeid manifestRevision); |
129 } | 128 } |
130 | 129 |
131 // I'd rather let HgManifestCommand implement HgManifest.Inspector directly, but this pollutes API alot | 130 // I'd rather let HgManifestCommand implement HgManifest.Inspector directly, but this pollutes API alot |
132 private class Mediator implements HgManifest.Inspector { | 131 private class Mediator implements HgManifest.Inspector { |
133 // file names are likely to repeat in each revision, hence caching of Paths. | 132 // file names are likely to repeat in each revision, hence caching of Paths. |
134 // However, once HgManifest.Inspector switches to Path objects, perhaps global Path pool | 133 // However, once HgManifest.Inspector switches to Path objects, perhaps global Path pool |
135 // might be more effective? | 134 // might be more effective? |
136 private PathPool pathPool; | 135 private PathPool pathPool; |
137 private List<FileRevision> manifestContent; | 136 private List<HgFileRevision> manifestContent; |
138 private Nodeid manifestNodeid; | 137 private Nodeid manifestNodeid; |
139 | 138 |
140 public void start() { | 139 public void start() { |
141 // Manifest keeps normalized paths | 140 // Manifest keeps normalized paths |
142 pathPool = new PathPool(new PathRewrite.Empty()); | 141 pathPool = new PathPool(new PathRewrite.Empty()); |
147 pathPool = null; | 146 pathPool = null; |
148 } | 147 } |
149 | 148 |
150 public boolean begin(int manifestRevision, Nodeid nid, int changelogRevision) { | 149 public boolean begin(int manifestRevision, Nodeid nid, int changelogRevision) { |
151 if (needDirs && manifestContent == null) { | 150 if (needDirs && manifestContent == null) { |
152 manifestContent = new LinkedList<FileRevision>(); | 151 manifestContent = new LinkedList<HgFileRevision>(); |
153 } | 152 } |
154 visitor.begin(manifestNodeid = nid); | 153 visitor.begin(manifestNodeid = nid); |
155 return true; | 154 return true; |
156 } | 155 } |
157 public boolean end(int revision) { | 156 public boolean end(int revision) { |
158 if (needDirs) { | 157 if (needDirs) { |
159 LinkedHashMap<Path, LinkedList<FileRevision>> breakDown = new LinkedHashMap<Path, LinkedList<FileRevision>>(); | 158 LinkedHashMap<Path, LinkedList<HgFileRevision>> breakDown = new LinkedHashMap<Path, LinkedList<HgFileRevision>>(); |
160 for (FileRevision fr : manifestContent) { | 159 for (HgFileRevision fr : manifestContent) { |
161 Path filePath = fr.getPath(); | 160 Path filePath = fr.getPath(); |
162 Path dirPath = pathPool.parent(filePath); | 161 Path dirPath = pathPool.parent(filePath); |
163 LinkedList<FileRevision> revs = breakDown.get(dirPath); | 162 LinkedList<HgFileRevision> revs = breakDown.get(dirPath); |
164 if (revs == null) { | 163 if (revs == null) { |
165 revs = new LinkedList<FileRevision>(); | 164 revs = new LinkedList<HgFileRevision>(); |
166 breakDown.put(dirPath, revs); | 165 breakDown.put(dirPath, revs); |
167 } | 166 } |
168 revs.addLast(fr); | 167 revs.addLast(fr); |
169 } | 168 } |
170 for (Path dir : breakDown.keySet()) { | 169 for (Path dir : breakDown.keySet()) { |
171 visitor.dir(dir); | 170 visitor.dir(dir); |
172 for (FileRevision fr : breakDown.get(dir)) { | 171 for (HgFileRevision fr : breakDown.get(dir)) { |
173 visitor.file(fr); | 172 visitor.file(fr); |
174 } | 173 } |
175 } | 174 } |
176 manifestContent.clear(); | 175 manifestContent.clear(); |
177 } | 176 } |
182 public boolean next(Nodeid nid, String fname, String flags) { | 181 public boolean next(Nodeid nid, String fname, String flags) { |
183 Path p = pathPool.path(fname); | 182 Path p = pathPool.path(fname); |
184 if (matcher != null && !matcher.accept(p)) { | 183 if (matcher != null && !matcher.accept(p)) { |
185 return true; | 184 return true; |
186 } | 185 } |
187 FileRevision fr = new FileRevision(repo, nid, p); | 186 HgFileRevision fr = new HgFileRevision(repo, nid, p); |
188 if (needDirs) { | 187 if (needDirs) { |
189 manifestContent.add(fr); | 188 manifestContent.add(fr); |
190 } else { | 189 } else { |
191 visitor.file(fr); | 190 visitor.file(fr); |
192 } | 191 } |