Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/Revlog.java @ 607:66f1cc23b906
Refresh revlogs if a change to a file has been detected; do not force reload of the whole repository
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Tue, 07 May 2013 16:52:46 +0200 |
| parents | c3505001a42a |
| children | e1b29756f901 |
comparison
equal
deleted
inserted
replaced
| 606:5daa42067e7c | 607:66f1cc23b906 |
|---|---|
| 54 | 54 |
| 55 private final HgRepository repo; | 55 private final HgRepository repo; |
| 56 protected final RevlogStream content; | 56 protected final RevlogStream content; |
| 57 protected final boolean useRevisionLookup; | 57 protected final boolean useRevisionLookup; |
| 58 protected RevisionLookup revisionLookup; | 58 protected RevisionLookup revisionLookup; |
| 59 private final RevlogStream.Observer revisionLookupCleaner; | |
| 59 | 60 |
| 60 protected Revlog(HgRepository hgRepo, RevlogStream contentStream, boolean needRevisionLookup) { | 61 protected Revlog(HgRepository hgRepo, RevlogStream contentStream, boolean needRevisionLookup) { |
| 61 if (hgRepo == null) { | 62 if (hgRepo == null) { |
| 62 throw new IllegalArgumentException(); | 63 throw new IllegalArgumentException(); |
| 63 } | 64 } |
| 65 throw new IllegalArgumentException(); | 66 throw new IllegalArgumentException(); |
| 66 } | 67 } |
| 67 repo = hgRepo; | 68 repo = hgRepo; |
| 68 content = contentStream; | 69 content = contentStream; |
| 69 useRevisionLookup = needRevisionLookup; | 70 useRevisionLookup = needRevisionLookup; |
| 71 if (needRevisionLookup) { | |
| 72 revisionLookupCleaner = new RevlogStream.Observer() { | |
| 73 | |
| 74 public void reloaded(RevlogStream src) { | |
| 75 revisionLookup = null; | |
| 76 } | |
| 77 }; | |
| 78 } else { | |
| 79 revisionLookupCleaner = null; | |
| 80 } | |
| 70 } | 81 } |
| 71 | 82 |
| 72 // invalid Revlog | 83 // invalid Revlog |
| 73 protected Revlog(HgRepository hgRepo) { | 84 protected Revlog(HgRepository hgRepo) { |
| 74 repo = hgRepo; | 85 repo = hgRepo; |
| 75 content = null; | 86 content = null; |
| 76 useRevisionLookup = false; | 87 useRevisionLookup = false; |
| 88 revisionLookupCleaner = null; | |
| 77 } | 89 } |
| 78 | 90 |
| 79 public final HgRepository getRepo() { | 91 public final HgRepository getRepo() { |
| 80 return repo; | 92 return repo; |
| 81 } | 93 } |
| 160 return revision; | 172 return revision; |
| 161 } | 173 } |
| 162 | 174 |
| 163 private int doFindWithCache(Nodeid nid) { | 175 private int doFindWithCache(Nodeid nid) { |
| 164 if (useRevisionLookup) { | 176 if (useRevisionLookup) { |
| 165 if (revisionLookup == null) { | 177 if (revisionLookup == null || content.shallDropDerivedCaches()) { |
| 166 revisionLookup = RevisionLookup.createFor(content); | 178 content.detach(revisionLookupCleaner); |
| 179 setRevisionLookup(RevisionLookup.createFor(content)); | |
| 167 } | 180 } |
| 168 return revisionLookup.findIndex(nid); | 181 return revisionLookup.findIndex(nid); |
| 169 } else { | 182 } else { |
| 170 return content.findRevisionIndex(nid); | 183 return content.findRevisionIndex(nid); |
| 171 } | 184 } |
| 185 } | |
| 186 | |
| 187 /** | |
| 188 * use selected helper for revision lookup, register appropriate listeners to clear cache on revlog changes | |
| 189 * @param rl not <code>null</code> | |
| 190 */ | |
| 191 protected void setRevisionLookup(RevisionLookup rl) { | |
| 192 assert rl != null; | |
| 193 revisionLookup = rl; | |
| 194 content.attach(revisionLookupCleaner); | |
| 172 } | 195 } |
| 173 | 196 |
| 174 /** | 197 /** |
| 175 * Note, {@link Nodeid#NULL} nodeid is not reported as known in any revlog. | 198 * Note, {@link Nodeid#NULL} nodeid is not reported as known in any revlog. |
| 176 * | 199 * |
