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(); |
