Mercurial > hg4j
comparison src/com/tmate/hgkit/ll/WorkingCopyStatusCollector.java @ 59:b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 18 Jan 2011 00:08:15 +0100 |
parents | 4cfc47bc14cc |
children | a47530a2ea12 |
comparison
equal
deleted
inserted
replaced
58:4cfc47bc14cc | 59:b771e94a4f7c |
---|---|
21 */ | 21 */ |
22 public class WorkingCopyStatusCollector { | 22 public class WorkingCopyStatusCollector { |
23 | 23 |
24 private final HgRepository repo; | 24 private final HgRepository repo; |
25 private final FileWalker repoWalker; | 25 private final FileWalker repoWalker; |
26 private HgDirstate dirstate; | |
27 private StatusCollector baseRevisionCollector; | |
26 | 28 |
27 public WorkingCopyStatusCollector(HgRepository hgRepo, FileWalker hgRepoWalker) { | 29 public WorkingCopyStatusCollector(HgRepository hgRepo, FileWalker hgRepoWalker) { |
28 this.repo = hgRepo; | 30 this.repo = hgRepo; |
29 this.repoWalker = hgRepoWalker; | 31 this.repoWalker = hgRepoWalker; |
30 } | 32 } |
31 | 33 |
34 /** | |
35 * Optionally, supply a collector instance that may cache (or have already cached) base revision | |
36 * @param sc may be null | |
37 */ | |
38 public void setBseRevisionCollector(StatusCollector sc) { | |
39 baseRevisionCollector = sc; | |
40 } | |
41 | |
42 private HgDirstate getDirstate() { | |
43 if (dirstate == null) { | |
44 if (repo instanceof LocalHgRepo) { | |
45 dirstate = ((LocalHgRepo) repo).loadDirstate(); | |
46 } else { | |
47 dirstate = new HgDirstate(); | |
48 } | |
49 } | |
50 return dirstate; | |
51 } | |
52 | |
53 // may be invoked few times | |
32 public void walk(int baseRevision, StatusCollector.Inspector inspector) { | 54 public void walk(int baseRevision, StatusCollector.Inspector inspector) { |
33 final HgIgnore hgIgnore = ((LocalHgRepo) repo).loadIgnore(); // FIXME hack | 55 final HgIgnore hgIgnore = ((LocalHgRepo) repo).loadIgnore(); // FIXME hack |
34 final HgDirstate dirstate = ((LocalHgRepo) repo).loadDirstate(); // FIXME hack | 56 TreeSet<String> knownEntries = getDirstate().all(); |
35 TreeSet<String> knownEntries = dirstate.all(); | |
36 final boolean isTipBase = baseRevision == TIP || baseRevision == repo.getManifest().getRevisionCount(); | 57 final boolean isTipBase = baseRevision == TIP || baseRevision == repo.getManifest().getRevisionCount(); |
37 StatusCollector.ManifestRevisionInspector collect = null; | 58 StatusCollector.ManifestRevisionInspector collect = null; |
38 Set<String> baseRevFiles = Collections.emptySet(); | 59 Set<String> baseRevFiles = Collections.emptySet(); |
39 if (!isTipBase) { | 60 if (!isTipBase) { |
40 collect = new StatusCollector.ManifestRevisionInspector(baseRevision, baseRevision); | 61 if (baseRevisionCollector != null) { |
41 repo.getManifest().walk(baseRevision, baseRevision, collect); | 62 collect = baseRevisionCollector.raw(baseRevision); |
63 } else { | |
64 collect = new StatusCollector.ManifestRevisionInspector(baseRevision, baseRevision); | |
65 repo.getManifest().walk(baseRevision, baseRevision, collect); | |
66 } | |
42 baseRevFiles = new TreeSet<String>(collect.files(baseRevision)); | 67 baseRevFiles = new TreeSet<String>(collect.files(baseRevision)); |
43 } | 68 } |
44 repoWalker.reset(); | 69 repoWalker.reset(); |
45 while (repoWalker.hasNext()) { | 70 while (repoWalker.hasNext()) { |
46 repoWalker.next(); | 71 repoWalker.next(); |
51 } else if (knownEntries.remove(fname)) { | 76 } else if (knownEntries.remove(fname)) { |
52 // modified, added, removed, clean | 77 // modified, added, removed, clean |
53 if (collect != null) { // need to check against base revision, not FS file | 78 if (collect != null) { // need to check against base revision, not FS file |
54 Nodeid nid1 = collect.nodeid(baseRevision, fname); | 79 Nodeid nid1 = collect.nodeid(baseRevision, fname); |
55 String flags = collect.flags(baseRevision, fname); | 80 String flags = collect.flags(baseRevision, fname); |
56 checkLocalStatusAgainstBaseRevision(baseRevFiles, nid1, flags, fname, f, dirstate, inspector); | 81 checkLocalStatusAgainstBaseRevision(baseRevFiles, nid1, flags, fname, f, inspector); |
57 baseRevFiles.remove(fname); | 82 baseRevFiles.remove(fname); |
58 } else { | 83 } else { |
59 checkLocalStatusAgainstFile(fname, f, dirstate, inspector); | 84 checkLocalStatusAgainstFile(fname, f, inspector); |
60 } | 85 } |
61 } else { | 86 } else { |
62 inspector.unknown(fname); | 87 inspector.unknown(fname); |
63 } | 88 } |
64 } | 89 } |
67 inspector.removed(r); | 92 inspector.removed(r); |
68 } | 93 } |
69 } | 94 } |
70 for (String m : knownEntries) { | 95 for (String m : knownEntries) { |
71 // removed from the repository and missing from working dir shall not be reported as 'deleted' | 96 // removed from the repository and missing from working dir shall not be reported as 'deleted' |
72 if (dirstate.checkRemoved(m) == null) { | 97 if (getDirstate().checkRemoved(m) == null) { |
73 inspector.missing(m); | 98 inspector.missing(m); |
74 } | 99 } |
75 } | 100 } |
76 } | 101 } |
77 | 102 |
82 } | 107 } |
83 | 108 |
84 //******************************************** | 109 //******************************************** |
85 | 110 |
86 | 111 |
87 private static void checkLocalStatusAgainstFile(String fname, File f, HgDirstate dirstate, StatusCollector.Inspector inspector) { | 112 private void checkLocalStatusAgainstFile(String fname, File f, StatusCollector.Inspector inspector) { |
88 HgDirstate.Record r; | 113 HgDirstate.Record r; |
89 if ((r = dirstate.checkNormal(fname)) != null) { | 114 if ((r = getDirstate().checkNormal(fname)) != null) { |
90 // either clean or modified | 115 // either clean or modified |
91 if (f.lastModified() / 1000 == r.time && r.size == f.length()) { | 116 if (f.lastModified() / 1000 == r.time && r.size == f.length()) { |
92 inspector.clean(fname); | 117 inspector.clean(fname); |
93 } else { | 118 } else { |
94 // FIXME check actual content to avoid false modified files | 119 // FIXME check actual content to avoid false modified files |
95 inspector.modified(fname); | 120 inspector.modified(fname); |
96 } | 121 } |
97 } else if ((r = dirstate.checkAdded(fname)) != null) { | 122 } else if ((r = getDirstate().checkAdded(fname)) != null) { |
98 if (r.name2 == null) { | 123 if (r.name2 == null) { |
99 inspector.added(fname); | 124 inspector.added(fname); |
100 } else { | 125 } else { |
101 inspector.copied(fname, r.name2); | 126 inspector.copied(fname, r.name2); |
102 } | 127 } |
103 } else if ((r = dirstate.checkRemoved(fname)) != null) { | 128 } else if ((r = getDirstate().checkRemoved(fname)) != null) { |
104 inspector.removed(fname); | 129 inspector.removed(fname); |
105 } else if ((r = dirstate.checkMerged(fname)) != null) { | 130 } else if ((r = getDirstate().checkMerged(fname)) != null) { |
106 inspector.modified(fname); | 131 inspector.modified(fname); |
107 } | 132 } |
108 } | 133 } |
109 | 134 |
110 // XXX refactor checkLocalStatus methods in more OO way | 135 // XXX refactor checkLocalStatus methods in more OO way |
111 private void checkLocalStatusAgainstBaseRevision(Set<String> baseRevNames, Nodeid nid1, String flags, String fname, File f, HgDirstate dirstate, StatusCollector.Inspector inspector) { | 136 private void checkLocalStatusAgainstBaseRevision(Set<String> baseRevNames, Nodeid nid1, String flags, String fname, File f, StatusCollector.Inspector inspector) { |
112 // fname is in the dirstate, either Normal, Added, Removed or Merged | 137 // fname is in the dirstate, either Normal, Added, Removed or Merged |
113 HgDirstate.Record r; | 138 HgDirstate.Record r; |
114 if (nid1 == null) { | 139 if (nid1 == null) { |
115 // normal: added? | 140 // normal: added? |
116 // added: not known at the time of baseRevision, shall report | 141 // added: not known at the time of baseRevision, shall report |
117 // merged: was not known, report as added? | 142 // merged: was not known, report as added? |
118 if ((r = dirstate.checkAdded(fname)) != null) { | 143 if ((r = getDirstate().checkAdded(fname)) != null) { |
119 if (r.name2 != null && baseRevNames.contains(r.name2)) { | 144 if (r.name2 != null && baseRevNames.contains(r.name2)) { |
120 baseRevNames.remove(r.name2); | 145 baseRevNames.remove(r.name2); |
121 inspector.copied(r.name2, fname); | 146 inspector.copied(r.name2, fname); |
122 return; | 147 return; |
123 } | 148 } |
124 // fall-through, report as added | 149 // fall-through, report as added |
125 } else if (dirstate.checkRemoved(fname) != null) { | 150 } else if (getDirstate().checkRemoved(fname) != null) { |
126 // removed: removed file was not known at the time of baseRevision, and we should not report it as removed | 151 // removed: removed file was not known at the time of baseRevision, and we should not report it as removed |
127 return; | 152 return; |
128 } | 153 } |
129 inspector.added(fname); | 154 inspector.added(fname); |
130 } else { | 155 } else { |
131 // was known; check whether clean or modified | 156 // was known; check whether clean or modified |
132 // when added - seems to be the case of a file added once again, hence need to check if content is different | 157 // when added - seems to be the case of a file added once again, hence need to check if content is different |
133 if ((r = dirstate.checkNormal(fname)) != null || (r = dirstate.checkMerged(fname)) != null || (r = dirstate.checkAdded(fname)) != null) { | 158 if ((r = getDirstate().checkNormal(fname)) != null || (r = getDirstate().checkMerged(fname)) != null || (r = getDirstate().checkAdded(fname)) != null) { |
134 // either clean or modified | 159 // either clean or modified |
135 HgDataFile fileNode = repo.getFileNode(fname); | 160 HgDataFile fileNode = repo.getFileNode(fname); |
136 final int lengthAtRevision = fileNode.length(nid1); | 161 final int lengthAtRevision = fileNode.length(nid1); |
137 if (r.size /* XXX File.length() ?! */ != lengthAtRevision || flags != todoGenerateFlags(fname /*java.io.File*/)) { | 162 if (r.size /* XXX File.length() ?! */ != lengthAtRevision || flags != todoGenerateFlags(fname /*java.io.File*/)) { |
138 inspector.modified(fname); | 163 inspector.modified(fname); |