Mercurial > hg4j
comparison src/org/tmatesoft/hg/repo/HgBundle.java @ 182:f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 12 Apr 2011 19:36:18 +0200 |
parents | 71ddbf8603e8 |
children | 44a34baabea0 |
comparison
equal
deleted
inserted
replaced
181:cd3371670f0b | 182:f26ffe04ced0 |
---|---|
73 } | 73 } |
74 } | 74 } |
75 return da; | 75 return da; |
76 } | 76 } |
77 | 77 |
78 // shows changes recorded in the bundle that are missing from the supplied repository | 78 /** |
79 public void changes(final HgRepository hgRepo) throws HgException, IOException { | 79 * Get changes recorded in the bundle that are missing from the supplied repository. |
80 Inspector insp = new Inspector() { | 80 * @param hgRepo repository that shall possess base revision for this bundle |
81 * @param inspector callback to get each changeset found | |
82 */ | |
83 public void changes(final HgRepository hgRepo, final HgChangelog.Inspector inspector) throws HgException, IOException { | |
84 Inspector bundleInsp = new Inspector() { | |
81 DigestHelper dh = new DigestHelper(); | 85 DigestHelper dh = new DigestHelper(); |
82 boolean emptyChangelog = true; | 86 boolean emptyChangelog = true; |
83 private DataAccess prevRevContent; | 87 private DataAccess prevRevContent; |
88 private int revisionIndex; | |
84 | 89 |
85 public void changelogStart() { | 90 public void changelogStart() { |
86 emptyChangelog = true; | 91 emptyChangelog = true; |
87 | 92 revisionIndex = 0; |
88 } | 93 } |
89 | 94 |
90 public void changelogEnd() { | 95 public void changelogEnd() { |
91 if (emptyChangelog) { | 96 if (emptyChangelog) { |
92 throw new IllegalStateException("No changelog group in the bundle"); // XXX perhaps, just be silent and/or log? | 97 throw new IllegalStateException("No changelog group in the bundle"); // XXX perhaps, just be silent and/or log? |
139 dh = dh.sha1(ge.firstParent(), ge.secondParent(), csetContent); // XXX ge may give me access to byte[] content of nodeid directly, perhaps, I don't need DH to be friend of Nodeid? | 144 dh = dh.sha1(ge.firstParent(), ge.secondParent(), csetContent); // XXX ge may give me access to byte[] content of nodeid directly, perhaps, I don't need DH to be friend of Nodeid? |
140 if (!ge.node().equalsTo(dh.asBinary())) { | 145 if (!ge.node().equalsTo(dh.asBinary())) { |
141 throw new IllegalStateException("Integrity check failed on " + bundleFile + ", node:" + ge.node()); | 146 throw new IllegalStateException("Integrity check failed on " + bundleFile + ", node:" + ge.node()); |
142 } | 147 } |
143 ByteArrayDataAccess csetDataAccess = new ByteArrayDataAccess(csetContent); | 148 ByteArrayDataAccess csetDataAccess = new ByteArrayDataAccess(csetContent); |
144 if (changelog.isKnown(ge.node())) { | |
145 System.out.print("+"); | |
146 } else { | |
147 System.out.print("-"); | |
148 } | |
149 RawChangeset cs = RawChangeset.parse(csetDataAccess); | 149 RawChangeset cs = RawChangeset.parse(csetDataAccess); |
150 System.out.println(cs.toString()); | 150 inspector.next(revisionIndex++, ge.node(), cs); |
151 prevRevContent.done(); | 151 prevRevContent.done(); |
152 prevRevContent = csetDataAccess.reset(); | 152 prevRevContent = csetDataAccess.reset(); |
153 } catch (CancelledException ex) { | 153 } catch (CancelledException ex) { |
154 return false; | 154 return false; |
155 } catch (Exception ex) { | 155 } catch (Exception ex) { |
162 public void manifestEnd() {} | 162 public void manifestEnd() {} |
163 public void fileStart(String name) {} | 163 public void fileStart(String name) {} |
164 public void fileEnd(String name) {} | 164 public void fileEnd(String name) {} |
165 | 165 |
166 }; | 166 }; |
167 inspectChangelog(insp); | 167 inspectChangelog(bundleInsp); |
168 } | 168 } |
169 | 169 |
170 public void dump() throws IOException { | 170 public void dump() throws IOException { |
171 Dump dump = new Dump(); | 171 Dump dump = new Dump(); |
172 inspectAll(dump); | 172 inspectAll(dump); |
237 if (inspector == null) { | 237 if (inspector == null) { |
238 throw new IllegalArgumentException(); | 238 throw new IllegalArgumentException(); |
239 } | 239 } |
240 DataAccess da = getDataStream(); | 240 DataAccess da = getDataStream(); |
241 try { | 241 try { |
242 if (da.isEmpty()) { | 242 internalInspectChangelog(da, inspector); |
243 return; | |
244 } | |
245 inspector.changelogStart(); | |
246 readGroup(da, inspector); | |
247 inspector.changelogEnd(); | |
248 } finally { | 243 } finally { |
249 da.done(); | 244 da.done(); |
250 } | 245 } |
251 } | 246 } |
252 | 247 |
258 try { | 253 try { |
259 if (da.isEmpty()) { | 254 if (da.isEmpty()) { |
260 return; | 255 return; |
261 } | 256 } |
262 skipGroup(da); // changelog | 257 skipGroup(da); // changelog |
263 if (!da.isEmpty()) { | 258 internalInspectManifest(da, inspector); |
264 inspector.manifestStart(); | |
265 readGroup(da, inspector); | |
266 inspector.manifestEnd(); | |
267 } | |
268 } finally { | 259 } finally { |
269 da.done(); | 260 da.done(); |
270 } | 261 } |
271 } | 262 } |
272 | 263 |
273 public void inspectFiles(Inspector inspector) throws IOException { | 264 public void inspectFiles(Inspector inspector) throws IOException { |
274 if (inspector == null) { | |
275 throw new IllegalArgumentException(); | |
276 } | |
277 DataAccess da = getDataStream(); | |
278 try { | |
279 if (!da.isEmpty()) { | |
280 skipGroup(da); // changelog | |
281 } | |
282 if (!da.isEmpty()) { | |
283 skipGroup(da); // manifest | |
284 } | |
285 while (!da.isEmpty()) { | |
286 int fnameLen = da.readInt(); | |
287 if (fnameLen <= 4) { | |
288 break; // null chunk, the last one. | |
289 } | |
290 byte[] nameBuf = new byte[fnameLen - 4]; | |
291 da.readBytes(nameBuf, 0, nameBuf.length); | |
292 String fname = new String(nameBuf); | |
293 inspector.fileStart(fname); | |
294 readGroup(da, inspector); | |
295 inspector.fileEnd(fname); | |
296 } | |
297 } finally { | |
298 da.done(); | |
299 } | |
300 } | |
301 | |
302 public void inspectAll(Inspector inspector) throws IOException { | |
303 if (inspector == null) { | 265 if (inspector == null) { |
304 throw new IllegalArgumentException(); | 266 throw new IllegalArgumentException(); |
305 } | 267 } |
306 DataAccess da = getDataStream(); | 268 DataAccess da = getDataStream(); |
307 try { | 269 try { |
308 if (da.isEmpty()) { | 270 if (da.isEmpty()) { |
309 return; | 271 return; |
310 } | 272 } |
311 inspector.changelogStart(); | 273 skipGroup(da); // changelog |
312 readGroup(da, inspector); | |
313 inspector.changelogEnd(); | |
314 // | |
315 if (da.isEmpty()) { | 274 if (da.isEmpty()) { |
316 return; | 275 return; |
317 } | 276 } |
318 inspector.manifestStart(); | 277 skipGroup(da); // manifest |
319 readGroup(da, inspector); | 278 internalInspectFiles(da, inspector); |
320 inspector.manifestEnd(); | |
321 // | |
322 while (!da.isEmpty()) { | |
323 int fnameLen = da.readInt(); | |
324 if (fnameLen <= 4) { | |
325 break; // null chunk, the last one. | |
326 } | |
327 byte[] fnameBuf = new byte[fnameLen - 4]; | |
328 da.readBytes(fnameBuf, 0, fnameBuf.length); | |
329 String name = new String(fnameBuf); | |
330 inspector.fileStart(name); | |
331 readGroup(da, inspector); | |
332 inspector.fileEnd(name); | |
333 } | |
334 } finally { | 279 } finally { |
335 da.done(); | 280 da.done(); |
281 } | |
282 } | |
283 | |
284 public void inspectAll(Inspector inspector) throws IOException { | |
285 if (inspector == null) { | |
286 throw new IllegalArgumentException(); | |
287 } | |
288 DataAccess da = getDataStream(); | |
289 try { | |
290 internalInspectChangelog(da, inspector); | |
291 internalInspectManifest(da, inspector); | |
292 internalInspectFiles(da, inspector); | |
293 } finally { | |
294 da.done(); | |
295 } | |
296 } | |
297 | |
298 private void internalInspectChangelog(DataAccess da, Inspector inspector) throws IOException { | |
299 if (da.isEmpty()) { | |
300 return; | |
301 } | |
302 inspector.changelogStart(); | |
303 readGroup(da, inspector); | |
304 inspector.changelogEnd(); | |
305 } | |
306 | |
307 private void internalInspectManifest(DataAccess da, Inspector inspector) throws IOException { | |
308 if (da.isEmpty()) { | |
309 return; | |
310 } | |
311 inspector.manifestStart(); | |
312 readGroup(da, inspector); | |
313 inspector.manifestEnd(); | |
314 } | |
315 | |
316 private void internalInspectFiles(DataAccess da, Inspector inspector) throws IOException { | |
317 while (!da.isEmpty()) { | |
318 int fnameLen = da.readInt(); | |
319 if (fnameLen <= 4) { | |
320 break; // null chunk, the last one. | |
321 } | |
322 byte[] fnameBuf = new byte[fnameLen - 4]; | |
323 da.readBytes(fnameBuf, 0, fnameBuf.length); | |
324 String name = new String(fnameBuf); | |
325 inspector.fileStart(name); | |
326 readGroup(da, inspector); | |
327 inspector.fileEnd(name); | |
336 } | 328 } |
337 } | 329 } |
338 | 330 |
339 private static void readGroup(DataAccess da, Inspector inspector) throws IOException { | 331 private static void readGroup(DataAccess da, Inspector inspector) throws IOException { |
340 int len = da.readInt(); | 332 int len = da.readInt(); |