comparison src/org/tmatesoft/hg/repo/HgWorkingCopyStatusCollector.java @ 628:6526d8adbc0f

Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 22 May 2013 15:52:31 +0200
parents f41dd9a3b8af
children 12a4f60ea972
comparison
equal deleted inserted replaced
627:5153eb73b18d 628:6526d8adbc0f
32 import java.util.TreeSet; 32 import java.util.TreeSet;
33 33
34 import org.tmatesoft.hg.core.Nodeid; 34 import org.tmatesoft.hg.core.Nodeid;
35 import org.tmatesoft.hg.core.SessionContext; 35 import org.tmatesoft.hg.core.SessionContext;
36 import org.tmatesoft.hg.internal.ByteArrayChannel; 36 import org.tmatesoft.hg.internal.ByteArrayChannel;
37 import org.tmatesoft.hg.internal.FileUtils;
37 import org.tmatesoft.hg.internal.FilterByteChannel; 38 import org.tmatesoft.hg.internal.FilterByteChannel;
38 import org.tmatesoft.hg.internal.Internals; 39 import org.tmatesoft.hg.internal.Internals;
39 import org.tmatesoft.hg.internal.ManifestRevision; 40 import org.tmatesoft.hg.internal.ManifestRevision;
40 import org.tmatesoft.hg.internal.PathPool; 41 import org.tmatesoft.hg.internal.PathPool;
41 import org.tmatesoft.hg.internal.PathScope; 42 import org.tmatesoft.hg.internal.PathScope;
128 129
129 private HgDirstate getDirstateImpl() { 130 private HgDirstate getDirstateImpl() {
130 return dirstate; 131 return dirstate;
131 } 132 }
132 133
133 private ManifestRevision getManifest(int changelogLocalRev) throws HgInvalidControlFileException { 134 private ManifestRevision getManifest(int changelogLocalRev) throws HgRuntimeException {
134 assert changelogLocalRev >= 0; 135 assert changelogLocalRev >= 0;
135 ManifestRevision mr; 136 ManifestRevision mr;
136 if (baseRevisionCollector != null) { 137 if (baseRevisionCollector != null) {
137 mr = baseRevisionCollector.raw(changelogLocalRev); 138 mr = baseRevisionCollector.raw(changelogLocalRev);
138 } else { 139 } else {
140 repo.getManifest().walk(changelogLocalRev, changelogLocalRev, mr); 141 repo.getManifest().walk(changelogLocalRev, changelogLocalRev, mr);
141 } 142 }
142 return mr; 143 return mr;
143 } 144 }
144 145
145 private void initDirstateParentManifest() throws HgInvalidControlFileException { 146 private void initDirstateParentManifest() throws HgRuntimeException {
146 Nodeid dirstateParent = getDirstateImpl().parents().first(); 147 Nodeid dirstateParent = getDirstateImpl().parents().first();
147 if (dirstateParent.isNull()) { 148 if (dirstateParent.isNull()) {
148 dirstateParentManifest = baseRevisionCollector != null ? baseRevisionCollector.raw(NO_REVISION) : HgStatusCollector.createEmptyManifestRevision(); 149 dirstateParentManifest = baseRevisionCollector != null ? baseRevisionCollector.raw(NO_REVISION) : HgStatusCollector.createEmptyManifestRevision();
149 } else { 150 } else {
150 int changeloRevIndex = repo.getChangelog().getRevisionIndex(dirstateParent); 151 int changeloRevIndex = repo.getChangelog().getRevisionIndex(dirstateParent);
405 inspector.modified(fname); 406 inspector.modified(fname);
406 } 407 }
407 } 408 }
408 409
409 // XXX refactor checkLocalStatus methods in more OO way 410 // XXX refactor checkLocalStatus methods in more OO way
410 private void checkLocalStatusAgainstBaseRevision(Set<Path> baseRevNames, ManifestRevision collect, int baseRevision, Path fname, FileInfo f, HgStatusInspector inspector) { 411 private void checkLocalStatusAgainstBaseRevision(Set<Path> baseRevNames, ManifestRevision collect, int baseRevision, Path fname, FileInfo f, HgStatusInspector inspector) throws HgRuntimeException {
411 // fname is in the dirstate, either Normal, Added, Removed or Merged 412 // fname is in the dirstate, either Normal, Added, Removed or Merged
412 Nodeid nid1 = collect.nodeid(fname); 413 Nodeid nid1 = collect.nodeid(fname);
413 HgManifest.Flags flags = collect.flags(fname); 414 HgManifest.Flags flags = collect.flags(fname);
414 HgDirstate.Record r; 415 HgDirstate.Record r;
415 final HgDirstate ds = getDirstateImpl(); 416 final HgDirstate ds = getDirstateImpl();
499 // changeset nodeid + hash(actual content) => entry (Nodeid) in the next Manifest 500 // changeset nodeid + hash(actual content) => entry (Nodeid) in the next Manifest
500 // then it's sufficient to check parents from dirstate, and if they do not match parents from file's baseRevision (non matching parents means different nodeids). 501 // then it's sufficient to check parents from dirstate, and if they do not match parents from file's baseRevision (non matching parents means different nodeids).
501 // The question is whether original Hg treats this case (same content, different parents and hence nodeids) as 'modified' or 'clean' 502 // The question is whether original Hg treats this case (same content, different parents and hence nodeids) as 'modified' or 'clean'
502 } 503 }
503 504
504 private boolean areTheSame(FileInfo f, HgDataFile dataFile, Nodeid revision) throws HgInvalidFileException { 505 private boolean areTheSame(FileInfo f, HgDataFile dataFile, Nodeid revision) throws HgRuntimeException {
505 // XXX consider adding HgDataDile.compare(File/byte[]/whatever) operation to optimize comparison 506 // XXX consider adding HgDataDile.compare(File/byte[]/whatever) operation to optimize comparison
506 ByteArrayChannel bac = new ByteArrayChannel(); 507 ByteArrayChannel bac = new ByteArrayChannel();
507 try { 508 try {
508 int fileRevisionIndex = dataFile.getRevisionIndex(revision); 509 int fileRevisionIndex = dataFile.getRevisionIndex(revision);
509 // need content with metadata striped off - although theoretically chances are metadata may be different, 510 // need content with metadata striped off - although theoretically chances are metadata may be different,
586 repo.getSessionContext().getLog().dump(getClass(), Warn, ex, "Unexpected cancellation"); 587 repo.getSessionContext().getLog().dump(getClass(), Warn, ex, "Unexpected cancellation");
587 return check.ultimatelyTheSame(); 588 return check.ultimatelyTheSame();
588 } catch (IOException ex) { 589 } catch (IOException ex) {
589 throw new HgInvalidFileException("File comparison failed", ex).setFileName(p); 590 throw new HgInvalidFileException("File comparison failed", ex).setFileName(p);
590 } finally { 591 } finally {
591 if (is != null) { 592 new FileUtils(repo.getSessionContext().getLog()).closeQuietly(is);
592 try {
593 is.close();
594 } catch (IOException ex) {
595 repo.getSessionContext().getLog().dump(getClass(), Info, ex, null);
596 }
597 }
598 } 593 }
599 } 594 }
600 595
601 /** 596 /**
602 * @return <code>true</code> if flags are the same 597 * @return <code>true</code> if flags are the same