Mercurial > hg4j
annotate src/org/tmatesoft/hg/repo/Revlog.java @ 143:b9700740553a
Command line tools parse and respect most of command-line arguments
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 17 Feb 2011 22:16:25 +0100 | 
| parents | 3959bffb14e9 | 
| children | d5268ca7715b | 
| rev | line source | 
|---|---|
| 
22
 
603806cd2dc6
Status of local working dir against non-tip base revision
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
21 
diff
changeset
 | 
1 /* | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
2 * Copyright (c) 2010-2011 TMate Software Ltd | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
3 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
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: 
56 
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: 
56 
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: 
56 
diff
changeset
 | 
7 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
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: 
56 
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: 
56 
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: 
56 
diff
changeset
 | 
11 * GNU General Public License for more details. | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
12 * | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
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: 
56 
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: 
88 
diff
changeset
 | 
15 * contact TMate Software at support@hg4j.com | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
16 */ | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
17 package org.tmatesoft.hg.repo; | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
18 | 
| 
80
 
4222b04f34ee
Follow history of a file
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
19 import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
20 import static org.tmatesoft.hg.repo.HgRepository.TIP; | 
| 
56
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
21 | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
22 import java.util.Arrays; | 
| 
29
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
23 import java.util.Collection; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
24 import java.util.Collections; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
25 import java.util.HashMap; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
26 import java.util.LinkedHashSet; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
27 import java.util.Map; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
28 import java.util.Set; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
29 | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
30 import org.tmatesoft.hg.core.Nodeid; | 
| 
77
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
31 import org.tmatesoft.hg.internal.RevlogStream; | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
32 | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
33 | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
34 /** | 
| 
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
35 * | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
36 * @author Artem Tikhomirov | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
37 * @author TMate Software Ltd. | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
38 */ | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
39 abstract class Revlog { | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
40 | 
| 
115
 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
41 private final HgRepository repo; | 
| 
21
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
42 protected final RevlogStream content; | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
43 | 
| 
115
 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
44 protected Revlog(HgRepository hgRepo, RevlogStream contentStream) { | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
45 if (hgRepo == null) { | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
46 throw new IllegalArgumentException(); | 
| 
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
47 } | 
| 
115
 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
48 if (contentStream == null) { | 
| 
74
 
6f1b88693d48
Complete refactoring to org.tmatesoft
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
56 
diff
changeset
 | 
49 throw new IllegalArgumentException(); | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
50 } | 
| 
115
 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
51 repo = hgRepo; | 
| 
 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
52 content = contentStream; | 
| 
 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
53 } | 
| 
 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
54 | 
| 
 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
55 // invalid Revlog | 
| 
 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
56 protected Revlog(HgRepository hgRepo) { | 
| 
 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
57 repo = hgRepo; | 
| 
 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
58 content = null; | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
59 } | 
| 
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
60 | 
| 
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
61 public final HgRepository getRepo() { | 
| 
115
 
c0cc2535462c
Introduced channels to pipeline (and easily filter) data streams
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
102 
diff
changeset
 | 
62 return repo; | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
63 } | 
| 
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
64 | 
| 
135
 
3959bffb14e9
explicit op name instead math op to get last rev number
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
115 
diff
changeset
 | 
65 public final int getRevisionCount() { | 
| 
21
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
66 return content.revisionCount(); | 
| 
 
e929cecae4e1
Refactor to move revlog content to base class
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
3 
diff
changeset
 | 
67 } | 
| 
80
 
4222b04f34ee
Follow history of a file
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
68 | 
| 
135
 
3959bffb14e9
explicit op name instead math op to get last rev number
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
115 
diff
changeset
 | 
69 public final int getLastRevision() { | 
| 
 
3959bffb14e9
explicit op name instead math op to get last rev number
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
115 
diff
changeset
 | 
70 return content.revisionCount() - 1; | 
| 
 
3959bffb14e9
explicit op name instead math op to get last rev number
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
115 
diff
changeset
 | 
71 } | 
| 
 
3959bffb14e9
explicit op name instead math op to get last rev number
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
115 
diff
changeset
 | 
72 | 
| 
 
3959bffb14e9
explicit op name instead math op to get last rev number
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
115 
diff
changeset
 | 
73 public final Nodeid getRevision(int revision) { | 
| 
80
 
4222b04f34ee
Follow history of a file
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
74 // XXX cache nodeids? | 
| 
 
4222b04f34ee
Follow history of a file
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
75 return Nodeid.fromBinary(content.nodeid(revision), 0); | 
| 
 
4222b04f34ee
Follow history of a file
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
76 } | 
| 
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: 
31 
diff
changeset
 | 
77 | 
| 
135
 
3959bffb14e9
explicit op name instead math op to get last rev number
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
115 
diff
changeset
 | 
78 public final int getLocalRevision(Nodeid nid) { | 
| 
49
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
79 int revision = content.findLocalRevisionNumber(nid); | 
| 
80
 
4222b04f34ee
Follow history of a file
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
77 
diff
changeset
 | 
80 if (revision == BAD_REVISION) { | 
| 
49
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
81 throw new IllegalArgumentException(String.format("%s doesn't represent a revision of %s", nid.toString(), this /*XXX HgDataFile.getPath might be more suitable here*/)); | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
82 } | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
83 return revision; | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
84 } | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
85 | 
| 
39
 
4e9b66b07a28
Check changelog group starts with proper (known) base
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
37 
diff
changeset
 | 
86 // Till now, i follow approach that NULL nodeid is never part of revlog | 
| 
135
 
3959bffb14e9
explicit op name instead math op to get last rev number
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
115 
diff
changeset
 | 
87 public final boolean isKnown(Nodeid nodeid) { | 
| 
49
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
88 final int rn = content.findLocalRevisionNumber(nodeid); | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
89 if (Integer.MIN_VALUE == rn) { | 
| 
39
 
4e9b66b07a28
Check changelog group starts with proper (known) base
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
37 
diff
changeset
 | 
90 return false; | 
| 
 
4e9b66b07a28
Check changelog group starts with proper (known) base
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
37 
diff
changeset
 | 
91 } | 
| 
49
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
92 if (rn < 0 || rn >= content.revisionCount()) { | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
93 // Sanity check | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
94 throw new IllegalStateException(); | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
95 } | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
96 return true; | 
| 
39
 
4e9b66b07a28
Check changelog group starts with proper (known) base
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
37 
diff
changeset
 | 
97 } | 
| 
49
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
98 | 
| 
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: 
31 
diff
changeset
 | 
99 /** | 
| 
 
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: 
31 
diff
changeset
 | 
100 * Access to revision data as is (decompressed, but otherwise unprocessed, i.e. not parsed for e.g. changeset or manifest entries) | 
| 
 
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: 
31 
diff
changeset
 | 
101 * @param nodeid | 
| 
 
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: 
31 
diff
changeset
 | 
102 */ | 
| 
 
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: 
31 
diff
changeset
 | 
103 public byte[] content(Nodeid nodeid) { | 
| 
88
 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
80 
diff
changeset
 | 
104 return content(getLocalRevision(nodeid)); | 
| 
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: 
31 
diff
changeset
 | 
105 } | 
| 
29
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
106 | 
| 
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: 
31 
diff
changeset
 | 
107 /** | 
| 
 
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: 
31 
diff
changeset
 | 
108 * @param revision - repo-local index of this file change (not a changelog revision number!) | 
| 
 
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: 
31 
diff
changeset
 | 
109 */ | 
| 
 
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: 
31 
diff
changeset
 | 
110 public byte[] content(int revision) { | 
| 
 
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: 
31 
diff
changeset
 | 
111 final byte[][] dataPtr = new byte[1][]; | 
| 
77
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
112 RevlogStream.Inspector insp = new RevlogStream.Inspector() { | 
| 
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: 
31 
diff
changeset
 | 
113 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, byte[] data) { | 
| 
 
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: 
31 
diff
changeset
 | 
114 dataPtr[0] = data; | 
| 
 
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: 
31 
diff
changeset
 | 
115 } | 
| 
 
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: 
31 
diff
changeset
 | 
116 }; | 
| 
 
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: 
31 
diff
changeset
 | 
117 content.iterate(revision, revision, true, insp); | 
| 
 
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: 
31 
diff
changeset
 | 
118 return dataPtr[0]; | 
| 
 
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: 
31 
diff
changeset
 | 
119 } | 
| 
 
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: 
31 
diff
changeset
 | 
120 | 
| 
56
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
121 /** | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
122 * XXX perhaps, return value Nodeid[2] and boolean needNodeids is better (and higher level) API for this query? | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
123 * | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
124 * @param revision - revision to query parents, or {@link HgRepository#TIP} | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
125 * @param parentRevisions - int[2] to get local revision numbers of parents (e.g. {6, -1}) | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
126 * @param parent1 - byte[20] or null, if parent's nodeid is not needed | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
127 * @param parent2 - byte[20] or null, if second parent's nodeid is not needed | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
128 * @return | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
129 */ | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
130 public void parents(int revision, int[] parentRevisions, byte[] parent1, byte[] parent2) { | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
131 if (revision != TIP && !(revision >= 0 && revision < content.revisionCount())) { | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
132 throw new IllegalArgumentException(String.valueOf(revision)); | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
133 } | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
134 if (parentRevisions == null || parentRevisions.length < 2) { | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
135 throw new IllegalArgumentException(String.valueOf(parentRevisions)); | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
136 } | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
137 if (parent1 != null && parent1.length < 20) { | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
138 throw new IllegalArgumentException(parent1.toString()); | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
139 } | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
140 if (parent2 != null && parent2.length < 20) { | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
141 throw new IllegalArgumentException(parent2.toString()); | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
142 } | 
| 
77
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
143 class ParentCollector implements RevlogStream.Inspector { | 
| 
56
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
144 public int p1 = -1; | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
145 public int p2 = -1; | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
146 public byte[] nodeid; | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
147 | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
148 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, byte[] data) { | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
149 p1 = parent1Revision; | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
150 p2 = parent2Revision; | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
151 this.nodeid = new byte[20]; | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
152 // nodeid arg now comes in 32 byte from (as in file format description), however upper 12 bytes are zeros. | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
153 System.arraycopy(nodeid, nodeid.length > 20 ? nodeid.length - 20 : 0, this.nodeid, 0, 20); | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
154 } | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
155 }; | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
156 ParentCollector pc = new ParentCollector(); | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
157 content.iterate(revision, revision, false, pc); | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
158 parentRevisions[0] = pc.p1; | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
159 parentRevisions[1] = pc.p2; | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
160 if (parent1 != null) { | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
161 if (parentRevisions[0] == -1) { | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
162 Arrays.fill(parent1, 0, 20, (byte) 0); | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
163 } else { | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
164 content.iterate(parentRevisions[0], parentRevisions[0], false, pc); | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
165 System.arraycopy(pc.nodeid, 0, parent1, 0, 20); | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
166 } | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
167 } | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
168 if (parent2 != null) { | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
169 if (parentRevisions[1] == -1) { | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
170 Arrays.fill(parent2, 0, 20, (byte) 0); | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
171 } else { | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
172 content.iterate(parentRevisions[1], parentRevisions[1], false, pc); | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
173 System.arraycopy(pc.nodeid, 0, parent2, 0, 20); | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
174 } | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
175 } | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
176 } | 
| 
 
576d6e8a09f6
Analog of 'hg status --change' command
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
49 
diff
changeset
 | 
177 | 
| 
29
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
178 /* | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
179 * XXX think over if it's better to do either: | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
180 * pw = getChangelog().new ParentWalker(); pw.init() and pass pw instance around as needed | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
181 * or | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
182 * add Revlog#getParentWalker(), static class, make cons() and #init package-local, and keep SoftReference to allow walker reuse. | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
183 * | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
184 * and yes, walker is not a proper name | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
185 */ | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
186 public final class ParentWalker { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
187 private Map<Nodeid, Nodeid> firstParent; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
188 private Map<Nodeid, Nodeid> secondParent; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
189 private Set<Nodeid> allNodes; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
190 | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
191 public ParentWalker() { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
192 firstParent = secondParent = Collections.emptyMap(); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
193 allNodes = Collections.emptySet(); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
194 } | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
195 | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
196 public void init() { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
197 final RevlogStream stream = Revlog.this.content; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
198 final int revisionCount = stream.revisionCount(); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
199 firstParent = new HashMap<Nodeid, Nodeid>(revisionCount); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
200 secondParent = new HashMap<Nodeid, Nodeid>(firstParent.size() >> 1); // assume branches/merges are less frequent | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
201 allNodes = new LinkedHashSet<Nodeid>(); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
202 | 
| 
77
 
c677e1593919
Moved RevlogStream implementation into .internal
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
74 
diff
changeset
 | 
203 RevlogStream.Inspector insp = new RevlogStream.Inspector() { | 
| 
29
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
204 final Nodeid[] sequentialRevisionNodeids = new Nodeid[revisionCount]; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
205 int ix = 0; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
206 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, byte[] data) { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
207 if (ix != revisionNumber) { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
208 // XXX temp code, just to make sure I understand what's going on here | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
209 throw new IllegalStateException(); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
210 } | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
211 if (parent1Revision >= revisionNumber || parent2Revision >= revisionNumber) { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
212 throw new IllegalStateException(); // sanity, revisions are sequential | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
213 } | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
214 final Nodeid nid = new Nodeid(nodeid, true); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
215 sequentialRevisionNodeids[ix++] = nid; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
216 allNodes.add(nid); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
217 if (parent1Revision != -1) { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
218 firstParent.put(nid, sequentialRevisionNodeids[parent1Revision]); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
219 if (parent2Revision != -1) { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
220 secondParent.put(nid, sequentialRevisionNodeids[parent2Revision]); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
221 } | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
222 } | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
223 } | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
224 }; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
225 stream.iterate(0, -1, false, insp); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
226 } | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
227 | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
228 public Set<Nodeid> allNodes() { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
229 return Collections.unmodifiableSet(allNodes); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
230 } | 
| 
31
 
346b66add79d
Basic lookup for incoming changes
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
29 
diff
changeset
 | 
231 | 
| 
 
346b66add79d
Basic lookup for incoming changes
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
29 
diff
changeset
 | 
232 // FIXME need to decide whether Nodeid(00 * 20) is always known or not | 
| 
 
346b66add79d
Basic lookup for incoming changes
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
29 
diff
changeset
 | 
233 public boolean knownNode(Nodeid nid) { | 
| 
 
346b66add79d
Basic lookup for incoming changes
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
29 
diff
changeset
 | 
234 return allNodes.contains(nid); | 
| 
 
346b66add79d
Basic lookup for incoming changes
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
29 
diff
changeset
 | 
235 } | 
| 
29
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
236 | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
237 // null if none | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
238 public Nodeid firstParent(Nodeid nid) { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
239 return firstParent.get(nid); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
240 } | 
| 
49
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
241 | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
242 // never null, Nodeid.NULL if none known | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
243 public Nodeid safeFirstParent(Nodeid nid) { | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
244 Nodeid rv = firstParent(nid); | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
245 return rv == null ? Nodeid.NULL : rv; | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
246 } | 
| 
29
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
247 | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
248 public Nodeid secondParent(Nodeid nid) { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
249 return secondParent.get(nid); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
250 } | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
251 | 
| 
49
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
252 public Nodeid safeSecondParent(Nodeid nid) { | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
253 Nodeid rv = secondParent(nid); | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
254 return rv == null ? Nodeid.NULL : rv; | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
255 } | 
| 
 
26e3eeaa3962
branch and user filtering for log operation
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
39 
diff
changeset
 | 
256 | 
| 
29
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
257 public boolean appendParentsOf(Nodeid nid, Collection<Nodeid> c) { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
258 Nodeid p1 = firstParent(nid); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
259 boolean modified = false; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
260 if (p1 != null) { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
261 modified = c.add(p1); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
262 Nodeid p2 = secondParent(nid); | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
263 if (p2 != null) { | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
264 modified = c.add(p2) || modified; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
265 } | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
266 } | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
267 return modified; | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
268 } | 
| 
 
6cce719bbb62
Collector for nodes and their parents
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
24 
diff
changeset
 | 
269 } | 
| 
2
 
08db726a0fb7
Shaping out low-level Hg structures
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
270 } | 
