Mercurial > hg4j
comparison src/org/tmatesoft/hg/repo/HgStatusCollector.java @ 302:a7a3395a519e
Walk explicit revisions to avoid troubles with unnatural repositories
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Sat, 17 Sep 2011 14:01:31 +0200 |
parents | 6dbbc53fc46d |
children | 2ffcbf360fd5 |
comparison
equal
deleted
inserted
replaced
301:88c58edc0857 | 302:a7a3395a519e |
---|---|
98 } | 98 } |
99 } | 99 } |
100 | 100 |
101 private void initCacheRange(int minRev, int maxRev) { | 101 private void initCacheRange(int minRev, int maxRev) { |
102 ensureCacheSize(); | 102 ensureCacheSize(); |
103 repo.getManifest().walk(minRev, maxRev, new HgManifest.Inspector2() { | 103 // In fact, walk(minRev, maxRev) doesn't imply |
104 // there would be maxRev-minRev+1 revisions visited. For example, | |
105 // check cpython repo with 'hg log -r 22418:22420 --debug' and admire | |
106 // manifest revisions 66650, 21683, 21684. Thus, innocent walk(22418,22420) results in 40k+ revisions and OOME | |
107 // Instead, be explicit of what revisions are of interest | |
108 assert minRev <= maxRev; | |
109 if (maxRev == 22420) { | |
110 System.out.println(); | |
111 } | |
112 int[] revisionsToCollect = new int[maxRev - minRev + 1]; | |
113 for (int x = minRev, i = 0; x <= maxRev; i++, x++) { | |
114 revisionsToCollect[i] = x; | |
115 } | |
116 repo.getManifest().walk(new HgManifest.Inspector2() { | |
104 private ManifestRevision delegate; | 117 private ManifestRevision delegate; |
105 private boolean cacheHit; // range may include revisions we already know about, do not re-create them | 118 private boolean cacheHit; // range may include revisions we already know about, do not re-create them |
106 | 119 |
107 public boolean begin(int manifestRevision, Nodeid nid, int changelogRevision) { | 120 public boolean begin(int manifestRevision, Nodeid nid, int changelogRevision) { |
108 assert delegate == null; | 121 assert delegate == null; |
135 } | 148 } |
136 cacheHit = false; | 149 cacheHit = false; |
137 delegate = null; | 150 delegate = null; |
138 return true; | 151 return true; |
139 } | 152 } |
140 }); | 153 }, revisionsToCollect); |
141 } | 154 } |
142 | 155 |
143 /*package-local*/ static ManifestRevision createEmptyManifestRevision() { | 156 /*package-local*/ static ManifestRevision createEmptyManifestRevision() { |
144 ManifestRevision fakeEmptyRev = new ManifestRevision(null, null); | 157 ManifestRevision fakeEmptyRev = new ManifestRevision(null, null); |
145 fakeEmptyRev.begin(-1, null, -1); | 158 fakeEmptyRev.begin(-1, null, -1); |