annotate src/org/tmatesoft/hg/repo/HgChangelog.java @ 328:a674b8590362

Move file tree history to upper API level
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 05 Oct 2011 07:13:57 +0200
parents 09628675bcee
children 694ebabb5cb3
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
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
34 import org.tmatesoft.hg.core.HgBadStateException;
328
a674b8590362 Move file tree history to upper API level
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 317
diff changeset
35 import org.tmatesoft.hg.core.HgLogCommand;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
36 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
37 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
38 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
39 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
40 import org.tmatesoft.hg.internal.Pool;
77
c677e1593919 Moved RevlogStream implementation into .internal
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 74
diff changeset
41 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
42 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
43 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
44 import org.tmatesoft.hg.util.ProgressSupport;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
45
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
46 /**
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
47 * Representation of the Mercurial changelog file (list of ChangeSets)
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
48 *
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
49 * @author Artem Tikhomirov
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
50 * @author TMate Software Ltd.
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
51 */
97
ee2c750b036d Changelog to HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 77
diff changeset
52 public class HgChangelog extends Revlog {
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
53
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
54 /* 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
55 super(hgRepo, content);
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
56 }
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
57
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
58 public void all(final HgChangelog.Inspector inspector) {
137
144d771ee73c explicit op name instead math op to get last rev number
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 135
diff changeset
59 range(0, getLastRevision(), inspector);
48
e34f90b9ded1 Limit option for history/log
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 47
diff changeset
60 }
e34f90b9ded1 Limit option for history/log
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 47
diff changeset
61
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
62 public void range(int start, int end, final HgChangelog.Inspector inspector) {
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
63 if (inspector == null) {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
64 throw new IllegalArgumentException();
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
65 }
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
66 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
67 }
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
68
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
69 public List<RawChangeset> range(int start, int end) {
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
70 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
71 range(start, end, c);
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
72 return c.result;
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
73 }
3
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
74
242
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
75 /**
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
76 * 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
77 * 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
78 * @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
79 * @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
80 */
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
81 public void range(final HgChangelog.Inspector inspector, final int... revisions) {
242
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
82 Arrays.sort(revisions);
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
83 rangeInternal(inspector, revisions);
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
84 }
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
85
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 * 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
88 */
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
89 /*package-local*/ void rangeInternal(HgChangelog.Inspector inspector, int[] sortedRevisions) {
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
90 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
91 return;
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
92 }
242
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
93 if (inspector == null) {
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
94 throw new IllegalArgumentException();
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
95 }
ad6a046943be Improved reading of sparse revisions from a revlog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 236
diff changeset
96 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
97 }
236
883300108179 Speed up branches calculation when cached branch information is available
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 211
diff changeset
98
883300108179 Speed up branches calculation when cached branch information is available
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 211
diff changeset
99 public RawChangeset changeset(Nodeid nid) {
883300108179 Speed up branches calculation when cached branch information is available
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 211
diff changeset
100 int x = getLocalRevision(nid);
883300108179 Speed up branches calculation when cached branch information is available
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 211
diff changeset
101 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
102 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
103
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
104 public interface Inspector {
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
105 // 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
106 // 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
107 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
108 }
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 /**
317
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
111 * 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
112 * 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
113 * @see HgDataFile#history(TreeInspector)
328
a674b8590362 Move file tree history to upper API level
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 317
diff changeset
114 * @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
115 */
328
a674b8590362 Move file tree history to upper API level
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 317
diff changeset
116 @Deprecated
317
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
117 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
118 // 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
119 // 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
120 // 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
121 // 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
122 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
123 }
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
124
09628675bcee Rework file history build approach to match rest of the API
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 312
diff changeset
125 /**
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
126 * 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
127 */
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
128 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
129 // TODO immutable
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
130 private/* final */Nodeid manifest;
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
131 private String user;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
132 private String comment;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
133 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
134 private Date time;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
135 private int timezone;
161
9423235ca77b Record possible value (and knowledge source) for extras field
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 157
diff changeset
136 // 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
137 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
138
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
139 /**
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
140 * @see mercurial/changelog.py:read()
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
141 *
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
142 * <pre>
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
143 * format used:
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
144 * nodeid\n : manifest node in ascii
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
145 * user\n : user, no \n or \r allowed
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
146 * 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
147 * : extra is metadatas, encoded and separated by '\0'
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
148 * : older versions ignore it
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
149 * 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
150 * (.*) : comment (free text, ideally utf-8)
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
151 *
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
152 * changelog v0 doesn't use extra
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
153 * </pre>
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
154 */
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
155 private RawChangeset() {
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
156 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
157
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
158 public Nodeid manifest() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
159 return manifest;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
160 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
161
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
162 public String user() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
163 return user;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
164 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
165
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
166 public String comment() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
167 return comment;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
168 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
169
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
170 public List<String> files() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
171 return files;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
172 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
173
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
174 public Date date() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
175 return time;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
176 }
211
644ee58c9f16 Compound HgDate object to provide flexible access to change date/time information
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 196
diff changeset
177
644ee58c9f16 Compound HgDate object to provide flexible access to change date/time information
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 196
diff changeset
178 /**
644ee58c9f16 Compound HgDate object to provide flexible access to change date/time information
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 196
diff changeset
179 * @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
180 */
644ee58c9f16 Compound HgDate object to provide flexible access to change date/time information
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 196
diff changeset
181 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
182 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
183 }
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
184
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
185 public String dateString() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
186 // 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
187 StringBuilder sb = new StringBuilder(30);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
188 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
189 TimeZone tz = TimeZone.getTimeZone(TimeZone.getAvailableIDs(timezone * 1000)[0]);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
190 // apparently timezone field records number of seconds time differs from UTC,
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
191 // 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
192 // 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
193 // tz.setRawOffset(timezone * -1000);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
194 Calendar c = Calendar.getInstance(tz, Locale.US);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
195 c.setTime(time);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
196 f.format("%ta %<tb %<td %<tH:%<tM:%<tS %<tY %<tz", c);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
197 return sb.toString();
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
198 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
199
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
200 public Map<String, String> extras() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
201 return extras;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
202 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
203
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
204 public String branch() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
205 return extras.get("branch");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
206 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
207
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
208 @Override
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
209 public String toString() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
210 StringBuilder sb = new StringBuilder();
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
211 sb.append("Changeset {");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
212 sb.append("User: ").append(user).append(", ");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
213 sb.append("Comment: ").append(comment).append(", ");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
214 sb.append("Manifest: ").append(manifest).append(", ");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
215 sb.append("Date: ").append(time).append(", ");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
216 sb.append("Files: ").append(files.size());
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
217 for (String s : files) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
218 sb.append(", ").append(s);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
219 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
220 if (extras != null) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
221 sb.append(", Extra: ").append(extras);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
222 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
223 sb.append("}");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
224 return sb.toString();
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
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
227 @Override
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
228 public RawChangeset clone() {
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
229 try {
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
230 return (RawChangeset) super.clone();
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
231 } catch (CloneNotSupportedException ex) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
232 throw new InternalError(ex.toString());
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
233 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
234 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
235
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
236 public static RawChangeset parse(DataAccess da) {
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
237 try {
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
238 byte[] data = da.byteArray();
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
239 RawChangeset rv = new RawChangeset();
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
240 rv.init(data, 0, data.length, null);
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
241 return rv;
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
242 } catch (IOException ex) {
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
243 throw new HgBadStateException(ex); // FIXME "Error reading changeset data"
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
244 }
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
245 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
246
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
247 // @param usersPool - it's likely user names get repeated again and again throughout repository. can be null
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
248 /* package-local */void init(byte[] data, int offset, int length, Pool<String> usersPool) {
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
249 final int bufferEndIndex = offset + length;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
250 final byte lineBreak = (byte) '\n';
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
251 int breakIndex1 = indexOf(data, lineBreak, offset, bufferEndIndex);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
252 if (breakIndex1 == -1) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
253 throw new IllegalArgumentException("Bad Changeset data");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
254 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
255 Nodeid _nodeid = Nodeid.fromAscii(data, 0, breakIndex1);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
256 int breakIndex2 = indexOf(data, lineBreak, breakIndex1 + 1, bufferEndIndex);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
257 if (breakIndex2 == -1) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
258 throw new IllegalArgumentException("Bad Changeset data");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
259 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
260 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
261 if (usersPool != null) {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
262 _user = usersPool.unify(_user);
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
263 }
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
264 int breakIndex3 = indexOf(data, lineBreak, breakIndex2 + 1, bufferEndIndex);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
265 if (breakIndex3 == -1) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
266 throw new IllegalArgumentException("Bad Changeset data");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
267 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
268 String _timeString = new String(data, breakIndex2 + 1, breakIndex3 - breakIndex2 - 1);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
269 int space1 = _timeString.indexOf(' ');
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
270 if (space1 == -1) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
271 throw new IllegalArgumentException("Bad Changeset data");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
272 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
273 int space2 = _timeString.indexOf(' ', space1 + 1);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
274 if (space2 == -1) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
275 space2 = _timeString.length();
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
276 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
277 long unixTime = Long.parseLong(_timeString.substring(0, space1)); // XXX Float, perhaps
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
278 int _timezone = Integer.parseInt(_timeString.substring(space1 + 1, space2));
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
279 // XXX not sure need to add timezone here - I can't figure out whether Hg keeps GMT time, and records timezone just for info, or unixTime is taken local
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
280 // on commit and timezone is recorded to adjust it to UTC.
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
281 Date _time = new Date(unixTime * 1000);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
282 String _extras = space2 < _timeString.length() ? _timeString.substring(space2 + 1) : null;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
283 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
284 final String extras_branch_key = "branch";
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
285 if (_extras == null) {
252
a6d19adc2636 HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 242
diff changeset
286 _extrasMap = Collections.singletonMap(extras_branch_key, HgRepository.DEFAULT_BRANCH_NAME);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
287 } else {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
288 _extrasMap = new HashMap<String, String>();
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
289 for (String pair : _extras.split("\00")) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
290 int eq = pair.indexOf(':');
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
291 // FIXME need to decode key/value, @see changelog.py:decodeextra
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
292 _extrasMap.put(pair.substring(0, eq), pair.substring(eq + 1));
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
293 }
252
a6d19adc2636 HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 242
diff changeset
294 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
295 _extrasMap.put(extras_branch_key, HgRepository.DEFAULT_BRANCH_NAME);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
296 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
297 _extrasMap = Collections.unmodifiableMap(_extrasMap);
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
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 int lastStart = breakIndex3 + 1;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
302 int breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
303 ArrayList<String> _files = null;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
304 if (breakIndex4 > lastStart) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
305 // 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
306 _files = new ArrayList<String>(5);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
307 while (breakIndex4 != -1 && breakIndex4 + 1 < bufferEndIndex) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
308 _files.add(new String(data, lastStart, breakIndex4 - lastStart));
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
309 lastStart = breakIndex4 + 1;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
310 if (data[breakIndex4 + 1] == lineBreak) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
311 // found \n\n
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
312 break;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
313 } else {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
314 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
315 }
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
316 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
317 if (breakIndex4 == -1 || breakIndex4 >= bufferEndIndex) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
318 throw new IllegalArgumentException("Bad Changeset data");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
319 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
320 } else {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
321 breakIndex4--;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
322 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
323 String _comment;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
324 try {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
325 _comment = new String(data, breakIndex4 + 2, bufferEndIndex - breakIndex4 - 2, "UTF-8");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
326 // FIXME respect ui.fallbackencoding and try to decode if set
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
327 } catch (UnsupportedEncodingException ex) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
328 _comment = "";
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
329 throw new IllegalStateException("Could hardly happen");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
330 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
331 // 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
332 this.manifest = _nodeid;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
333 this.user = _user;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
334 this.time = _time;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
335 this.timezone = _timezone;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
336 this.files = _files == null ? Collections.<String> emptyList() : Collections.unmodifiableList(_files);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
337 this.comment = _comment;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
338 this.extras = _extrasMap;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
339 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
340
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
341 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
342 for (int i = startOffset; i < endIndex; i++) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
343 if (src[i] == what) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
344 return i;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
345 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
346 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
347 return -1;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
348 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
349 }
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
350
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
351 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
352 final ArrayList<RawChangeset> result;
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
353
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
354 public RawCsetCollector(int count) {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
355 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
356 }
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
357
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
358 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
359 result.add(cset.clone());
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
360 }
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
361 }
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
362
312
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
363 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
364
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
365 private final Inspector inspector;
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
366 private final Pool<String> usersPool;
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
367 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
368 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
369 private IterateControlMediator iterateControl;
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
370
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
371 public RawCsetParser(HgChangelog.Inspector delegate) {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
372 assert delegate != null;
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
373 inspector = delegate;
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
374 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
375 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
376 }
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
377
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
378 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess da) {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
379 try {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
380 byte[] data = da.byteArray();
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
381 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
382 // 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
383 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
384 progressHelper.worked(1);
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
385 } catch (Exception ex) {
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
386 throw new HgBadStateException(ex); // FIXME exception handling
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
387 }
312
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
388 if (iterateControl != null) {
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
389 iterateControl.checkCancelled();
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
390 }
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
391 }
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
392
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
393 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
394 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
395 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
396 progressHelper.start(count);
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
397 }
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
398
f9f3e9b67ccc Facilitate cancellation and progress reporting in changelog and manifest iterations
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 252
diff changeset
399 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
400 progressHelper.done();
196
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
401 }
e2115da4cf6a Pool objects to avoid memory polution with duplicates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 182
diff changeset
402 }
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
403 }