Mercurial > jhg
annotate src/org/tmatesoft/hg/repo/HgBundle.java @ 611:7fc7fba4df30
Tests for tailored sections in HgRepoConfig
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 09 May 2013 21:52:01 +0200 | 
| parents | 5daa42067e7c | 
| children | 6526d8adbc0f | 
| rev | line source | 
|---|---|
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
1 /* | 
| 
532
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
2 * Copyright (c) 2011-2013 TMate Software Ltd | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
3 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
4 * This program is free software; you can redistribute it and/or modify | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
5 * it under the terms of the GNU General Public License as published by | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
6 * the Free Software Foundation; version 2 of the License. | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
7 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
8 * This program is distributed in the hope that it will be useful, | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
11 * GNU General Public License for more details. | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
12 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
13 * For information on how to redistribute this software under | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
14 * the terms of a license other than GNU General Public License | 
| 
102
 
a3a2e5deb320
Updated contact address to support@hg4j.com
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
15 * contact TMate Software at support@hg4j.com | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
16 */ | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
17 package org.tmatesoft.hg.repo; | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
18 | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
19 import java.io.File; | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
20 import java.io.IOException; | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
21 import java.util.ConcurrentModificationException; | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
22 | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
23 import org.tmatesoft.hg.core.Nodeid; | 
| 
357
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
24 import org.tmatesoft.hg.core.SessionContext; | 
| 
157
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
diff
changeset
 | 
25 import org.tmatesoft.hg.internal.ByteArrayChannel; | 
| 
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
diff
changeset
 | 
26 import org.tmatesoft.hg.internal.ByteArrayDataAccess; | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
27 import org.tmatesoft.hg.internal.Callback; | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
28 import org.tmatesoft.hg.internal.DataAccess; | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
29 import org.tmatesoft.hg.internal.DataAccessProvider; | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
30 import org.tmatesoft.hg.internal.DigestHelper; | 
| 
358
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
31 import org.tmatesoft.hg.internal.Experimental; | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
32 import org.tmatesoft.hg.internal.InflaterDataAccess; | 
| 
526
 
2f9ed6bcefa2
Initial support for Revert command with accompanying minor refactoring
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
513 
diff
changeset
 | 
33 import org.tmatesoft.hg.internal.Internals; | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
34 import org.tmatesoft.hg.internal.Lifecycle; | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
295 
diff
changeset
 | 
35 import org.tmatesoft.hg.internal.Patch; | 
| 
154
 
ba2bf656f00f
Changeset => RawChangeset
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
129 
diff
changeset
 | 
36 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
37 import org.tmatesoft.hg.util.Adaptable; | 
| 
157
 
d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
diff
changeset
 | 
38 import org.tmatesoft.hg.util.CancelledException; | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
39 | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
40 /** | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
41 * WORK IN PROGRESS | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
42 * | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
43 * @see http://mercurial.selenic.com/wiki/BundleFormat | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
44 * | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
45 * @author Artem Tikhomirov | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
47 
diff
changeset
 | 
46 * @author TMate Software Ltd. | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
47 */ | 
| 
467
 
51d682cf9cdc
Cleaned experimental tag and updated comments/javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
427 
diff
changeset
 | 
48 @Experimental(reason="API is not stable") | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
49 public class HgBundle { | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
50 | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
51 private final File bundleFile; | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
52 private final DataAccessProvider accessProvider; | 
| 
357
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
53 // private final SessionContext sessionContext; | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
54 private Lifecycle.BasicCallback flowControl; | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
55 | 
| 
357
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
56 HgBundle(SessionContext ctx, DataAccessProvider dap, File bundle) { | 
| 
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
57 // sessionContext = ctx; | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
58 accessProvider = dap; | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
59 bundleFile = bundle; | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
60 } | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
61 | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
62 private DataAccess getDataStream() throws IOException { | 
| 
606
 
5daa42067e7c
Avoid mmap files when only few bytes are to be read
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
534 
diff
changeset
 | 
63 DataAccess da = accessProvider.createReader(bundleFile, false); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
64 byte[] signature = new byte[6]; | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
65 if (da.length() > 6) { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
66 da.readBytes(signature, 0, 6); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
67 if (signature[0] == 'H' && signature[1] == 'G' && signature[2] == '1' && signature[3] == '0') { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
68 if (signature[4] == 'G' && signature[5] == 'Z') { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
69 return new InflaterDataAccess(da, 6, da.length() - 6); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
70 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
71 if (signature[4] == 'B' && signature[5] == 'Z') { | 
| 
526
 
2f9ed6bcefa2
Initial support for Revert command with accompanying minor refactoring
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
513 
diff
changeset
 | 
72 throw Internals.notImplemented(); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
73 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
74 if (signature[4] != 'U' || signature[5] != 'N') { | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
75 throw new HgInvalidStateException(String.format("Bad bundle signature: %s", String.valueOf(signature))); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
76 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
77 // "...UN", fall-through | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
78 } else { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
79 da.reset(); | 
| 
39
 
4e9b66b07a28
Check changelog group starts with proper (known) base
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
37 
diff
changeset
 | 
80 } | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
81 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
82 return da; | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
83 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
84 | 
| 
186
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
85 private int uses = 0; | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
86 public HgBundle link() { | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
87 uses++; | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
88 return this; | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
89 } | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
90 public void unlink() { | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
91 uses--; | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
92 if (uses == 0 && bundleFile != null) { | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
93 bundleFile.deleteOnExit(); | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
94 } | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
95 } | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
96 public boolean inUse() { | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
97 return uses > 0; | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
98 } | 
| 
 
44a34baabea0
Clone refactored into a command. HgBundle needs means to control its lifecycle, to be deleted when no longer needed
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
182 
diff
changeset
 | 
99 | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
100 /** | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
101 * Get changes recorded in the bundle that are missing from the supplied repository. | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
102 * @param hgRepo repository that shall possess base revision for this bundle | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
103 * @param inspector callback to get each changeset found | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
104 */ | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
105 public void changes(final HgRepository hgRepo, final HgChangelog.Inspector inspector) throws HgRuntimeException { | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
106 Inspector bundleInsp = new Inspector() { | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
107 DigestHelper dh = new DigestHelper(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
108 boolean emptyChangelog = true; | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
109 private DataAccess prevRevContent; | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
110 private int revisionIndex; | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
111 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
112 public void changelogStart() { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
113 emptyChangelog = true; | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
114 revisionIndex = 0; | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
115 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
116 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
117 public void changelogEnd() { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
118 if (emptyChangelog) { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
119 throw new IllegalStateException("No changelog group in the bundle"); // XXX perhaps, just be silent and/or log? | 
| 
42
 
92c3d0920d58
Real integrity check, with exception. DigestHelper refactored to accomodate new needs
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
41 
diff
changeset
 | 
120 } | 
| 
37
 
e45e75e22523
Parse changesets from bundle's changelog group. Refactor Revlog to provide access to revision's raw content
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
36 
diff
changeset
 | 
121 } | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
122 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
123 /* | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
124 * Despite that BundleFormat wiki says: "Each Changelog entry patches the result of all previous patches | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
125 * (the previous, or parent patch of a given patch p is the patch that has a node equal to p's p1 field)", | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
126 * it seems not to hold true. Instead, each entry patches previous one, regardless of whether the one | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
127 * before is its parent (i.e. ge.firstParent()) or not. | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
128 * | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
129 Actual state in the changelog.i | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
130 Index Offset Flags Packed Actual Base Rev Link Rev Parent1 Parent2 nodeid | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
131 50: 9212 0 209 329 48 50 49 -1 f1db8610da62a3e0beb8d360556ee1fd6eb9885e | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
132 51: 9421 0 278 688 48 51 50 -1 9429c7bd1920fab164a9d2b621d38d57bcb49ae0 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
133 52: 9699 0 154 179 52 52 50 -1 30bd389788464287cee22ccff54c330a4b715de5 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
134 53: 9853 0 133 204 52 53 51 52 a6f39e595b2b54f56304470269a936ead77f5725 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
135 54: 9986 0 156 182 54 54 52 -1 fd4f2c98995beb051070630c272a9be87bef617d | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
136 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
137 Excerpt from bundle (nodeid, p1, p2, cs): | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
138 f1db8610da62a3e0beb8d360556ee1fd6eb9885e 26e3eeaa39623de552b45ee1f55c14f36460f220 0000000000000000000000000000000000000000 f1db8610da62a3e0beb8d360556ee1fd6eb9885e; patches:4 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
139 9429c7bd1920fab164a9d2b621d38d57bcb49ae0 f1db8610da62a3e0beb8d360556ee1fd6eb9885e 0000000000000000000000000000000000000000 9429c7bd1920fab164a9d2b621d38d57bcb49ae0; patches:3 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
140 > 30bd389788464287cee22ccff54c330a4b715de5 f1db8610da62a3e0beb8d360556ee1fd6eb9885e 0000000000000000000000000000000000000000 30bd389788464287cee22ccff54c330a4b715de5; patches:3 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
141 a6f39e595b2b54f56304470269a936ead77f5725 9429c7bd1920fab164a9d2b621d38d57bcb49ae0 30bd389788464287cee22ccff54c330a4b715de5 a6f39e595b2b54f56304470269a936ead77f5725; patches:3 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
142 fd4f2c98995beb051070630c272a9be87bef617d 30bd389788464287cee22ccff54c330a4b715de5 0000000000000000000000000000000000000000 fd4f2c98995beb051070630c272a9be87bef617d; patches:3 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
143 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
144 To recreate 30bd..e5, one have to take content of 9429..e0, not its p1 f1db..5e | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
145 */ | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
146 public boolean element(GroupElement ge) { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
147 emptyChangelog = false; | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
148 HgChangelog changelog = hgRepo.getChangelog(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
149 try { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
150 if (prevRevContent == null) { | 
| 
274
 
9fb50c04f03c
Use Nodeid.isNull check instead of NULL.equals
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
186 
diff
changeset
 | 
151 if (ge.firstParent().isNull() && ge.secondParent().isNull()) { | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
152 prevRevContent = new ByteArrayDataAccess(new byte[0]); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
153 } else { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
154 final Nodeid base = ge.firstParent(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
155 if (!changelog.isKnown(base) /*only first parent, that's Bundle contract*/) { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
156 throw new IllegalStateException(String.format("Revision %s needs a parent %s, which is missing in the supplied repo %s", ge.node().shortNotation(), base.shortNotation(), hgRepo.toString())); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
157 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
158 ByteArrayChannel bac = new ByteArrayChannel(); | 
| 
418
 
528b6780a8bd
A bit of FIXME cleanup (mostly degraded to TODO post 1.0), comments and javadoc
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
383 
diff
changeset
 | 
159 changelog.rawContent(base, bac); // TODO post-1.0 get DataAccess directly, to avoid | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
160 // extra byte[] (inside ByteArrayChannel) duplication just for the sake of subsequent ByteArrayDataChannel wrap. | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
161 prevRevContent = new ByteArrayDataAccess(bac.toArray()); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
162 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
163 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
164 // | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
165 byte[] csetContent = ge.apply(prevRevContent); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
166 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? | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
167 if (!ge.node().equalsTo(dh.asBinary())) { | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
168 throw new HgInvalidStateException(String.format("Integrity check failed on %s, node: %s", bundleFile, ge.node().shortNotation())); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
169 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
170 ByteArrayDataAccess csetDataAccess = new ByteArrayDataAccess(csetContent); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
171 RawChangeset cs = RawChangeset.parse(csetDataAccess); | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
172 inspector.next(revisionIndex++, ge.node(), cs); | 
| 
170
 
71ddbf8603e8
Initial clone: populate given directory from a bundle. Everything but remote server access is there, albeit prototype code style
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
169 
diff
changeset
 | 
173 prevRevContent.done(); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
174 prevRevContent = csetDataAccess.reset(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
175 } catch (CancelledException ex) { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
176 return false; | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
177 } catch (IOException ex) { | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
178 throw new HgInvalidFileException("Invalid bundle file", ex, bundleFile); // TODO post-1.0 revisit exception handling | 
| 
427
 
31a89587eb04
FIXMEs: consistent names, throws for commands and their handlers. Use of checked exceptions in hi-level api
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
423 
diff
changeset
 | 
179 } catch (HgInvalidDataFormatException ex) { | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
180 throw new HgInvalidControlFileException("Invalid bundle file", ex, bundleFile); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
181 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
182 return true; | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
183 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
184 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
185 public void manifestStart() {} | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
186 public void manifestEnd() {} | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
187 public void fileStart(String name) {} | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
188 public void fileEnd(String name) {} | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
189 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
190 }; | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
191 inspectChangelog(bundleInsp); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
192 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
193 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
194 // callback to minimize amount of Strings and Nodeids instantiated | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
195 @Callback | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
196 public interface Inspector { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
197 void changelogStart(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
198 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
199 void changelogEnd(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
200 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
201 void manifestStart(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
202 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
203 void manifestEnd(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
204 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
205 void fileStart(String name); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
206 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
207 void fileEnd(String name); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
208 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
209 /** | 
| 
170
 
71ddbf8603e8
Initial clone: populate given directory from a bundle. Everything but remote server access is there, albeit prototype code style
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
169 
diff
changeset
 | 
210 * XXX desperately need exceptions here | 
| 
 
71ddbf8603e8
Initial clone: populate given directory from a bundle. Everything but remote server access is there, albeit prototype code style
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
169 
diff
changeset
 | 
211 * @param element data element, instance might be reused, don't keep a reference to it or its raw data | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
212 * @return <code>true</code> to continue | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
213 */ | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
214 boolean element(GroupElement element); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
215 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
216 | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
217 /** | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
218 * @param inspector callback to visit changelog entries | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
219 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
220 * @throws IllegalArgumentException if inspector argument is null | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
221 */ | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
222 public void inspectChangelog(Inspector inspector) throws HgRuntimeException { | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
223 if (inspector == null) { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
224 throw new IllegalArgumentException(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
225 } | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
226 final Lifecycle lifecycle = lifecycleSetUp(inspector); | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
227 DataAccess da = null; | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
228 try { | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
229 da = getDataStream(); | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
230 internalInspectChangelog(da, inspector); | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
231 } catch (IOException ex) { | 
| 
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
232 throw new HgInvalidFileException("Bundle.inspectChangelog failed", ex, bundleFile); | 
| 
37
 
e45e75e22523
Parse changesets from bundle's changelog group. Refactor Revlog to provide access to revision's raw content
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
36 
diff
changeset
 | 
233 } finally { | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
234 if (da != null) { | 
| 
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
235 da.done(); | 
| 
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
236 } | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
237 lifecycleTearDown(lifecycle); | 
| 
37
 
e45e75e22523
Parse changesets from bundle's changelog group. Refactor Revlog to provide access to revision's raw content
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
36 
diff
changeset
 | 
238 } | 
| 
 
e45e75e22523
Parse changesets from bundle's changelog group. Refactor Revlog to provide access to revision's raw content
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
36 
diff
changeset
 | 
239 } | 
| 
 
e45e75e22523
Parse changesets from bundle's changelog group. Refactor Revlog to provide access to revision's raw content
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
36 
diff
changeset
 | 
240 | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
241 /** | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
242 * @param inspector callback to visit manifest entries | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
243 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
244 * @throws IllegalArgumentException if inspector argument is null | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
245 */ | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
246 public void inspectManifest(Inspector inspector) throws HgRuntimeException { | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
247 if (inspector == null) { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
248 throw new IllegalArgumentException(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
249 } | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
250 final Lifecycle lifecycle = lifecycleSetUp(inspector); | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
251 DataAccess da = null; | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
252 try { | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
253 da = getDataStream(); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
254 if (da.isEmpty()) { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
255 return; | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
256 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
257 skipGroup(da); // changelog | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
258 internalInspectManifest(da, inspector); | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
259 } catch (IOException ex) { | 
| 
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
260 throw new HgInvalidFileException("Bundle.inspectManifest failed", ex, bundleFile); | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
261 } finally { | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
262 if (da != null) { | 
| 
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
263 da.done(); | 
| 
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
264 } | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
265 lifecycleTearDown(lifecycle); | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
266 } | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
267 } | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
268 | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
269 /** | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
270 * @param inspector callback to visit file entries | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
271 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
272 * @throws IllegalArgumentException if inspector argument is null | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
273 */ | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
274 public void inspectFiles(Inspector inspector) throws HgRuntimeException { | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
275 if (inspector == null) { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
276 throw new IllegalArgumentException(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
277 } | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
278 final Lifecycle lifecycle = lifecycleSetUp(inspector); | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
279 DataAccess da = null; | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
280 try { | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
281 da = getDataStream(); | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
282 if (da.isEmpty()) { | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
283 return; | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
284 } | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
285 skipGroup(da); // changelog | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
286 if (da.isEmpty()) { | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
287 return; | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
288 } | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
289 skipGroup(da); // manifest | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
290 internalInspectFiles(da, inspector); | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
291 } catch (IOException ex) { | 
| 
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
292 throw new HgInvalidFileException("Bundle.inspectFiles failed", ex, bundleFile); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
293 } finally { | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
294 if (da != null) { | 
| 
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
295 da.done(); | 
| 
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
296 } | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
297 lifecycleTearDown(lifecycle); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
298 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
299 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
300 | 
| 
423
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
301 /** | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
302 * @param inspector visit complete bundle (changelog, manifest and file entries) | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
303 * @throws HgRuntimeException subclass thereof to indicate issues with the library. <em>Runtime exception</em> | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
304 * @throws IllegalArgumentException if inspector argument is null | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
305 */ | 
| 
 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
418 
diff
changeset
 | 
306 public void inspectAll(Inspector inspector) throws HgRuntimeException { | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
307 if (inspector == null) { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
308 throw new IllegalArgumentException(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
309 } | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
310 final Lifecycle lifecycle = lifecycleSetUp(inspector); | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
311 DataAccess da = null; | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
312 try { | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
313 da = getDataStream(); | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
314 internalInspectChangelog(da, inspector); | 
| 
513
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
315 if (flowControl.isStopped()) { | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
316 return; | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
317 } | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
318 internalInspectManifest(da, inspector); | 
| 
513
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
319 if (flowControl.isStopped()) { | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
320 return; | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
321 } | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
322 internalInspectFiles(da, inspector); | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
323 } catch (IOException ex) { | 
| 
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
324 throw new HgInvalidFileException("Bundle.inspectAll failed", ex, bundleFile); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
325 } finally { | 
| 
295
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
326 if (da != null) { | 
| 
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
327 da.done(); | 
| 
 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
274 
diff
changeset
 | 
328 } | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
329 lifecycleTearDown(lifecycle); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
330 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
331 } | 
| 
512
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
332 | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
333 // initialize flowControl, check for concurrent usage, starts lifecyle, if any | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
334 // return non-null only if inspector is interested in lifecycle events | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
335 private Lifecycle lifecycleSetUp(Inspector inspector) throws ConcurrentModificationException { | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
336 // Don't need flowControl in case Inspector doesn't implement Lifecycle, | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
337 // however is handy not to expect it == null inside internalInspect* | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
338 // XXX Once there's need to make this class thread-safe, | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
339 // shall move flowControl to thread-local state. | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
340 if (flowControl != null) { | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
341 throw new ConcurrentModificationException("HgBundle is in use and not thread-safe yet"); | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
342 } | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
343 flowControl = new Lifecycle.BasicCallback(); | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
344 final Lifecycle lifecycle = Adaptable.Factory.getAdapter(inspector, Lifecycle.class, null); | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
345 if (lifecycle != null) { | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
346 lifecycle.start(-1, flowControl, flowControl); | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
347 } | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
348 return lifecycle; | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
349 } | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
350 | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
351 private void lifecycleTearDown(Lifecycle lifecycle) { | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
352 if (lifecycle != null) { | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
353 lifecycle.finish(flowControl); | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
354 } | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
355 flowControl = null; | 
| 
 
10ca3ede8367
Issue 39: Progress and Cancel support for Clone command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
467 
diff
changeset
 | 
356 } | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
357 | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
358 private void internalInspectChangelog(DataAccess da, Inspector inspector) throws IOException { | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
359 if (da.isEmpty()) { | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
360 return; | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
361 } | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
362 inspector.changelogStart(); | 
| 
513
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
363 if (flowControl.isStopped()) { | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
364 return; | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
365 } | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
366 readGroup(da, inspector); | 
| 
513
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
367 if (flowControl.isStopped()) { | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
368 return; | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
369 } | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
370 inspector.changelogEnd(); | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
371 } | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
372 | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
373 private void internalInspectManifest(DataAccess da, Inspector inspector) throws IOException { | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
374 if (da.isEmpty()) { | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
375 return; | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
376 } | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
377 inspector.manifestStart(); | 
| 
513
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
378 if (flowControl.isStopped()) { | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
379 return; | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
380 } | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
381 readGroup(da, inspector); | 
| 
513
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
382 if (flowControl.isStopped()) { | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
383 return; | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
384 } | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
385 inspector.manifestEnd(); | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
386 } | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
387 | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
388 private void internalInspectFiles(DataAccess da, Inspector inspector) throws IOException { | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
389 while (!da.isEmpty()) { | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
390 int fnameLen = da.readInt(); | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
391 if (fnameLen <= 4) { | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
392 break; // null chunk, the last one. | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
393 } | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
394 byte[] fnameBuf = new byte[fnameLen - 4]; | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
395 da.readBytes(fnameBuf, 0, fnameBuf.length); | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
396 String name = new String(fnameBuf); | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
397 inspector.fileStart(name); | 
| 
513
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
398 if (flowControl.isStopped()) { | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
399 return; | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
400 } | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
401 readGroup(da, inspector); | 
| 
513
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
402 if (flowControl.isStopped()) { | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
403 return; | 
| 
 
a41d955dc360
Issue 39: HgCloneCommand doesn't use CancelSupport/ProgressSupport handlers
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
512 
diff
changeset
 | 
404 } | 
| 
182
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
405 inspector.fileEnd(name); | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
406 } | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
407 } | 
| 
 
f26ffe04ced0
Refactor HgBundle to dispatch changes found through callback
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
170 
diff
changeset
 | 
408 | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
409 private static void readGroup(DataAccess da, Inspector inspector) throws IOException { | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
410 int len = da.readInt(); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
411 boolean good2go = true; | 
| 
532
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
412 Nodeid prevNodeid = Nodeid.NULL; | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
413 while (len > 4 && !da.isEmpty() && good2go) { | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
414 byte[] nb = new byte[80]; | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
415 da.readBytes(nb, 0, 80); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
416 int dataLength = len - 84 /* length field + 4 nodeids */; | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
417 byte[] data = new byte[dataLength]; | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
418 da.readBytes(data, 0, dataLength); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
419 DataAccess slice = new ByteArrayDataAccess(data); // XXX in fact, may pass a slicing DataAccess. | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
420 // Just need to make sure that we seek to proper location afterwards (where next GroupElement starts), | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
421 // regardless whether that slice has read it or not. | 
| 
532
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
422 GroupElement ge = new GroupElement(nb, prevNodeid, slice); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
423 good2go = inspector.element(ge); | 
| 
170
 
71ddbf8603e8
Initial clone: populate given directory from a bundle. Everything but remote server access is there, albeit prototype code style
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
169 
diff
changeset
 | 
424 slice.done(); // BADA doesn't implement done(), but it could (e.g. free array) | 
| 
 
71ddbf8603e8
Initial clone: populate given directory from a bundle. Everything but remote server access is there, albeit prototype code style
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
169 
diff
changeset
 | 
425 /// and we'd better tell it we are not going to use it any more. However, it's important to ensure Inspector | 
| 
 
71ddbf8603e8
Initial clone: populate given directory from a bundle. Everything but remote server access is there, albeit prototype code style
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
169 
diff
changeset
 | 
426 // implementations out there do not retain GroupElement.rawData() | 
| 
532
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
427 prevNodeid = ge.node(); | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
428 len = da.isEmpty() ? 0 : da.readInt(); | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
429 } | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
430 // need to skip up to group end if inspector told he don't want to continue with the group, | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
431 // because outer code may try to read next group immediately as we return back. | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
432 while (len > 4 && !da.isEmpty()) { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
433 da.skip(len - 4 /* length field */); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
434 len = da.isEmpty() ? 0 : da.readInt(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
435 } | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
436 } | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
437 | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
438 private static void skipGroup(DataAccess da) throws IOException { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
439 int len = da.readInt(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
440 while (len > 4 && !da.isEmpty()) { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
441 da.skip(len - 4); // sizeof(int) | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
442 len = da.isEmpty() ? 0 : da.readInt(); | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
443 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
444 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
445 | 
| 
358
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
446 @Experimental(reason="Cumbersome API, rawData and apply with byte[] perhaps need replacement with ByteChannel/ByteBuffer, and better Exceptions. Perhaps, shall split into interface and impl") | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
447 public static class GroupElement { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
448 private final byte[] header; // byte[80] takes 120 bytes, 4 Nodeids - 192 | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
449 private final DataAccess dataAccess; | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
295 
diff
changeset
 | 
450 private Patch patches; | 
| 
532
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
451 private final Nodeid deltaBase; | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
452 | 
| 
532
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
453 GroupElement(byte[] fourNodeids, Nodeid deltaBaseRev, DataAccess rawDataAccess) { | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
454 assert fourNodeids != null && fourNodeids.length == 80; | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
455 header = fourNodeids; | 
| 
532
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
456 deltaBase = deltaBaseRev; | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
457 dataAccess = rawDataAccess; | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
458 } | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
459 | 
| 
358
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
460 /** | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
461 * <b>node</b> field of the group element | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
462 * @return node revision, never <code>null</code> | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
463 */ | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
464 public Nodeid node() { | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
465 return Nodeid.fromBinary(header, 0); | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
466 } | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
467 | 
| 
358
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
468 /** | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
469 * <b>p1</b> <i>(parent 1)</i> field of the group element | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
470 * @return revision of parent 1, never <code>null</code> | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
471 */ | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
472 public Nodeid firstParent() { | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
473 return Nodeid.fromBinary(header, 20); | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
474 } | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
475 | 
| 
358
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
476 /** | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
477 * <b>p2</b> <i>(parent 2)</i> field of the group element | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
478 * @return revision of parent 2, never <code>null</code> | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
479 */ | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
480 public Nodeid secondParent() { | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
481 return Nodeid.fromBinary(header, 40); | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
482 } | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
483 | 
| 
358
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
484 /** | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
485 * <b>cs</b> <i>(changeset link)</i> field of the group element | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
486 * @return changeset revision, never <code>null</code> | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
487 */ | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
488 public Nodeid cset() { | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
489 return Nodeid.fromBinary(header, 60); | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
490 } | 
| 
358
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
491 | 
| 
532
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
492 /** | 
| 
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
493 * Revision this element keeps patches against. For the patches of the very first revision returns {@link Nodeid#NULL}. | 
| 
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
494 * @return revision of delta base, never <code>null</code> | 
| 
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
495 */ | 
| 
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
496 public Nodeid patchBase() { | 
| 
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
497 return deltaBase; | 
| 
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
498 } | 
| 
 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
526 
diff
changeset
 | 
499 | 
| 
358
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
500 public byte[] rawDataByteArray() throws IOException { // XXX IOException or HgInvalidFileException? | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
501 return rawData().byteArray(); | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
502 } | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
503 | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
504 public byte[] apply(byte[] baseContent) throws IOException { | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
505 return apply(new ByteArrayDataAccess(baseContent)); | 
| 
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
506 } | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
507 | 
| 
358
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
508 /*package-local*/ DataAccess rawData() { | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
509 return dataAccess; | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
510 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
511 | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
295 
diff
changeset
 | 
512 /*package-local*/ Patch patch() throws IOException { | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
513 if (patches == null) { | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
514 dataAccess.reset(); | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
295 
diff
changeset
 | 
515 patches = new Patch(); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
295 
diff
changeset
 | 
516 patches.read(dataAccess); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
517 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
518 return patches; | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
519 } | 
| 
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
520 | 
| 
358
 
fc8bc2f1edbe
Clean internal classes from public API
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
357 
diff
changeset
 | 
521 /*package-local*/ byte[] apply(DataAccess baseContent) throws IOException { | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
295 
diff
changeset
 | 
522 return patch().apply(baseContent, -1); | 
| 
169
 
8c8e3f372fa1
Towards initial clone: refactor HgBundle to provide slightly higher-level structure of the bundle
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
157 
diff
changeset
 | 
523 } | 
| 
357
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
524 | 
| 
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
525 public String toString() { | 
| 
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
526 int patchCount; | 
| 
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
527 try { | 
| 
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
528 patchCount = patch().count(); | 
| 
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
529 } catch (IOException ex) { | 
| 
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
530 ex.printStackTrace(); | 
| 
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
531 patchCount = -1; | 
| 
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
532 } | 
| 
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
533 return String.format("%s %s %s %s; patches:%d\n", node().shortNotation(), firstParent().shortNotation(), secondParent().shortNotation(), cset().shortNotation(), patchCount); | 
| 
 
dfb8405d996f
Clean debug stacktraces
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
354 
diff
changeset
 | 
534 } | 
| 
36
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
535 } | 
| 
 
205f9b59b400
Strip parsing logic out from console frontend
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
536 } | 
