annotate src/org/tmatesoft/hg/repo/HgChangelog.java @ 158:b413b16d10a5

Integer offsets and file length explictly, rather than casts throughout code. Inflater may benefit from total length hint, but shall calculate it by its own if needed
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 09 Mar 2011 13:16:37 +0100
parents d5268ca7715b
children 9423235ca77b
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;
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
24 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
25 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
26 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
27 import java.util.HashMap;
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
28 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
29 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
30 import java.util.Map;
146
8c9f729f4dfa Timezone finally in use
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 137
diff changeset
31 import java.util.TimeZone;
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
32
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
33 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
34 import org.tmatesoft.hg.internal.DataAccess;
77
c677e1593919 Moved RevlogStream implementation into .internal
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 74
diff changeset
35 import org.tmatesoft.hg.internal.RevlogStream;
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
36
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
37 /**
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
38 * Representation of the Mercurial changelog file (list of ChangeSets)
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
39 *
74
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
40 * @author Artem Tikhomirov
6f1b88693d48 Complete refactoring to org.tmatesoft
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
41 * @author TMate Software Ltd.
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
42 */
97
ee2c750b036d Changelog to HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 77
diff changeset
43 public class HgChangelog extends Revlog {
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
44
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
45 /* 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
46 super(hgRepo, content);
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
47 }
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
48
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
49 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
50 range(0, getLastRevision(), inspector);
48
e34f90b9ded1 Limit option for history/log
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 47
diff changeset
51 }
e34f90b9ded1 Limit option for history/log
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 47
diff changeset
52
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
53 public void range(int start, int end, final HgChangelog.Inspector inspector) {
77
c677e1593919 Moved RevlogStream implementation into .internal
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 74
diff changeset
54 RevlogStream.Inspector i = new RevlogStream.Inspector() {
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
55
51
9429c7bd1920 Try DataAccess to reach revision data instead of plain byte arrays
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
56 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess da) {
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
57 RawChangeset cset = RawChangeset.parse(da);
3
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
58 // XXX there's no guarantee for Changeset.Callback that distinct instance comes each time, consider instance reuse
47
b01500fe2604 Log command output to match 'hg log'
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 21
diff changeset
59 inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset);
3
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
60 }
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
61 };
48
e34f90b9ded1 Limit option for history/log
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 47
diff changeset
62 content.iterate(start, end, true, i);
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
63 }
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
64
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
65 public List<RawChangeset> range(int start, int end) {
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
66 final ArrayList<RawChangeset> rv = new ArrayList<RawChangeset>(end - start + 1);
77
c677e1593919 Moved RevlogStream implementation into .internal
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 74
diff changeset
67 RevlogStream.Inspector i = new RevlogStream.Inspector() {
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
68
51
9429c7bd1920 Try DataAccess to reach revision data instead of plain byte arrays
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
69 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess da) {
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
70 RawChangeset cset = RawChangeset.parse(da);
3
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
71 rv.add(cset);
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
72 }
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
73 };
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
74 content.iterate(start, end, true, i);
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
75 return rv;
2
08db726a0fb7 Shaping out low-level Hg structures
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 0
diff changeset
76 }
3
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
77
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
78 public void range(final HgChangelog.Inspector inspector, final int... revisions) {
3
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
79 if (revisions == null || revisions.length == 0) {
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
80 return;
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
81 }
77
c677e1593919 Moved RevlogStream implementation into .internal
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 74
diff changeset
82 RevlogStream.Inspector i = new RevlogStream.Inspector() {
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
83
51
9429c7bd1920 Try DataAccess to reach revision data instead of plain byte arrays
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 48
diff changeset
84 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess da) {
3
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
85 if (Arrays.binarySearch(revisions, revisionNumber) >= 0) {
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
86 RawChangeset cset = RawChangeset.parse(da);
47
b01500fe2604 Log command output to match 'hg log'
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 21
diff changeset
87 inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset);
3
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
88 }
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
89 }
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
90 };
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
91 Arrays.sort(revisions);
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
92 content.iterate(revisions[0], revisions[revisions.length - 1], true, i);
24bb4f365164 Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 2
diff changeset
93 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
94
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
95 public interface Inspector {
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
96 // TODO describe whether cset is new instance each time
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
97 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
98 }
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
99
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
100 /**
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
101 * 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
102 */
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
103 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
104 // TODO immutable
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
105 private/* final */Nodeid manifest;
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
106 private String user;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
107 private String comment;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
108 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
109 private Date time;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
110 private int timezone;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
111 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
112
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
113 /**
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
114 * @see mercurial/changelog.py:read()
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
115 *
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
116 * <pre>
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
117 * format used:
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
118 * nodeid\n : manifest node in ascii
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
119 * user\n : user, no \n or \r allowed
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
120 * 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
121 * : extra is metadatas, encoded and separated by '\0'
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
122 * : older versions ignore it
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
123 * 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
124 * (.*) : comment (free text, ideally utf-8)
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
125 *
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
126 * changelog v0 doesn't use extra
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
127 * </pre>
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
128 */
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
129 private RawChangeset() {
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
130 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
131
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
132 public Nodeid manifest() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
133 return manifest;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
134 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
135
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
136 public String user() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
137 return user;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
138 }
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 public String comment() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
141 return comment;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
142 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
143
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
144 public List<String> files() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
145 return files;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
146 }
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 public Date date() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
149 return time;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
150 }
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 public String dateString() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
153 // 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
154 StringBuilder sb = new StringBuilder(30);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
155 Formatter f = new Formatter(sb, Locale.US);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
156 TimeZone tz = TimeZone.getTimeZone("GMT");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
157 // apparently timezone field records number of seconds time differs from UTC,
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
158 // 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
159 // timezone offset to UTC, instead, hence sign change.
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
160 tz.setRawOffset(timezone * -1000);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
161 Calendar c = Calendar.getInstance(tz, Locale.US);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
162 c.setTime(time);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
163 f.format("%ta %<tb %<td %<tH:%<tM:%<tS %<tY %<tz", c);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
164 return sb.toString();
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
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
167 public Map<String, String> extras() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
168 return extras;
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
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
171 public String branch() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
172 return extras.get("branch");
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
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
175 @Override
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
176 public String toString() {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
177 StringBuilder sb = new StringBuilder();
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
178 sb.append("Changeset {");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
179 sb.append("User: ").append(user).append(", ");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
180 sb.append("Comment: ").append(comment).append(", ");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
181 sb.append("Manifest: ").append(manifest).append(", ");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
182 sb.append("Date: ").append(time).append(", ");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
183 sb.append("Files: ").append(files.size());
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
184 for (String s : files) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
185 sb.append(", ").append(s);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
186 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
187 if (extras != null) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
188 sb.append(", Extra: ").append(extras);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
189 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
190 sb.append("}");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
191 return sb.toString();
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
192 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
193
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
194 @Override
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
195 public RawChangeset clone() {
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
196 try {
154
ba2bf656f00f Changeset => RawChangeset
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 153
diff changeset
197 return (RawChangeset) super.clone();
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
198 } catch (CloneNotSupportedException ex) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
199 throw new InternalError(ex.toString());
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
200 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
201 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
202
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
203 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
204 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
205 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
206 RawChangeset rv = new RawChangeset();
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
207 rv.init(data, 0, data.length);
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
208 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
209 } catch (IOException ex) {
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
210 throw new IllegalArgumentException(ex); // FIXME better handling of IOExc
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
211 }
153
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 /* package-local */void init(byte[] data, int offset, int length) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
215 final int bufferEndIndex = offset + length;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
216 final byte lineBreak = (byte) '\n';
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
217 int breakIndex1 = indexOf(data, lineBreak, offset, bufferEndIndex);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
218 if (breakIndex1 == -1) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
219 throw new IllegalArgumentException("Bad Changeset data");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
220 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
221 Nodeid _nodeid = Nodeid.fromAscii(data, 0, breakIndex1);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
222 int breakIndex2 = indexOf(data, lineBreak, breakIndex1 + 1, bufferEndIndex);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
223 if (breakIndex2 == -1) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
224 throw new IllegalArgumentException("Bad Changeset data");
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 String _user = new String(data, breakIndex1 + 1, breakIndex2 - breakIndex1 - 1);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
227 int breakIndex3 = indexOf(data, lineBreak, breakIndex2 + 1, bufferEndIndex);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
228 if (breakIndex3 == -1) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
229 throw new IllegalArgumentException("Bad Changeset data");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
230 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
231 String _timeString = new String(data, breakIndex2 + 1, breakIndex3 - breakIndex2 - 1);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
232 int space1 = _timeString.indexOf(' ');
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
233 if (space1 == -1) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
234 throw new IllegalArgumentException("Bad Changeset data");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
235 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
236 int space2 = _timeString.indexOf(' ', space1 + 1);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
237 if (space2 == -1) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
238 space2 = _timeString.length();
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 long unixTime = Long.parseLong(_timeString.substring(0, space1)); // XXX Float, perhaps
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
241 int _timezone = Integer.parseInt(_timeString.substring(space1 + 1, space2));
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
242 // 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
243 // on commit and timezone is recorded to adjust it to UTC.
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
244 Date _time = new Date(unixTime * 1000);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
245 String _extras = space2 < _timeString.length() ? _timeString.substring(space2 + 1) : null;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
246 Map<String, String> _extrasMap;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
247 if (_extras == null) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
248 _extrasMap = Collections.singletonMap("branch", "default");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
249 } else {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
250 _extrasMap = new HashMap<String, String>();
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
251 for (String pair : _extras.split("\00")) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
252 int eq = pair.indexOf(':');
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
253 // FIXME need to decode key/value, @see changelog.py:decodeextra
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
254 _extrasMap.put(pair.substring(0, eq), pair.substring(eq + 1));
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
255 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
256 if (!_extrasMap.containsKey("branch")) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
257 _extrasMap.put("branch", "default");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
258 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
259 _extrasMap = Collections.unmodifiableMap(_extrasMap);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
260 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
261
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 int lastStart = breakIndex3 + 1;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
264 int breakIndex4 = indexOf(data, lineBreak, lastStart, bufferEndIndex);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
265 ArrayList<String> _files = null;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
266 if (breakIndex4 > lastStart) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
267 // 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
268 _files = new ArrayList<String>(5);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
269 while (breakIndex4 != -1 && breakIndex4 + 1 < bufferEndIndex) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
270 _files.add(new String(data, lastStart, breakIndex4 - lastStart));
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
271 lastStart = breakIndex4 + 1;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
272 if (data[breakIndex4 + 1] == lineBreak) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
273 // found \n\n
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
274 break;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
275 } else {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
276 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
277 }
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
278 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
279 if (breakIndex4 == -1 || breakIndex4 >= bufferEndIndex) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
280 throw new IllegalArgumentException("Bad Changeset data");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
281 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
282 } else {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
283 breakIndex4--;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
284 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
285 String _comment;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
286 try {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
287 _comment = new String(data, breakIndex4 + 2, bufferEndIndex - breakIndex4 - 2, "UTF-8");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
288 // FIXME respect ui.fallbackencoding and try to decode if set
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
289 } catch (UnsupportedEncodingException ex) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
290 _comment = "";
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
291 throw new IllegalStateException("Could hardly happen");
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
292 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
293 // 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
294 this.manifest = _nodeid;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
295 this.user = _user;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
296 this.time = _time;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
297 this.timezone = _timezone;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
298 this.files = _files == null ? Collections.<String> emptyList() : Collections.unmodifiableList(_files);
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
299 this.comment = _comment;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
300 this.extras = _extrasMap;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
301 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
302
153
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
303 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
304 for (int i = startOffset; i < endIndex; i++) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
305 if (src[i] == what) {
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
306 return i;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
307 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
308 }
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
309 return -1;
ab7ea2ac21cb Format code
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 146
diff changeset
310 }
129
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
311 }
645829962785 core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 102
diff changeset
312
0
dbd663faec1f Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
313 }