Mercurial > jhg
annotate src/org/tmatesoft/hg/repo/Revlog.java @ 74:6f1b88693d48
Complete refactoring to org.tmatesoft
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Mon, 24 Jan 2011 03:14:45 +0100 | 
| parents | src/com/tmate/hgkit/ll/Revlog.java@576d6e8a09f6 | 
| children | c677e1593919 | 
| rev | line source | 
|---|---|
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
21diff
changeset | 1 /* | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 2 * Copyright (c) 2010-2011 TMate Software Ltd | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 3 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
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: 
56diff
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: 
56diff
changeset | 6 * the Free Software Foundation; version 2 of the License. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 7 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
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: 
56diff
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: 
56diff
changeset | 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 11 * GNU General Public License for more details. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 12 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 13 * For information on how to redistribute this software under | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 14 * the terms of a license other than GNU General Public License | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 15 * contact TMate Software at support@svnkit.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: 
56diff
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 | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 19 import static org.tmatesoft.hg.repo.HgRepository.TIP; | 
| 56 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 20 | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 21 import java.util.Arrays; | 
| 29 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 22 import java.util.Collection; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 23 import java.util.Collections; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 24 import java.util.HashMap; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 25 import java.util.LinkedHashSet; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 26 import java.util.Map; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 27 import java.util.Set; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 28 | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 29 import org.tmatesoft.hg.core.Nodeid; | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 30 | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 31 | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 32 /** | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 33 * | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 34 * @author Artem Tikhomirov | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 35 * @author TMate Software Ltd. | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 36 */ | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 37 abstract class Revlog { | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 38 | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 39 private final HgRepository hgRepo; | 
| 21 
e929cecae4e1
Refactor to move revlog content to base class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
3diff
changeset | 40 protected final RevlogStream content; | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 41 | 
| 21 
e929cecae4e1
Refactor to move revlog content to base class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
3diff
changeset | 42 protected Revlog(HgRepository hgRepo, RevlogStream content) { | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 43 if (hgRepo == null) { | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 44 throw new IllegalArgumentException(); | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 45 } | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 46 if (content == null) { | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 47 throw new IllegalArgumentException(); | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 48 } | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 49 this.hgRepo = hgRepo; | 
| 21 
e929cecae4e1
Refactor to move revlog content to base class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
3diff
changeset | 50 this.content = content; | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 51 } | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 52 | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 53 public final HgRepository getRepo() { | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 54 return hgRepo; | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 55 } | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 56 | 
| 21 
e929cecae4e1
Refactor to move revlog content to base class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
3diff
changeset | 57 public int getRevisionCount() { | 
| 
e929cecae4e1
Refactor to move revlog content to base class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
3diff
changeset | 58 return content.revisionCount(); | 
| 
e929cecae4e1
Refactor to move revlog content to base class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
3diff
changeset | 59 } | 
| 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: 
31diff
changeset | 60 | 
| 49 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 61 public int getLocalRevisionNumber(Nodeid nid) { | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 62 int revision = content.findLocalRevisionNumber(nid); | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 63 if (revision == Integer.MIN_VALUE) { | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 64 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: 
39diff
changeset | 65 } | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 66 return revision; | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 67 } | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 68 | 
| 39 
4e9b66b07a28
Check changelog group starts with proper (known) base
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
37diff
changeset | 69 // Till now, i follow approach that NULL nodeid is never part of revlog | 
| 
4e9b66b07a28
Check changelog group starts with proper (known) base
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
37diff
changeset | 70 public boolean isKnown(Nodeid nodeid) { | 
| 49 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 71 final int rn = content.findLocalRevisionNumber(nodeid); | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 72 if (Integer.MIN_VALUE == rn) { | 
| 39 
4e9b66b07a28
Check changelog group starts with proper (known) base
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
37diff
changeset | 73 return false; | 
| 
4e9b66b07a28
Check changelog group starts with proper (known) base
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
37diff
changeset | 74 } | 
| 49 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 75 if (rn < 0 || rn >= content.revisionCount()) { | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 76 // Sanity check | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 77 throw new IllegalStateException(); | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 78 } | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 79 return true; | 
| 39 
4e9b66b07a28
Check changelog group starts with proper (known) base
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
37diff
changeset | 80 } | 
| 49 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 81 | 
| 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: 
31diff
changeset | 82 /** | 
| 
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: 
31diff
changeset | 83 * 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: 
31diff
changeset | 84 * @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: 
31diff
changeset | 85 */ | 
| 
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: 
31diff
changeset | 86 public byte[] content(Nodeid nodeid) { | 
| 49 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 87 return content(getLocalRevisionNumber(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: 
31diff
changeset | 88 } | 
| 29 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 89 | 
| 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: 
31diff
changeset | 90 /** | 
| 
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: 
31diff
changeset | 91 * @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: 
31diff
changeset | 92 */ | 
| 
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: 
31diff
changeset | 93 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: 
31diff
changeset | 94 final byte[][] dataPtr = new byte[1][]; | 
| 
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: 
31diff
changeset | 95 Revlog.Inspector insp = new Revlog.Inspector() { | 
| 
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: 
31diff
changeset | 96 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: 
31diff
changeset | 97 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: 
31diff
changeset | 98 } | 
| 
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: 
31diff
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: 
31diff
changeset | 100 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: 
31diff
changeset | 101 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: 
31diff
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: 
31diff
changeset | 103 | 
| 56 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 104 /** | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 105 * 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: 
49diff
changeset | 106 * | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 107 * @param revision - revision to query parents, or {@link HgRepository#TIP} | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 108 * @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: 
49diff
changeset | 109 * @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: 
49diff
changeset | 110 * @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: 
49diff
changeset | 111 * @return | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 112 */ | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 113 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: 
49diff
changeset | 114 if (revision != TIP && !(revision >= 0 && revision < content.revisionCount())) { | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 115 throw new IllegalArgumentException(String.valueOf(revision)); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 116 } | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 117 if (parentRevisions == null || parentRevisions.length < 2) { | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 118 throw new IllegalArgumentException(String.valueOf(parentRevisions)); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 119 } | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 120 if (parent1 != null && parent1.length < 20) { | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 121 throw new IllegalArgumentException(parent1.toString()); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 122 } | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 123 if (parent2 != null && parent2.length < 20) { | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 124 throw new IllegalArgumentException(parent2.toString()); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 125 } | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 126 class ParentCollector implements Revlog.Inspector { | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 127 public int p1 = -1; | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 128 public int p2 = -1; | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 129 public byte[] nodeid; | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 130 | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 131 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: 
49diff
changeset | 132 p1 = parent1Revision; | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 133 p2 = parent2Revision; | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 134 this.nodeid = new byte[20]; | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 135 // 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: 
49diff
changeset | 136 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: 
49diff
changeset | 137 } | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 138 }; | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 139 ParentCollector pc = new ParentCollector(); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 140 content.iterate(revision, revision, false, pc); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 141 parentRevisions[0] = pc.p1; | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 142 parentRevisions[1] = pc.p2; | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 143 if (parent1 != null) { | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 144 if (parentRevisions[0] == -1) { | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 145 Arrays.fill(parent1, 0, 20, (byte) 0); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 146 } else { | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 147 content.iterate(parentRevisions[0], parentRevisions[0], false, pc); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 148 System.arraycopy(pc.nodeid, 0, parent1, 0, 20); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 149 } | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 150 } | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 151 if (parent2 != null) { | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 152 if (parentRevisions[1] == -1) { | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 153 Arrays.fill(parent2, 0, 20, (byte) 0); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 154 } else { | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 155 content.iterate(parentRevisions[1], parentRevisions[1], false, pc); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 156 System.arraycopy(pc.nodeid, 0, parent2, 0, 20); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 157 } | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 158 } | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 159 } | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 160 | 
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
21diff
changeset | 161 // FIXME byte[] data might be too expensive, for few usecases it may be better to have intermediate Access object (when we don't need full data | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
21diff
changeset | 162 // instantly - e.g. calculate hash, or comparing two revisions | 
| 29 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 163 // XXX seems that RevlogStream is better place for this class. | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 164 public interface Inspector { | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 165 // XXX boolean retVal to indicate whether to continue? | 
| 24 
d4fdd1845b3f
Nodeid with array of exactly 20 bytes
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
22diff
changeset | 166 // TODO specify nodeid and data length, and reuse policy (i.e. if revlog stream doesn't reuse nodeid[] for each call) | 
| 
d4fdd1845b3f
Nodeid with array of exactly 20 bytes
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
22diff
changeset | 167 void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[/*20*/] nodeid, byte[] data); | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 168 } | 
| 29 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 169 | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 170 /* | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 171 * XXX think over if it's better to do either: | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 172 * 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: 
24diff
changeset | 173 * or | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 174 * 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: 
24diff
changeset | 175 * | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 176 * and yes, walker is not a proper name | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 177 */ | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 178 public final class ParentWalker { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 179 private Map<Nodeid, Nodeid> firstParent; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 180 private Map<Nodeid, Nodeid> secondParent; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 181 private Set<Nodeid> allNodes; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 182 | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 183 public ParentWalker() { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 184 firstParent = secondParent = Collections.emptyMap(); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 185 allNodes = Collections.emptySet(); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 186 } | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 187 | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 188 public void init() { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 189 final RevlogStream stream = Revlog.this.content; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 190 final int revisionCount = stream.revisionCount(); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 191 firstParent = new HashMap<Nodeid, Nodeid>(revisionCount); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 192 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: 
24diff
changeset | 193 allNodes = new LinkedHashSet<Nodeid>(); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 194 | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 195 Inspector insp = new Inspector() { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 196 final Nodeid[] sequentialRevisionNodeids = new Nodeid[revisionCount]; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 197 int ix = 0; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 198 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: 
24diff
changeset | 199 if (ix != revisionNumber) { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 200 // 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: 
24diff
changeset | 201 throw new IllegalStateException(); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 202 } | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 203 if (parent1Revision >= revisionNumber || parent2Revision >= revisionNumber) { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 204 throw new IllegalStateException(); // sanity, revisions are sequential | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 205 } | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 206 final Nodeid nid = new Nodeid(nodeid, true); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 207 sequentialRevisionNodeids[ix++] = nid; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 208 allNodes.add(nid); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 209 if (parent1Revision != -1) { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 210 firstParent.put(nid, sequentialRevisionNodeids[parent1Revision]); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 211 if (parent2Revision != -1) { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 212 secondParent.put(nid, sequentialRevisionNodeids[parent2Revision]); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 213 } | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 214 } | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 215 } | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 216 }; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 217 stream.iterate(0, -1, false, insp); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 218 } | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 219 | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 220 public Set<Nodeid> allNodes() { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 221 return Collections.unmodifiableSet(allNodes); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 222 } | 
| 31 
346b66add79d
Basic lookup for incoming changes
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
29diff
changeset | 223 | 
| 
346b66add79d
Basic lookup for incoming changes
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
29diff
changeset | 224 // 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: 
29diff
changeset | 225 public boolean knownNode(Nodeid nid) { | 
| 
346b66add79d
Basic lookup for incoming changes
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
29diff
changeset | 226 return allNodes.contains(nid); | 
| 
346b66add79d
Basic lookup for incoming changes
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
29diff
changeset | 227 } | 
| 29 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 228 | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 229 // null if none | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 230 public Nodeid firstParent(Nodeid nid) { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 231 return firstParent.get(nid); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 232 } | 
| 49 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 233 | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 234 // never null, Nodeid.NULL if none known | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 235 public Nodeid safeFirstParent(Nodeid nid) { | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 236 Nodeid rv = firstParent(nid); | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 237 return rv == null ? Nodeid.NULL : rv; | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 238 } | 
| 29 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 239 | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 240 public Nodeid secondParent(Nodeid nid) { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 241 return secondParent.get(nid); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 242 } | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 243 | 
| 49 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 244 public Nodeid safeSecondParent(Nodeid nid) { | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 245 Nodeid rv = secondParent(nid); | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 246 return rv == null ? Nodeid.NULL : rv; | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 247 } | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
39diff
changeset | 248 | 
| 29 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 249 public boolean appendParentsOf(Nodeid nid, Collection<Nodeid> c) { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 250 Nodeid p1 = firstParent(nid); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 251 boolean modified = false; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 252 if (p1 != null) { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 253 modified = c.add(p1); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 254 Nodeid p2 = secondParent(nid); | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 255 if (p2 != null) { | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 256 modified = c.add(p2) || modified; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 257 } | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 258 } | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 259 return modified; | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 260 } | 
| 
6cce719bbb62
Collector for nodes and their parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
24diff
changeset | 261 } | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 262 } | 
