Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgWorkingCopyStatusCollector.java @ 285:6dbbc53fc46d
Use Path instead of plain String for manifest file names
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Sat, 03 Sep 2011 21:46:13 +0200 |
| parents | 7232b94f2ae3 |
| children | ed6b74a58c66 |
comparison
equal
deleted
inserted
replaced
| 284:7232b94f2ae3 | 285:6dbbc53fc46d |
|---|---|
| 134 public void walk(int baseRevision, HgStatusInspector inspector) { | 134 public void walk(int baseRevision, HgStatusInspector inspector) { |
| 135 if (HgInternals.wrongLocalRevision(baseRevision) || baseRevision == BAD_REVISION) { | 135 if (HgInternals.wrongLocalRevision(baseRevision) || baseRevision == BAD_REVISION) { |
| 136 throw new IllegalArgumentException(String.valueOf(baseRevision)); | 136 throw new IllegalArgumentException(String.valueOf(baseRevision)); |
| 137 } | 137 } |
| 138 ManifestRevision collect = null; // non null indicates we compare against base revision | 138 ManifestRevision collect = null; // non null indicates we compare against base revision |
| 139 Set<String> baseRevFiles = Collections.emptySet(); // files from base revision not affected by status calculation | 139 Set<Path> baseRevFiles = Collections.emptySet(); // files from base revision not affected by status calculation |
| 140 if (baseRevision != TIP && baseRevision != WORKING_COPY) { | 140 if (baseRevision != TIP && baseRevision != WORKING_COPY) { |
| 141 collect = getManifest(baseRevision); | 141 collect = getManifest(baseRevision); |
| 142 baseRevFiles = new TreeSet<String>(collect.files()); | 142 baseRevFiles = new TreeSet<Path>(collect.files()); |
| 143 } | 143 } |
| 144 if (inspector instanceof HgStatusCollector.Record) { | 144 if (inspector instanceof HgStatusCollector.Record) { |
| 145 HgStatusCollector sc = baseRevisionCollector == null ? new HgStatusCollector(repo) : baseRevisionCollector; | 145 HgStatusCollector sc = baseRevisionCollector == null ? new HgStatusCollector(repo) : baseRevisionCollector; |
| 146 // nodeidAfterChange(dirstate's parent) doesn't make too much sense, | 146 // nodeidAfterChange(dirstate's parent) doesn't make too much sense, |
| 147 // because the change might be actually in working copy. Nevertheless, | 147 // because the change might be actually in working copy. Nevertheless, |
| 171 } else { | 171 } else { |
| 172 inspector.removed(fname); | 172 inspector.removed(fname); |
| 173 } | 173 } |
| 174 // do not report it as removed later | 174 // do not report it as removed later |
| 175 if (collect != null) { | 175 if (collect != null) { |
| 176 baseRevFiles.remove(fname.toString()); | 176 baseRevFiles.remove(fname); |
| 177 } | 177 } |
| 178 } else { | 178 } else { |
| 179 // chances are it was known in baseRevision. We may rely | 179 // chances are it was known in baseRevision. We may rely |
| 180 // that later iteration over baseRevFiles leftovers would yield correct Removed, | 180 // that later iteration over baseRevFiles leftovers would yield correct Removed, |
| 181 // but it doesn't hurt to be explicit (provided we know fname *is* inScope of the FileIterator | 181 // but it doesn't hurt to be explicit (provided we know fname *is* inScope of the FileIterator |
| 182 if (collect != null && baseRevFiles.remove(fname.toString())) { | 182 if (collect != null && baseRevFiles.remove(fname)) { |
| 183 inspector.removed(fname); | 183 inspector.removed(fname); |
| 184 } else { | 184 } else { |
| 185 // not sure I shall report such files (i.e. arbitrary name coming from FileIterator) | 185 // not sure I shall report such files (i.e. arbitrary name coming from FileIterator) |
| 186 // as unknown. Command-line HG aborts "system can't find the file specified" | 186 // as unknown. Command-line HG aborts "system can't find the file specified" |
| 187 // in similar case (against wc), or just gives nothing if --change <rev> is specified. | 187 // in similar case (against wc), or just gives nothing if --change <rev> is specified. |
| 212 // from baseRevFiles, it might need to be reported as removed as well (cmdline client does | 212 // from baseRevFiles, it might need to be reported as removed as well (cmdline client does |
| 213 // yield two statuses for the same file) | 213 // yield two statuses for the same file) |
| 214 } | 214 } |
| 215 } | 215 } |
| 216 if (collect != null) { | 216 if (collect != null) { |
| 217 for (String r : baseRevFiles) { | 217 for (Path fromBase : baseRevFiles) { |
| 218 final Path fromBase = getPathPool().path(r); | |
| 219 if (repoWalker.inScope(fromBase)) { | 218 if (repoWalker.inScope(fromBase)) { |
| 220 inspector.removed(fromBase); | 219 inspector.removed(fromBase); |
| 221 } | 220 } |
| 222 } | 221 } |
| 223 } | 222 } |
| 231 // not removed from the repository = 'deleted' | 230 // not removed from the repository = 'deleted' |
| 232 inspector.missing(m); | 231 inspector.missing(m); |
| 233 } else { | 232 } else { |
| 234 // removed from the repo | 233 // removed from the repo |
| 235 // if we check against non-tip revision, do not report files that were added past that revision and now removed. | 234 // if we check against non-tip revision, do not report files that were added past that revision and now removed. |
| 236 if (collect == null || baseRevFiles.contains(m.toString())) { | 235 if (collect == null || baseRevFiles.contains(m)) { |
| 237 inspector.removed(m); | 236 inspector.removed(m); |
| 238 } | 237 } |
| 239 } | 238 } |
| 240 } | 239 } |
| 241 } | 240 } |
| 260 inspector.modified(fname); | 259 inspector.modified(fname); |
| 261 } else { | 260 } else { |
| 262 // size is the same or unknown, and, perhaps, different timestamp | 261 // size is the same or unknown, and, perhaps, different timestamp |
| 263 // check actual content to avoid false modified files | 262 // check actual content to avoid false modified files |
| 264 HgDataFile df = repo.getFileNode(fname); | 263 HgDataFile df = repo.getFileNode(fname); |
| 265 Nodeid rev = getDirstateParentManifest().nodeid(fname.toString()); | 264 Nodeid rev = getDirstateParentManifest().nodeid(fname); |
| 266 if (!areTheSame(f, df, rev)) { | 265 if (!areTheSame(f, df, rev)) { |
| 267 inspector.modified(df.getPath()); | 266 inspector.modified(df.getPath()); |
| 268 } else { | 267 } else { |
| 269 inspector.clean(df.getPath()); | 268 inspector.clean(df.getPath()); |
| 270 } | 269 } |
| 286 private static int getFileModificationTime(File f) { | 285 private static int getFileModificationTime(File f) { |
| 287 return (int) (f.lastModified() / 1000); | 286 return (int) (f.lastModified() / 1000); |
| 288 } | 287 } |
| 289 | 288 |
| 290 // XXX refactor checkLocalStatus methods in more OO way | 289 // XXX refactor checkLocalStatus methods in more OO way |
| 291 private void checkLocalStatusAgainstBaseRevision(Set<String> baseRevNames, ManifestRevision collect, int baseRevision, Path fname, File f, HgStatusInspector inspector) { | 290 private void checkLocalStatusAgainstBaseRevision(Set<Path> baseRevNames, ManifestRevision collect, int baseRevision, Path fname, File f, HgStatusInspector inspector) { |
| 292 // fname is in the dirstate, either Normal, Added, Removed or Merged | 291 // fname is in the dirstate, either Normal, Added, Removed or Merged |
| 293 Nodeid nid1 = collect.nodeid(fname.toString()); | 292 Nodeid nid1 = collect.nodeid(fname); |
| 294 String flags = collect.flags(fname.toString()); | 293 HgManifest.Flags flags = collect.flags(fname); |
| 295 HgDirstate.Record r; | 294 HgDirstate.Record r; |
| 296 if (nid1 == null) { | 295 if (nid1 == null) { |
| 297 // normal: added? | 296 // normal: added? |
| 298 // added: not known at the time of baseRevision, shall report | 297 // added: not known at the time of baseRevision, shall report |
| 299 // merged: was not known, report as added? | 298 // merged: was not known, report as added? |
| 309 // FIXME report to a mediator, continue status collection | 308 // FIXME report to a mediator, continue status collection |
| 310 } | 309 } |
| 311 } else if ((r = getDirstate().checkAdded(fname)) != null) { | 310 } else if ((r = getDirstate().checkAdded(fname)) != null) { |
| 312 if (r.name2 != null && baseRevNames.contains(r.name2)) { | 311 if (r.name2 != null && baseRevNames.contains(r.name2)) { |
| 313 baseRevNames.remove(r.name2); // XXX surely I shall not report rename source as Removed? | 312 baseRevNames.remove(r.name2); // XXX surely I shall not report rename source as Removed? |
| 314 inspector.copied(getPathPool().path(r.name2), fname); | 313 inspector.copied(r.name2, fname); |
| 315 return; | 314 return; |
| 316 } | 315 } |
| 317 // fall-through, report as added | 316 // fall-through, report as added |
| 318 } else if (getDirstate().checkRemoved(fname) != null) { | 317 } else if (getDirstate().checkRemoved(fname) != null) { |
| 319 // removed: removed file was not known at the time of baseRevision, and we should not report it as removed | 318 // removed: removed file was not known at the time of baseRevision, and we should not report it as removed |
| 320 return; | 319 return; |
| 321 } | 320 } |
| 322 inspector.added(fname); | 321 inspector.added(fname); |
| 323 } else { | 322 } else { |
| 324 // was known; check whether clean or modified | 323 // was known; check whether clean or modified |
| 325 Nodeid nidFromDirstate = getDirstateParentManifest().nodeid(fname.toString()); | 324 Nodeid nidFromDirstate = getDirstateParentManifest().nodeid(fname); |
| 326 if ((r = getDirstate().checkNormal(fname)) != null && nid1.equals(nidFromDirstate)) { | 325 if ((r = getDirstate().checkNormal(fname)) != null && nid1.equals(nidFromDirstate)) { |
| 327 // regular file, was the same up to WC initialization. Check if was modified since, and, if not, report right away | 326 // regular file, was the same up to WC initialization. Check if was modified since, and, if not, report right away |
| 328 // same code as in #checkLocalStatusAgainstFile | 327 // same code as in #checkLocalStatusAgainstFile |
| 329 final boolean timestampEqual = getFileModificationTime(f) == r.time, sizeEqual = r.size == f.length(); | 328 final boolean timestampEqual = getFileModificationTime(f) == r.time, sizeEqual = r.size == f.length(); |
| 330 boolean handled = false; | 329 boolean handled = false; |
| 338 // seems like flags have changed, no reason to check content further | 337 // seems like flags have changed, no reason to check content further |
| 339 inspector.modified(fname); | 338 inspector.modified(fname); |
| 340 handled = true; | 339 handled = true; |
| 341 } | 340 } |
| 342 if (handled) { | 341 if (handled) { |
| 343 baseRevNames.remove(fname.toString()); // consumed, processed, handled. | 342 baseRevNames.remove(fname); // consumed, processed, handled. |
| 344 return; | 343 return; |
| 345 } | 344 } |
| 346 // otherwise, shall check actual content (size not the same, or unknown (-1 or -2), or timestamp is different, | 345 // otherwise, shall check actual content (size not the same, or unknown (-1 or -2), or timestamp is different, |
| 347 // or nodeid in dirstate is different, but local change might have brought it back to baseRevision state) | 346 // or nodeid in dirstate is different, but local change might have brought it back to baseRevision state) |
| 348 // FALL THROUGH | 347 // FALL THROUGH |
| 355 if (areTheSame(f, fileNode, nid1)) { | 354 if (areTheSame(f, fileNode, nid1)) { |
| 356 inspector.clean(fname); | 355 inspector.clean(fname); |
| 357 } else { | 356 } else { |
| 358 inspector.modified(fname); | 357 inspector.modified(fname); |
| 359 } | 358 } |
| 360 baseRevNames.remove(fname.toString()); // consumed, processed, handled. | 359 baseRevNames.remove(fname); // consumed, processed, handled. |
| 361 } else if (getDirstate().checkRemoved(fname) != null) { | 360 } else if (getDirstate().checkRemoved(fname) != null) { |
| 362 // was known, and now marked as removed, report it right away, do not rely on baseRevNames processing later | 361 // was known, and now marked as removed, report it right away, do not rely on baseRevNames processing later |
| 363 inspector.removed(fname); | 362 inspector.removed(fname); |
| 364 baseRevNames.remove(fname.toString()); // consumed, processed, handled. | 363 baseRevNames.remove(fname); // consumed, processed, handled. |
| 365 } | 364 } |
| 366 // only those left in baseRevNames after processing are reported as removed | 365 // only those left in baseRevNames after processing are reported as removed |
| 367 } | 366 } |
| 368 | 367 |
| 369 // TODO think over if content comparison may be done more effectively by e.g. calculating nodeid for a local file and comparing it with nodeid from manifest | 368 // TODO think over if content comparison may be done more effectively by e.g. calculating nodeid for a local file and comparing it with nodeid from manifest |
| 449 ex.printStackTrace(); | 448 ex.printStackTrace(); |
| 450 } | 449 } |
| 451 return false; | 450 return false; |
| 452 } | 451 } |
| 453 | 452 |
| 454 private static boolean todoCheckFlagsEqual(File f, String manifestFlags) { | 453 private static boolean todoCheckFlagsEqual(File f, HgManifest.Flags originalManifestFlags) { |
| 455 // FIXME implement | 454 // FIXME implement |
| 456 return true; | 455 return true; |
| 457 } | 456 } |
| 458 | 457 |
| 459 /** | 458 /** |
