annotate src/org/tmatesoft/hg/repo/HgChangelog.java @ 446:9f0e6dfd417e smartgit3

Workaround for a Revlog#walk defect for the price of (almost) complete repo walk
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Tue, 05 Jun 2012 21:18:20 +0200
parents 73e875154afb
children 528b6780a8bd
rev   line source
21
e929cecae4e1 Refactor to move revlog content to base class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 3
diff changeset
1 /*
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
2 * Copyright (c) 2010-2011 TMate Software Ltd
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
3 *
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
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: 48
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: 48
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: 48
diff changeset
7 *
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
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: 48
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: 48
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: 48
diff changeset
11 * GNU General Public License for more details.
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
12 *
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
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: 48
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: 97
diff changeset
15 * contact TMate Software at support@hg4j.com
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
16 */
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
17 package org.tmatesoft.hg.repo;
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
18
157
d5268ca7715b Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 51 154
diff changeset
19 import java.io.IOException;
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
20 import java.io.UnsupportedEncodingException;
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
21 import java.util.ArrayList;
3
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
22 import java.util.Arrays;
146
8c9f729f4dfa Timezone finally in use
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 137
diff changeset
23 import java.util.Calendar;
317
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
24 import java.util.Collection;
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
25 import java.util.Collections;
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
26 import java.util.Date;
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
27 import java.util.Formatter;
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
28 import java.util.HashMap;
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
29 import java.util.List;
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
30 import java.util.Locale;
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
31 import java.util.Map;
146
8c9f729f4dfa Timezone finally in use
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 137
diff changeset
32 import java.util.TimeZone;
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
33
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
34 import org.tmatesoft.hg.core.HgBadArgumentException;
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
35 import org.tmatesoft.hg.core.HgException;
354
5f9073eabf06 Propagate errors with exceptions up to a end client
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 329
diff changeset
36 import org.tmatesoft.hg.core.HgInvalidControlFileException;
5f9073eabf06 Propagate errors with exceptions up to a end client
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 329
diff changeset
37 import org.tmatesoft.hg.core.HgInvalidRevisionException;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
38 import org.tmatesoft.hg.core.Nodeid;
157
d5268ca7715b Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 51 154
diff changeset
39 import org.tmatesoft.hg.internal.DataAccess;
312
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
40 import org.tmatesoft.hg.internal.IterateControlMediator;
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
41 import org.tmatesoft.hg.internal.Lifecycle;
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
42 import org.tmatesoft.hg.internal.Pool;
77
c677e1593919 Moved RevlogStream implementation into .internal
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 74
diff changeset
43 import org.tmatesoft.hg.internal.RevlogStream;
312
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
44 import org.tmatesoft.hg.util.CancelSupport;
317
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
45 import org.tmatesoft.hg.util.Pair;
312
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
46 import org.tmatesoft.hg.util.ProgressSupport;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
47
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
48 /**
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
49 * Representation of the Mercurial changelog file (list of ChangeSets)
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
50 *
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
51 * @author Artem Tikhomirov
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
52 * @author TMate Software Ltd.
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
53 */
97
ee2c750b036d Changelog to HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 77
diff changeset
54 public class HgChangelog extends Revlog {
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
55
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
56 /* package-local */HgChangelog(HgRepository hgRepo, RevlogStream content) {
21
e929cecae4e1 Refactor to move revlog content to base class
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 3
diff changeset
57 super(hgRepo, content);
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
58 }
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
59
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
60 public void all(final HgChangelog.Inspector inspector) throws HgInvalidRevisionException, HgInvalidControlFileException {
137
144d771ee73c explicit op name instead math op to get last rev number
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 135
diff changeset
61 range(0, getLastRevision(), inspector);
48
e34f90b9ded1 Limit option for history/log
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 47
diff changeset
62 }
e34f90b9ded1 Limit option for history/log
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 47
diff changeset
63
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
64 public void range(int start, int end, final HgChangelog.Inspector inspector) throws HgInvalidRevisionException, HgInvalidControlFileException {
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
65 if (inspector == null) {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
66 throw new IllegalArgumentException();
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
67 }
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
68 content.iterate(start, end, true, new RawCsetParser(inspector));
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
69 }
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
70
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
71 public List<RawChangeset> range(int start, int end) throws HgInvalidRevisionException, HgInvalidControlFileException {
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
72 final RawCsetCollector c = new RawCsetCollector(end - start + 1);
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
73 range(start, end, c);
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
74 return c.result;
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
75 }
3
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
76
242
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
77 /**
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
78 * Access individual revisions. Note, regardless of supplied revision order, inspector gets
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
79 * changesets strictly in the order they are in the changelog.
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
80 * @param inspector callback to get changesets
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
81 * @param revisions revisions to read, unrestricted ordering.
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
82 */
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
83 public void range(final HgChangelog.Inspector inspector, final int... revisions) throws HgInvalidRevisionException, HgInvalidControlFileException {
242
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
84 Arrays.sort(revisions);
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
85 rangeInternal(inspector, revisions);
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
86 }
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
87
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
88 /**
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
89 * Friends-only version of {@link #range(Inspector, int...)}, when callers know array is sorted
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
90 */
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
91 /*package-local*/ void rangeInternal(HgChangelog.Inspector inspector, int[] sortedRevisions) throws HgInvalidRevisionException, HgInvalidControlFileException {
242
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
92 if (sortedRevisions == null || sortedRevisions.length == 0) {
3
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
93 return;
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
94 }
242
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
95 if (inspector == null) {
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
96 throw new IllegalArgumentException();
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
97 }
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
98 content.iterate(sortedRevisions, true, new RawCsetParser(inspector));
3
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
99 }
354
5f9073eabf06 Propagate errors with exceptions up to a end client
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 329
diff changeset
100
5f9073eabf06 Propagate errors with exceptions up to a end client
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 329
diff changeset
101 /**
5f9073eabf06 Propagate errors with exceptions up to a end client
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 329
diff changeset
102 * @throws HgInvalidRevisionException if supplied nodeid doesn't identify any revision from this revlog
5f9073eabf06 Propagate errors with exceptions up to a end client
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 329
diff changeset
103 * @throws HgInvalidControlFileException if access to revlog index/data entry failed
5f9073eabf06 Propagate errors with exceptions up to a end client
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 329
diff changeset
104 */
5f9073eabf06 Propagate errors with exceptions up to a end client
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 329
diff changeset
105 public RawChangeset changeset(Nodeid nid) throws HgInvalidControlFileException, HgInvalidRevisionException {
367
2fadf8695f8a Use 'revision index' instead of the vague 'local revision number' concept in the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 366
diff changeset
106 int x = getRevisionIndex(nid);
236
883300108179 Speed up branches calculation when cached branch information is available
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 211
diff changeset
107 return range(x, x).get(0);
883300108179 Speed up branches calculation when cached branch information is available
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 211
diff changeset
108 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
109
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
110 public interface Inspector {
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
111 // TODO describe whether cset is new instance each time
182
f26ffe04ced0 Refactor HgBundle to dispatch changes found through callback
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 161
diff changeset
112 // describe what revisionNumber is when Inspector is used with HgBundle (BAD_REVISION or bundle's local order?)
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
113 void next(int revisionNumber, Nodeid nodeid, RawChangeset cset);
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
114 }
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
115
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
116 /**
317
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
117 * Unlike regular {@link Inspector}, this one supplies changeset revision along with its parents and children according
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
118 * to parent information of the revlog this inspector visits.
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
119 * @see HgDataFile#history(TreeInspector)
328
a674b8590362 Move file tree history to upper API level
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 317
diff changeset
120 * @deprecated use {@link HgChangesetTreeHandler} and HgLogCommand#execute(HgChangesetTreeHandler)}
317
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
121 */
328
a674b8590362 Move file tree history to upper API level
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 317
diff changeset
122 @Deprecated
317
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
123 public interface TreeInspector {
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
124 // the reason TreeInsector is in HgChangelog, not in Revlog, because despite the fact it can
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
125 // be applied to any revlog, it's not meant to provide revisions of any revlog it's beeing applied to,
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
126 // but changeset revisions always.
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
127 // TODO HgChangelog.walk(TreeInspector)
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
128 void next(Nodeid changesetRevision, Pair<Nodeid, Nodeid> parentChangesets, Collection<Nodeid> childChangesets);
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
129 }
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
130
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
131 /**
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
132 * Entry in the Changelog
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
133 */
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
134 public static class RawChangeset implements Cloneable /* for those that would like to keep a copy */{
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
135 // TODO immutable
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
136 private/* final */Nodeid manifest;
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
137 private String user;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
138 private String comment;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
139 private List<String> files; // unmodifiable collection (otherwise #files() and implicit #clone() shall be revised)
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
140 private Date time;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
141 private int timezone;
161
9423235ca77b Record possible value (and knowledge source) for extras field
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 157
diff changeset
142 // http://mercurial.selenic.com/wiki/PruningDeadBranches - Closing changesets can be identified by close=1 in the changeset's extra field.
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
143 private Map<String, String> extras;
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
144
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
145 /**
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
146 * @see mercurial/changelog.py:read()
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
147 *
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
148 * <pre>
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
149 * format used:
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
150 * nodeid\n : manifest node in ascii
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
151 * user\n : user, no \n or \r allowed
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
152 * time tz extra\n : date (time is int or float, timezone is int)
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
153 * : extra is metadatas, encoded and separated by '\0'
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
154 * : older versions ignore it
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
155 * files\n\n : files modified by the cset, no \n or \r allowed
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
156 * (.*) : comment (free text, ideally utf-8)
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
157 *
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
158 * changelog v0 doesn't use extra
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
159 * </pre>
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
160 */
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
161 private RawChangeset() {
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
162 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
163
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
164 public Nodeid manifest() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
165 return manifest;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
166 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
167
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
168 public String user() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
169 return user;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
170 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
171
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
172 public String comment() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
173 return comment;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
174 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
175
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
176 public List<String> files() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
177 return files;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
178 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
179
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
180 public Date date() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
181 return time;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
182 }
211
644ee58c9f16 Compound HgDate object to provide flexible access to change date/time information
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 196
diff changeset
183
644ee58c9f16 Compound HgDate object to provide flexible access to change date/time information
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 196
diff changeset
184 /**
644ee58c9f16 Compound HgDate object to provide flexible access to change date/time information
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 196
diff changeset
185 * @return time zone value, as is, positive for Western Hemisphere.
644ee58c9f16 Compound HgDate object to provide flexible access to change date/time information
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 196
diff changeset
186 */
644ee58c9f16 Compound HgDate object to provide flexible access to change date/time information
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 196
diff changeset
187 public int timezone() {
644ee58c9f16 Compound HgDate object to provide flexible access to change date/time information
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 196
diff changeset
188 return timezone;
644ee58c9f16 Compound HgDate object to provide flexible access to change date/time information
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 196
diff changeset
189 }
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
190
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
191 public String dateString() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
192 // XXX keep once formatted? Perhaps, there's faster way to set up calendar/time zone?
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
193 StringBuilder sb = new StringBuilder(30);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
194 Formatter f = new Formatter(sb, Locale.US);
211
644ee58c9f16 Compound HgDate object to provide flexible access to change date/time information
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 196
diff changeset
195 TimeZone tz = TimeZone.getTimeZone(TimeZone.getAvailableIDs(timezone * 1000)[0]);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
196 // apparently timezone field records number of seconds time differs from UTC,
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
197 // i.e. value to substract from time to get UTC time. Calendar seems to add
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
198 // timezone offset to UTC, instead, hence sign change.
211
644ee58c9f16 Compound HgDate object to provide flexible access to change date/time information
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 196
diff changeset
199 // tz.setRawOffset(timezone * -1000);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
200 Calendar c = Calendar.getInstance(tz, Locale.US);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
201 c.setTime(time);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
202 f.format("%ta %<tb %<td %<tH:%<tM:%<tS %<tY %<tz", c);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
203 return sb.toString();
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
204 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
205
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
206 public Map<String, String> extras() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
207 return extras;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
208 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
209
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
210 public String branch() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
211 return extras.get("branch");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
212 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
213
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
214 @Override
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
215 public String toString() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
216 StringBuilder sb = new StringBuilder();
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
217 sb.append("Changeset {");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
218 sb.append("User: ").append(user).append(", ");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
219 sb.append("Comment: ").append(comment).append(", ");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
220 sb.append("Manifest: ").append(manifest).append(", ");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
221 sb.append("Date: ").append(time).append(", ");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
222 sb.append("Files: ").append(files.size());
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
223 for (String s : files) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
224 sb.append(", ").append(s);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
225 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
226 if (extras != null) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
227 sb.append(", Extra: ").append(extras);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
228 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
229 sb.append("}");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
230 return sb.toString();
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
231 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
232
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
233 @Override
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
234 public RawChangeset clone() {
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
235 try {
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
236 return (RawChangeset) super.clone();
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
237 } catch (CloneNotSupportedException ex) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
238 throw new InternalError(ex.toString());
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
239 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
240 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
241
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
242 /*package*/ static RawChangeset parse(DataAccess da) throws IOException, HgBadArgumentException {
365
3572fcb06473 Don't expose methods with DataAccess in public API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 363
diff changeset
243 byte[] data = da.byteArray();
3572fcb06473 Don't expose methods with DataAccess in public API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 363
diff changeset
244 RawChangeset rv = new RawChangeset();
3572fcb06473 Don't expose methods with DataAccess in public API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 363
diff changeset
245 rv.init(data, 0, data.length, null);
3572fcb06473 Don't expose methods with DataAccess in public API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 363
diff changeset
246 return rv;
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
247 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
248
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
249 // @param usersPool - it's likely user names get repeated again and again throughout repository. can be null
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
250 // FIXME replace HgBadArgumentException with HgInvalidDataFormatException or HgInvalidControlFileException
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
251 /* package-local */void init(byte[] data, int offset, int length, Pool<String> usersPool) throws HgBadArgumentException {
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
252 final int bufferEndIndex = offset + length;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
253 final byte lineBreak = (byte) '\n';
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
254 int breakIndex1 = indexOf(data, lineBreak, offset, bufferEndIndex);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
255 if (breakIndex1 == -1) {
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
256 throw new HgBadArgumentException("Bad Changeset data", null);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
257 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
258 Nodeid _nodeid = Nodeid.fromAscii(data, 0, breakIndex1);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
259 int breakIndex2 = indexOf(data, lineBreak, breakIndex1 + 1, bufferEndIndex);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
260 if (breakIndex2 == -1) {
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
261 throw new HgBadArgumentException("Bad Changeset data", null);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
262 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
263 String _user = new String(data, breakIndex1 + 1, breakIndex2 - breakIndex1 - 1);
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
264 if (usersPool != null) {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
265 _user = usersPool.unify(_user);
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
266 }
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
267 int breakIndex3 = indexOf(data, lineBreak, breakIndex2 + 1, bufferEndIndex);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
268 if (breakIndex3 == -1) {
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
269 throw new HgBadArgumentException("Bad Changeset data", null);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
270 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
271 String _timeString = new String(data, breakIndex2 + 1, breakIndex3 - breakIndex2 - 1);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
272 int space1 = _timeString.indexOf(' ');
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
273 if (space1 == -1) {
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
274 throw new HgBadArgumentException(String.format("Bad Changeset data: %s in [%d..%d]", "time string", breakIndex2+1, breakIndex3), null);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
275 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
276 int space2 = _timeString.indexOf(' ', space1 + 1);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
277 if (space2 == -1) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
278 space2 = _timeString.length();
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
279 }
363
d9dfa9fe9cec Decode escape sequences in changeset extras field
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 360
diff changeset
280 long unixTime = Long.parseLong(_timeString.substring(0, space1));
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
281 int _timezone = Integer.parseInt(_timeString.substring(space1 + 1, space2));
363
d9dfa9fe9cec Decode escape sequences in changeset extras field
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 360
diff changeset
282 // unixTime is local time, and timezone records difference of the local time to UTC.
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
283 Date _time = new Date(unixTime * 1000);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
284 String _extras = space2 < _timeString.length() ? _timeString.substring(space2 + 1) : null;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
285 Map<String, String> _extrasMap;
252
a6d19adc2636 HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 242
diff changeset
286 final String extras_branch_key = "branch";
386
73e875154afb Do not fail with empty extras string in changeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 367
diff changeset
287 if (_extras == null || _extras.trim().length() == 0) {
252
a6d19adc2636 HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 242
diff changeset
288 _extrasMap = Collections.singletonMap(extras_branch_key, HgRepository.DEFAULT_BRANCH_NAME);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
289 } else {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
290 _extrasMap = new HashMap<String, String>();
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
291 for (String pair : _extras.split("\00")) {
363
d9dfa9fe9cec Decode escape sequences in changeset extras field
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 360
diff changeset
292 pair = decode(pair);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
293 int eq = pair.indexOf(':');
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
294 _extrasMap.put(pair.substring(0, eq), pair.substring(eq + 1));
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
295 }
252
a6d19adc2636 HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 242
diff changeset
296 if (!_extrasMap.containsKey(extras_branch_key)) {
a6d19adc2636 HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 242
diff changeset
297 _extrasMap.put(extras_branch_key, HgRepository.DEFAULT_BRANCH_NAME);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
298 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
299 _extrasMap = Collections.unmodifiableMap(_extrasMap);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
300 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
301
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
302 //
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
303 int lastStart = breakIndex3 + 1;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
304 int breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
305 ArrayList<String> _files = null;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
306 if (breakIndex4 > lastStart) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
307 // if breakIndex4 == lastStart, we already found \n\n and hence there are no files (e.g. merge revision)
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
308 _files = new ArrayList<String>(5);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
309 while (breakIndex4 != -1 && breakIndex4 + 1 < bufferEndIndex) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
310 _files.add(new String(data, lastStart, breakIndex4 - lastStart));
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
311 lastStart = breakIndex4 + 1;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
312 if (data[breakIndex4 + 1] == lineBreak) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
313 // found \n\n
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
314 break;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
315 } else {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
316 breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex);
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
317 }
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
318 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
319 if (breakIndex4 == -1 || breakIndex4 >= bufferEndIndex) {
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
320 throw new HgBadArgumentException("Bad Changeset data", null);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
321 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
322 } else {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
323 breakIndex4--;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
324 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
325 String _comment;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
326 try {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
327 _comment = new String(data, breakIndex4 + 2, bufferEndIndex - breakIndex4 - 2, "UTF-8");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
328 // FIXME respect ui.fallbackencoding and try to decode if set
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
329 } catch (UnsupportedEncodingException ex) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
330 _comment = "";
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
331 // Could hardly happen
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
332 throw new HgBadArgumentException("Bad Changeset data", ex);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
333 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
334 // change this instance at once, don't leave it partially changes in case of error
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
335 this.manifest = _nodeid;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
336 this.user = _user;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
337 this.time = _time;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
338 this.timezone = _timezone;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
339 this.files = _files == null ? Collections.<String> emptyList() : Collections.unmodifiableList(_files);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
340 this.comment = _comment;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
341 this.extras = _extrasMap;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
342 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
343
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
344 private static int indexOf(byte[] src, byte what, int startOffset, int endIndex) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
345 for (int i = startOffset; i < endIndex; i++) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
346 if (src[i] == what) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
347 return i;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
348 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
349 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
350 return -1;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
351 }
363
d9dfa9fe9cec Decode escape sequences in changeset extras field
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 360
diff changeset
352
d9dfa9fe9cec Decode escape sequences in changeset extras field
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 360
diff changeset
353 private static String decode(String s) {
d9dfa9fe9cec Decode escape sequences in changeset extras field
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 360
diff changeset
354 if (s != null && s.indexOf('\\') != -1) {
d9dfa9fe9cec Decode escape sequences in changeset extras field
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 360
diff changeset
355 // TestAuxUtilities#testChangelogExtrasDecode
d9dfa9fe9cec Decode escape sequences in changeset extras field
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 360
diff changeset
356 return s.replace("\\\\", "\\").replace("\\n", "\n").replace("\\r", "\r").replace("\\0", "\00");
d9dfa9fe9cec Decode escape sequences in changeset extras field
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 360
diff changeset
357 }
d9dfa9fe9cec Decode escape sequences in changeset extras field
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 360
diff changeset
358 return s;
d9dfa9fe9cec Decode escape sequences in changeset extras field
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 360
diff changeset
359 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
360 }
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
361
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
362 private static class RawCsetCollector implements Inspector {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
363 final ArrayList<RawChangeset> result;
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
364
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
365 public RawCsetCollector(int count) {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
366 result = new ArrayList<RawChangeset>(count > 0 ? count : 5);
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
367 }
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
368
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
369 public void next(int revisionNumber, Nodeid nodeid, RawChangeset cset) {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
370 result.add(cset.clone());
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
371 }
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
372 }
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
373
312
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
374 private static class RawCsetParser implements RevlogStream.Inspector, Lifecycle {
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
375
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
376 private final Inspector inspector;
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
377 private final Pool<String> usersPool;
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
378 private final RawChangeset cset = new RawChangeset();
312
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
379 private final ProgressSupport progressHelper;
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
380 private IterateControlMediator iterateControl;
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
381
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
382 public RawCsetParser(HgChangelog.Inspector delegate) {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
383 assert delegate != null;
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
384 inspector = delegate;
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
385 usersPool = new Pool<String>();
312
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
386 progressHelper = ProgressSupport.Factory.get(delegate);
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
387 }
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
388
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
389 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess da) throws HgException {
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
390 try {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
391 byte[] data = da.byteArray();
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
392 cset.init(data, 0, data.length, usersPool);
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
393 // XXX there's no guarantee for Changeset.Callback that distinct instance comes each time, consider instance reuse
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
394 inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset);
312
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
395 progressHelper.worked(1);
366
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
396 } catch (IOException ex) {
189dc6dc1c3e Use exceptions to expose errors reading mercurial data
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 365
diff changeset
397 throw new HgException(ex); // XXX need better exception, perhaps smth like HgChangelogException (extends HgInvalidControlFileException)
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
398 }
312
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
399 if (iterateControl != null) {
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
400 iterateControl.checkCancelled();
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
401 }
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
402 }
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
403
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
404 public void start(int count, Callback callback, Object token) {
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
405 CancelSupport cs = CancelSupport.Factory.get(inspector, null);
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
406 iterateControl = cs == null ? null : new IterateControlMediator(cs, callback);
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
407 progressHelper.start(count);
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
408 }
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
409
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
410 public void finish(Object token) {
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
411 progressHelper.done();
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
412 }
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
413 }
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
414 }