Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgWorkingCopyStatusCollector.java @ 141:8248aae33f7d
Adopt FileIterator moving towards WCStatusCollector parameterizing. Improved path handling, move 'em around
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 17 Feb 2011 04:08:34 +0100 | 
| parents | 4a948ec83980 | 
| children | 37a34044e6bd | 
   comparison
  equal
  deleted
  inserted
  replaced
| 140:1c1891ad1c73 | 141:8248aae33f7d | 
|---|---|
| 32 | 32 | 
| 33 import org.tmatesoft.hg.core.Nodeid; | 33 import org.tmatesoft.hg.core.Nodeid; | 
| 34 import org.tmatesoft.hg.internal.FilterByteChannel; | 34 import org.tmatesoft.hg.internal.FilterByteChannel; | 
| 35 import org.tmatesoft.hg.repo.HgStatusCollector.ManifestRevisionInspector; | 35 import org.tmatesoft.hg.repo.HgStatusCollector.ManifestRevisionInspector; | 
| 36 import org.tmatesoft.hg.util.ByteChannel; | 36 import org.tmatesoft.hg.util.ByteChannel; | 
| 37 import org.tmatesoft.hg.util.FileWalker; | 37 import org.tmatesoft.hg.util.FileIterator; | 
| 38 import org.tmatesoft.hg.util.Path; | 38 import org.tmatesoft.hg.util.Path; | 
| 39 import org.tmatesoft.hg.util.PathPool; | 39 import org.tmatesoft.hg.util.PathPool; | 
| 40 import org.tmatesoft.hg.util.PathRewrite; | 40 import org.tmatesoft.hg.util.PathRewrite; | 
| 41 | 41 | 
| 42 /** | 42 /** | 
| 45 * @author TMate Software Ltd. | 45 * @author TMate Software Ltd. | 
| 46 */ | 46 */ | 
| 47 public class HgWorkingCopyStatusCollector { | 47 public class HgWorkingCopyStatusCollector { | 
| 48 | 48 | 
| 49 private final HgRepository repo; | 49 private final HgRepository repo; | 
| 50 private final FileWalker repoWalker; | 50 private final FileIterator repoWalker; | 
| 51 private HgDirstate dirstate; | 51 private HgDirstate dirstate; | 
| 52 private HgStatusCollector baseRevisionCollector; | 52 private HgStatusCollector baseRevisionCollector; | 
| 53 private PathPool pathPool; | 53 private PathPool pathPool; | 
| 54 | 54 | 
| 55 public HgWorkingCopyStatusCollector(HgRepository hgRepo) { | 55 public HgWorkingCopyStatusCollector(HgRepository hgRepo) { | 
| 56 this(hgRepo, hgRepo.createWorkingDirWalker()); | 56 this(hgRepo, hgRepo.createWorkingDirWalker()); | 
| 57 } | 57 } | 
| 58 | 58 | 
| 59 HgWorkingCopyStatusCollector(HgRepository hgRepo, FileWalker hgRepoWalker) { | 59 HgWorkingCopyStatusCollector(HgRepository hgRepo, FileIterator hgRepoWalker) { | 
| 60 this.repo = hgRepo; | 60 this.repo = hgRepo; | 
| 61 this.repoWalker = hgRepoWalker; | 61 this.repoWalker = hgRepoWalker; | 
| 62 } | 62 } | 
| 63 | 63 | 
| 64 /** | 64 /** | 
| 120 } | 120 } | 
| 121 repoWalker.reset(); | 121 repoWalker.reset(); | 
| 122 final PathPool pp = getPathPool(); | 122 final PathPool pp = getPathPool(); | 
| 123 while (repoWalker.hasNext()) { | 123 while (repoWalker.hasNext()) { | 
| 124 repoWalker.next(); | 124 repoWalker.next(); | 
| 125 String fname = repoWalker.name(); | 125 Path fname = repoWalker.name(); | 
| 126 File f = repoWalker.file(); | 126 File f = repoWalker.file(); | 
| 127 if (hgIgnore.isIgnored(fname)) { | 127 if (hgIgnore.isIgnored(fname)) { | 
| 128 inspector.ignored(pp.path(fname)); | 128 inspector.ignored(pp.path(fname)); | 
| 129 } else if (knownEntries.remove(fname)) { | 129 } else if (knownEntries.remove(fname.toString())) { | 
| 130 // modified, added, removed, clean | 130 // modified, added, removed, clean | 
| 131 if (collect != null) { // need to check against base revision, not FS file | 131 if (collect != null) { // need to check against base revision, not FS file | 
| 132 checkLocalStatusAgainstBaseRevision(baseRevFiles, collect, baseRevision, fname, f, inspector); | 132 checkLocalStatusAgainstBaseRevision(baseRevFiles, collect, baseRevision, fname, f, inspector); | 
| 133 baseRevFiles.remove(fname); | 133 baseRevFiles.remove(fname); | 
| 134 } else { | 134 } else { | 
| 165 } | 165 } | 
| 166 | 166 | 
| 167 //******************************************** | 167 //******************************************** | 
| 168 | 168 | 
| 169 | 169 | 
| 170 private void checkLocalStatusAgainstFile(String fname, File f, HgStatusInspector inspector) { | 170 private void checkLocalStatusAgainstFile(Path fname, File f, HgStatusInspector inspector) { | 
| 171 HgDirstate.Record r; | 171 HgDirstate.Record r; | 
| 172 if ((r = getDirstate().checkNormal(fname)) != null) { | 172 if ((r = getDirstate().checkNormal(fname)) != null) { | 
| 173 // either clean or modified | 173 // either clean or modified | 
| 174 if (f.lastModified() / 1000 == r.time && r.size == f.length()) { | 174 if (f.lastModified() / 1000 == r.time && r.size == f.length()) { | 
| 175 inspector.clean(getPathPool().path(fname)); | 175 inspector.clean(getPathPool().path(fname)); | 
| 192 inspector.modified(getPathPool().path(fname)); | 192 inspector.modified(getPathPool().path(fname)); | 
| 193 } | 193 } | 
| 194 } | 194 } | 
| 195 | 195 | 
| 196 // XXX refactor checkLocalStatus methods in more OO way | 196 // XXX refactor checkLocalStatus methods in more OO way | 
| 197 private void checkLocalStatusAgainstBaseRevision(Set<String> baseRevNames, ManifestRevisionInspector collect, int baseRevision, String fname, File f, HgStatusInspector inspector) { | 197 private void checkLocalStatusAgainstBaseRevision(Set<String> baseRevNames, ManifestRevisionInspector collect, int baseRevision, Path fname, File f, HgStatusInspector inspector) { | 
| 198 // fname is in the dirstate, either Normal, Added, Removed or Merged | 198 // fname is in the dirstate, either Normal, Added, Removed or Merged | 
| 199 Nodeid nid1 = collect.nodeid(fname); | 199 Nodeid nid1 = collect.nodeid(fname.toString()); | 
| 200 String flags = collect.flags(fname); | 200 String flags = collect.flags(fname.toString()); | 
| 201 HgDirstate.Record r; | 201 HgDirstate.Record r; | 
| 202 if (nid1 == null) { | 202 if (nid1 == null) { | 
| 203 // normal: added? | 203 // normal: added? | 
| 204 // added: not known at the time of baseRevision, shall report | 204 // added: not known at the time of baseRevision, shall report | 
| 205 // merged: was not known, report as added? | 205 // merged: was not known, report as added? | 
| 206 if ((r = getDirstate().checkNormal(fname)) != null) { | 206 if ((r = getDirstate().checkNormal(fname)) != null) { | 
| 207 String origin = HgStatusCollector.getOriginIfCopy(repo, fname, baseRevNames, baseRevision); | 207 Path origin = HgStatusCollector.getOriginIfCopy(repo, fname, baseRevNames, baseRevision); | 
| 208 if (origin != null) { | 208 if (origin != null) { | 
| 209 inspector.copied(getPathPool().path(origin), getPathPool().path(fname)); | 209 inspector.copied(getPathPool().path(origin), getPathPool().path(fname)); | 
| 210 return; | 210 return; | 
| 211 } | 211 } | 
| 212 } else if ((r = getDirstate().checkAdded(fname)) != null) { | 212 } else if ((r = getDirstate().checkAdded(fname)) != null) { | 
| 299 ex.printStackTrace(); | 299 ex.printStackTrace(); | 
| 300 } | 300 } | 
| 301 return false; | 301 return false; | 
| 302 } | 302 } | 
| 303 | 303 | 
| 304 private static String todoGenerateFlags(String fname) { | 304 private static String todoGenerateFlags(Path fname) { | 
| 305 // FIXME implement | 305 // FIXME implement | 
| 306 return null; | 306 return null; | 
| 307 } | 307 } | 
| 308 | 308 | 
| 309 } | 309 } | 
