Mercurial > jhg
comparison src/org/tmatesoft/hg/core/HgCatCommand.java @ 367:2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Fri, 16 Dec 2011 15:37:27 +0100 |
parents | 91d75e1bac9f |
children | 8107b95f4280 |
comparison
equal
deleted
inserted
replaced
366:189dc6dc1c3e | 367:2fadf8695f8a |
---|---|
14 * the terms of a license other than GNU General Public License | 14 * the terms of a license other than GNU General Public License |
15 * contact TMate Software at support@hg4j.com | 15 * contact TMate Software at support@hg4j.com |
16 */ | 16 */ |
17 package org.tmatesoft.hg.core; | 17 package org.tmatesoft.hg.core; |
18 | 18 |
19 import static org.tmatesoft.hg.repo.HgInternals.wrongLocalRevision; | 19 import static org.tmatesoft.hg.repo.HgInternals.wrongRevisionIndex; |
20 import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; | 20 import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; |
21 import static org.tmatesoft.hg.repo.HgRepository.TIP; | 21 import static org.tmatesoft.hg.repo.HgRepository.TIP; |
22 | 22 |
23 import java.io.FileNotFoundException; | 23 import java.io.FileNotFoundException; |
24 import java.io.IOException; | 24 import java.io.IOException; |
40 */ | 40 */ |
41 public class HgCatCommand extends HgAbstractCommand<HgCatCommand> { | 41 public class HgCatCommand extends HgAbstractCommand<HgCatCommand> { |
42 | 42 |
43 private final HgRepository repo; | 43 private final HgRepository repo; |
44 private Path file; | 44 private Path file; |
45 private int localRevision = TIP; | 45 private int revisionIndex = TIP; |
46 private Nodeid revision; | 46 private Nodeid revision; |
47 private Nodeid cset; | 47 private Nodeid cset; |
48 | 48 |
49 public HgCatCommand(HgRepository hgRepo) { | 49 public HgCatCommand(HgRepository hgRepo) { |
50 repo = hgRepo; | 50 repo = hgRepo; |
63 file = fname; | 63 file = fname; |
64 return this; | 64 return this; |
65 } | 65 } |
66 | 66 |
67 /** | 67 /** |
68 * Select specific local revision of the file to cat. Note, revision numbering is of particular file, not that of | 68 * Select specific revision of the file to cat with local revision index. Note, revision numbering is of particular file, not that of |
69 * repository (i.e. revision 0 means initial content of the file, irrespective of changeset revision at the time of commit) | 69 * repository (i.e. revision 0 means initial content of the file, irrespective of changeset revision at the time of commit) |
70 * | 70 * |
71 * Invocation of this method clears revision set with {@link #revision(Nodeid)} or {@link #revision(int)} earlier. | 71 * Invocation of this method clears revision set with {@link #revision(Nodeid)} or {@link #revision(int)} earlier. |
72 * | 72 * |
73 * XXX rev can't be WORKING_COPY (if allowed, need to implement in #execute()) | 73 * @param fileRevisionIndex local revision index, non-negative, or one of predefined constants. Note, use of {@link HgRepository#BAD_REVISION}, |
74 * @param rev local revision number, non-negative, or one of predefined constants. Note, use of {@link HgRepository#BAD_REVISION}, | |
75 * although possible, makes little sense (command would fail if executed). | 74 * although possible, makes little sense (command would fail if executed). |
76 * @return <code>this</code> for convenience | 75 * @return <code>this</code> for convenience |
77 */ | 76 */ |
78 public HgCatCommand revision(int rev) { | 77 public HgCatCommand revision(int fileRevisionIndex) { |
79 if (wrongLocalRevision(rev)) { | 78 if (wrongRevisionIndex(fileRevisionIndex)) { |
80 throw new IllegalArgumentException(String.valueOf(rev)); | 79 throw new IllegalArgumentException(String.valueOf(fileRevisionIndex)); |
81 } | 80 } |
82 localRevision = rev; | 81 revisionIndex = fileRevisionIndex; |
83 revision = null; | 82 revision = null; |
84 cset = null; | 83 cset = null; |
85 return this; | 84 return this; |
86 } | 85 } |
87 | 86 |
88 /** | 87 /** |
89 * Select revision to read. Note, this revision is file revision (i.e. the one from manifest), not the changeset revision. | 88 * Select file revision to read. Note, this revision is file revision (i.e. the one from manifest), not the changeset revision. |
90 * | 89 * |
91 * Invocation of this method clears revision set with {@link #revision(int)} or {@link #revision(Nodeid)} earlier. | 90 * Invocation of this method clears revision set with {@link #revision(int)} or {@link #revision(Nodeid)} earlier. |
92 * | 91 * |
93 * @param nodeid - unique file revision identifier, Note, use of <code>null</code> or {@link Nodeid#NULL} is senseless | 92 * @param nodeid - unique file revision identifier, Note, use of <code>null</code> or {@link Nodeid#NULL} is senseless |
94 * @return <code>this</code> for convenience | 93 * @return <code>this</code> for convenience |
96 public HgCatCommand revision(Nodeid nodeid) { | 95 public HgCatCommand revision(Nodeid nodeid) { |
97 if (nodeid != null && nodeid.isNull()) { | 96 if (nodeid != null && nodeid.isNull()) { |
98 nodeid = null; | 97 nodeid = null; |
99 } | 98 } |
100 revision = nodeid; | 99 revision = nodeid; |
101 localRevision = BAD_REVISION; | 100 revisionIndex = BAD_REVISION; |
102 cset = null; | 101 cset = null; |
103 return this; | 102 return this; |
104 } | 103 } |
105 | 104 |
106 /** | 105 /** |
121 * | 120 * |
122 * @param nodeid changeset revision | 121 * @param nodeid changeset revision |
123 * @return <code>this</code> for convenience | 122 * @return <code>this</code> for convenience |
124 */ | 123 */ |
125 public HgCatCommand changeset(Nodeid nodeid) { | 124 public HgCatCommand changeset(Nodeid nodeid) { |
126 localRevision = BAD_REVISION; | 125 revisionIndex = BAD_REVISION; |
127 revision = null; | 126 revision = null; |
128 cset = nodeid; | 127 cset = nodeid; |
129 return this; | 128 return this; |
130 } | 129 } |
131 | 130 |
135 * @param sink output channel to write data to. | 134 * @param sink output channel to write data to. |
136 * @throws HgDataStreamException | 135 * @throws HgDataStreamException |
137 * @throws IllegalArgumentException when command arguments are incomplete or wrong | 136 * @throws IllegalArgumentException when command arguments are incomplete or wrong |
138 */ | 137 */ |
139 public void execute(ByteChannel sink) throws HgDataStreamException, HgInvalidControlFileException, CancelledException { | 138 public void execute(ByteChannel sink) throws HgDataStreamException, HgInvalidControlFileException, CancelledException { |
140 if (localRevision == BAD_REVISION && revision == null && cset == null) { | 139 if (revisionIndex == BAD_REVISION && revision == null && cset == null) { |
141 throw new IllegalArgumentException("File revision, corresponing local number, or a changset nodeid shall be specified"); | 140 throw new IllegalArgumentException("File revision, corresponing local number, or a changset nodeid shall be specified"); |
142 } | 141 } |
143 if (file == null) { | 142 if (file == null) { |
144 throw new IllegalArgumentException("Name of the file is missing"); | 143 throw new IllegalArgumentException("Name of the file is missing"); |
145 } | 144 } |
150 if (!dataFile.exists()) { | 149 if (!dataFile.exists()) { |
151 throw new HgDataStreamException(file, new FileNotFoundException(file.toString())); | 150 throw new HgDataStreamException(file, new FileNotFoundException(file.toString())); |
152 } | 151 } |
153 int revToExtract; | 152 int revToExtract; |
154 if (cset != null) { | 153 if (cset != null) { |
155 int csetRev = repo.getChangelog().getLocalRevision(cset); | 154 int csetRev = repo.getChangelog().getRevisionIndex(cset); |
156 Nodeid toExtract = null; | 155 Nodeid toExtract = null; |
157 do { | 156 do { |
158 toExtract = repo.getManifest().getFileRevision(csetRev, file); | 157 toExtract = repo.getManifest().getFileRevision(csetRev, file); |
159 if (toExtract == null) { | 158 if (toExtract == null) { |
160 if (dataFile.isCopy()) { | 159 if (dataFile.isCopy()) { |
166 } | 165 } |
167 } while (toExtract == null); | 166 } while (toExtract == null); |
168 if (toExtract == null) { | 167 if (toExtract == null) { |
169 throw new HgBadStateException(String.format("File %s nor its origins were not known at repository %s revision", file, cset.shortNotation())); | 168 throw new HgBadStateException(String.format("File %s nor its origins were not known at repository %s revision", file, cset.shortNotation())); |
170 } | 169 } |
171 revToExtract = dataFile.getLocalRevision(toExtract); | 170 revToExtract = dataFile.getRevisionIndex(toExtract); |
172 } else if (revision != null) { | 171 } else if (revision != null) { |
173 revToExtract = dataFile.getLocalRevision(revision); | 172 revToExtract = dataFile.getRevisionIndex(revision); |
174 } else { | 173 } else { |
175 revToExtract = localRevision; | 174 revToExtract = revisionIndex; |
176 } | 175 } |
177 ByteChannel sinkWrap; | 176 ByteChannel sinkWrap; |
178 if (getCancelSupport(null, false) == null) { | 177 if (getCancelSupport(null, false) == null) { |
179 // no command-specific cancel helper, no need for extra proxy | 178 // no command-specific cancel helper, no need for extra proxy |
180 // sink itself still may supply CS | 179 // sink itself still may supply CS |