Mercurial > hg4j
comparison cmdline/org/tmatesoft/hg/console/Log.java @ 206:63c9fed4369e
Sample command line tools for incoming/outgoing to use commands
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Thu, 28 Apr 2011 02:47:44 +0200 |
parents | 33a7d76f067b |
children | 41a778e3fd31 |
comparison
equal
deleted
inserted
replaced
205:ffc5f6d59f7e | 206:63c9fed4369e |
---|---|
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.console; | 17 package org.tmatesoft.hg.console; |
18 | 18 |
19 import java.util.Formatter; | |
20 import java.util.LinkedList; | |
21 import java.util.List; | 19 import java.util.List; |
22 | 20 |
23 import org.tmatesoft.hg.core.HgChangeset; | |
24 import org.tmatesoft.hg.core.HgLogCommand; | 21 import org.tmatesoft.hg.core.HgLogCommand; |
25 import org.tmatesoft.hg.core.HgLogCommand.FileRevision; | 22 import org.tmatesoft.hg.core.HgLogCommand.FileRevision; |
26 import org.tmatesoft.hg.core.Nodeid; | |
27 import org.tmatesoft.hg.repo.HgDataFile; | 23 import org.tmatesoft.hg.repo.HgDataFile; |
28 import org.tmatesoft.hg.repo.HgRepository; | 24 import org.tmatesoft.hg.repo.HgRepository; |
29 import org.tmatesoft.hg.util.Path; | |
30 | 25 |
31 | 26 |
32 /** | 27 /** |
33 * @author Artem Tikhomirov | 28 * @author Artem Tikhomirov |
34 * @author TMate Software Ltd. | 29 * @author TMate Software Ltd. |
43 if (hgRepo.isInvalid()) { | 38 if (hgRepo.isInvalid()) { |
44 System.err.printf("Can't find repository in: %s\n", hgRepo.getLocation()); | 39 System.err.printf("Can't find repository in: %s\n", hgRepo.getLocation()); |
45 return; | 40 return; |
46 } | 41 } |
47 final Dump dump = new Dump(hgRepo); | 42 final Dump dump = new Dump(hgRepo); |
48 dump.complete = cmdLineOpts.getBoolean("--debug"); | 43 dump.complete(cmdLineOpts.getBoolean("--debug")); |
49 dump.verbose = cmdLineOpts.getBoolean("-v", "--verbose"); | 44 dump.verbose(cmdLineOpts.getBoolean("-v", "--verbose")); |
50 dump.reverseOrder = true; | 45 final boolean reverseOrder = true; |
46 dump.reversed(reverseOrder); | |
51 HgLogCommand cmd = new HgLogCommand(hgRepo); | 47 HgLogCommand cmd = new HgLogCommand(hgRepo); |
52 for (String u : cmdLineOpts.getList("-u", "--user")) { | 48 for (String u : cmdLineOpts.getList("-u", "--user")) { |
53 cmd.user(u); | 49 cmd.user(u); |
54 } | 50 } |
55 for (String b : cmdLineOpts.getList("-b", "--branches")) { | 51 for (String b : cmdLineOpts.getList("-b", "--branches")) { |
67 cmd.execute(dump); | 63 cmd.execute(dump); |
68 } else { | 64 } else { |
69 // in fact, external (to dump inspector) --limit processing yelds incorrect results when other args | 65 // in fact, external (to dump inspector) --limit processing yelds incorrect results when other args |
70 // e.g. -u or -b are used (i.e. with -u shall give <limit> csets with user, not check last <limit> csets for user | 66 // e.g. -u or -b are used (i.e. with -u shall give <limit> csets with user, not check last <limit> csets for user |
71 int[] r = new int[] { 0, hgRepo.getChangelog().getRevisionCount() }; | 67 int[] r = new int[] { 0, hgRepo.getChangelog().getRevisionCount() }; |
72 if (fixRange(r, dump.reverseOrder, limit) == 0) { | 68 if (fixRange(r, reverseOrder, limit) == 0) { |
73 System.out.println("No changes"); | 69 System.out.println("No changes"); |
74 return; | 70 return; |
75 } | 71 } |
76 cmd.range(r[0], r[1]).execute(dump); | 72 cmd.range(r[0], r[1]).execute(dump); |
77 } | 73 } |
78 dump.complete(); | 74 dump.done(); |
79 } else { | 75 } else { |
80 for (String fname : files) { | 76 for (String fname : files) { |
81 HgDataFile f1 = hgRepo.getFileNode(fname); | 77 HgDataFile f1 = hgRepo.getFileNode(fname); |
82 System.out.println("History of the file: " + f1.getPath()); | 78 System.out.println("History of the file: " + f1.getPath()); |
83 if (limit == -1) { | 79 if (limit == -1) { |
84 cmd.file(f1.getPath(), true).execute(dump); | 80 cmd.file(f1.getPath(), true).execute(dump); |
85 } else { | 81 } else { |
86 int[] r = new int[] { 0, f1.getRevisionCount() }; | 82 int[] r = new int[] { 0, f1.getRevisionCount() }; |
87 if (fixRange(r, dump.reverseOrder, limit) == 0) { | 83 if (fixRange(r, reverseOrder, limit) == 0) { |
88 System.out.println("No changes"); | 84 System.out.println("No changes"); |
89 continue; | 85 continue; |
90 } | 86 } |
91 cmd.range(r[0], r[1]).file(f1.getPath(), true).execute(dump); | 87 cmd.range(r[0], r[1]).file(f1.getPath(), true).execute(dump); |
92 } | 88 } |
93 dump.complete(); | 89 dump.done(); |
94 } | 90 } |
95 } | 91 } |
96 // cmd = null; | 92 // cmd = null; |
97 System.out.println("Total time:" + (System.currentTimeMillis() - start)); | 93 System.out.println("Total time:" + (System.currentTimeMillis() - start)); |
98 // Main.force_gc(); | 94 // Main.force_gc(); |
111 int rv = start_end[1] - start_end[0]; | 107 int rv = start_end[1] - start_end[0]; |
112 start_end[1]--; // range needs index, not length | 108 start_end[1]--; // range needs index, not length |
113 return rv; | 109 return rv; |
114 } | 110 } |
115 | 111 |
116 private static final class Dump implements HgLogCommand.FileHistoryHandler { | 112 private static final class Dump extends ChangesetDumpHandler implements HgLogCommand.FileHistoryHandler { |
117 // params | |
118 boolean complete = false; // roughly --debug | |
119 boolean reverseOrder = false; | |
120 boolean verbose = true; // roughly -v | |
121 // own | |
122 private LinkedList<String> l = new LinkedList<String>(); | |
123 private final HgRepository repo; | |
124 // private HgChangelog.ParentWalker changelogWalker; | |
125 private final int tip ; | |
126 | 113 |
127 public Dump(HgRepository hgRepo) { | 114 public Dump(HgRepository hgRepo) { |
128 repo = hgRepo; | 115 super(hgRepo); |
129 tip = hgRepo.getChangelog().getLastRevision(); | |
130 } | 116 } |
131 | 117 |
132 public void copy(FileRevision from, FileRevision to) { | 118 public void copy(FileRevision from, FileRevision to) { |
133 System.out.printf("Got notified that %s(%s) was originally known as %s(%s)\n", to.getPath(), to.getRevision(), from.getPath(), from.getRevision()); | 119 System.out.printf("Got notified that %s(%s) was originally known as %s(%s)\n", to.getPath(), to.getRevision(), from.getPath(), from.getRevision()); |
134 } | 120 } |
135 | |
136 public void next(HgChangeset changeset) { | |
137 final String s = print(changeset); | |
138 if (reverseOrder) { | |
139 // XXX in fact, need to insert s into l according to changeset.getRevision() | |
140 // because when file history is being followed, revisions of the original file (with smaller revNumber) | |
141 // are reported *after* revisions of present file and with addFirst appear above them | |
142 l.addFirst(s); | |
143 } else { | |
144 System.out.print(s); | |
145 } | |
146 } | |
147 | |
148 public void complete() { | |
149 if (!reverseOrder) { | |
150 return; | |
151 } | |
152 for (String s : l) { | |
153 System.out.print(s); | |
154 } | |
155 l.clear(); | |
156 // changelogWalker = null; | |
157 } | |
158 | |
159 private String print(HgChangeset cset) { | |
160 StringBuilder sb = new StringBuilder(); | |
161 Formatter f = new Formatter(sb); | |
162 final Nodeid csetNodeid = cset.getNodeid(); | |
163 f.format("changeset: %d:%s\n", cset.getRevision(), complete ? csetNodeid : csetNodeid.shortNotation()); | |
164 if (cset.getRevision() == tip || repo.getTags().isTagged(csetNodeid)) { | |
165 | |
166 sb.append("tag: "); | |
167 for (String t : repo.getTags().tags(csetNodeid)) { | |
168 sb.append(t); | |
169 sb.append(' '); | |
170 } | |
171 if (cset.getRevision() == tip) { | |
172 sb.append("tip"); | |
173 } | |
174 sb.append('\n'); | |
175 } | |
176 if (complete) { | |
177 // if (changelogWalker == null) { | |
178 // changelogWalker = repo.getChangelog().new ParentWalker(); | |
179 // changelogWalker.init(); | |
180 // } | |
181 // Nodeid p1 = changelogWalker.safeFirstParent(csetNodeid); | |
182 // Nodeid p2 = changelogWalker.safeSecondParent(csetNodeid); | |
183 Nodeid p1 = cset.getFirstParentRevision(); | |
184 Nodeid p2 = cset.getSecondParentRevision(); | |
185 int p1x = p1 == Nodeid.NULL ? -1 : repo.getChangelog().getLocalRevision(p1); | |
186 int p2x = p2 == Nodeid.NULL ? -1 : repo.getChangelog().getLocalRevision(p2); | |
187 int mx = repo.getManifest().getLocalRevision(cset.getManifestRevision()); | |
188 f.format("parent: %d:%s\nparent: %d:%s\nmanifest: %d:%s\n", p1x, p1, p2x, p2, mx, cset.getManifestRevision()); | |
189 } | |
190 f.format("user: %s\ndate: %s\n", cset.getUser(), cset.getDate()); | |
191 if (!complete && verbose) { | |
192 final List<Path> files = cset.getAffectedFiles(); | |
193 sb.append("files: "); | |
194 for (Path s : files) { | |
195 sb.append(' '); | |
196 sb.append(s); | |
197 } | |
198 sb.append('\n'); | |
199 } | |
200 if (complete) { | |
201 if (!cset.getModifiedFiles().isEmpty()) { | |
202 sb.append("files: "); | |
203 for (FileRevision s : cset.getModifiedFiles()) { | |
204 sb.append(' '); | |
205 sb.append(s.getPath()); | |
206 } | |
207 sb.append('\n'); | |
208 } | |
209 if (!cset.getAddedFiles().isEmpty()) { | |
210 sb.append("files+: "); | |
211 for (FileRevision s : cset.getAddedFiles()) { | |
212 sb.append(' '); | |
213 sb.append(s.getPath()); | |
214 } | |
215 sb.append('\n'); | |
216 } | |
217 if (!cset.getRemovedFiles().isEmpty()) { | |
218 sb.append("files-: "); | |
219 for (Path s : cset.getRemovedFiles()) { | |
220 sb.append(' '); | |
221 sb.append(s); | |
222 } | |
223 sb.append('\n'); | |
224 } | |
225 // if (cset.extras() != null) { | |
226 // sb.append("extra: "); | |
227 // for (Map.Entry<String, String> e : cset.extras().entrySet()) { | |
228 // sb.append(' '); | |
229 // sb.append(e.getKey()); | |
230 // sb.append('='); | |
231 // sb.append(e.getValue()); | |
232 // } | |
233 // sb.append('\n'); | |
234 // } | |
235 } | |
236 if (complete || verbose) { | |
237 f.format("description:\n%s\n\n", cset.getComment()); | |
238 } else { | |
239 f.format("summary: %s\n\n", cset.getComment()); | |
240 } | |
241 return sb.toString(); | |
242 } | |
243 } | 121 } |
244 } | 122 } |