Mercurial > hg4j
comparison cmdline/org/tmatesoft/hg/console/Main.java @ 143:b9700740553a
Command line tools parse and respect most of command-line arguments
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Thu, 17 Feb 2011 22:16:25 +0100 |
parents | |
children | d5268ca7715b |
comparison
equal
deleted
inserted
replaced
142:37a34044e6bd | 143:b9700740553a |
---|---|
1 /* | |
2 * Copyright (c) 2011 TMate Software Ltd | |
3 * | |
4 * This program is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; version 2 of the License. | |
7 * | |
8 * This program is distributed in the hope that it will be useful, | |
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 * GNU General Public License for more details. | |
12 * | |
13 * For information on how to redistribute this software under | |
14 * the terms of a license other than GNU General Public License | |
15 * contact TMate Software at support@hg4j.com | |
16 */ | |
17 package org.tmatesoft.hg.console; | |
18 | |
19 import static org.tmatesoft.hg.repo.HgRepository.TIP; | |
20 | |
21 import java.util.ArrayList; | |
22 import java.util.Collections; | |
23 import java.util.List; | |
24 import java.util.Map; | |
25 | |
26 import org.tmatesoft.hg.core.HgLogCommand.FileRevision; | |
27 import org.tmatesoft.hg.core.HgManifestCommand; | |
28 import org.tmatesoft.hg.core.Nodeid; | |
29 import org.tmatesoft.hg.internal.DigestHelper; | |
30 import org.tmatesoft.hg.repo.HgDataFile; | |
31 import org.tmatesoft.hg.repo.HgInternals; | |
32 import org.tmatesoft.hg.repo.HgManifest; | |
33 import org.tmatesoft.hg.repo.HgRepository; | |
34 import org.tmatesoft.hg.repo.HgStatusCollector; | |
35 import org.tmatesoft.hg.repo.HgStatusInspector; | |
36 import org.tmatesoft.hg.repo.HgWorkingCopyStatusCollector; | |
37 import org.tmatesoft.hg.util.Path; | |
38 | |
39 /** | |
40 * Various debug dumps. | |
41 * | |
42 * @author Artem Tikhomirov | |
43 * @author TMate Software Ltd. | |
44 */ | |
45 public class Main { | |
46 | |
47 private Options cmdLineOpts; | |
48 private HgRepository hgRepo; | |
49 | |
50 public Main(String[] args) throws Exception { | |
51 cmdLineOpts = Options.parse(args); | |
52 hgRepo = cmdLineOpts.findRepository(); | |
53 if (hgRepo.isInvalid()) { | |
54 System.err.printf("Can't find repository in: %s\n", hgRepo.getLocation()); | |
55 return; | |
56 } | |
57 System.out.println("REPO:" + hgRepo.getLocation()); | |
58 } | |
59 | |
60 public static void main(String[] args) throws Exception { | |
61 Main m = new Main(args); | |
62 m.dumpIgnored(); | |
63 m.dumpDirstate(); | |
64 m.testStatusInternals(); | |
65 m.catCompleteHistory(); | |
66 m.dumpCompleteManifestLow(); | |
67 m.dumpCompleteManifestHigh(); | |
68 m.bunchOfTests(); | |
69 } | |
70 | |
71 private void dumpIgnored() { | |
72 HgInternals debug = new HgInternals(hgRepo); | |
73 String[] toCheck = new String[] {"design.txt", "src/com/tmate/hgkit/ll/Changelog.java", "src/Extras.java", "bin/com/tmate/hgkit/ll/Changelog.class"}; | |
74 boolean[] checkResult = debug.checkIgnored(toCheck); | |
75 for (int i = 0; i < toCheck.length; i++) { | |
76 System.out.println("Ignored " + toCheck[i] + ": " + checkResult[i]); | |
77 } | |
78 } | |
79 | |
80 private void dumpDirstate() { | |
81 new HgInternals(hgRepo).dumpDirstate(); | |
82 } | |
83 | |
84 | |
85 private void catCompleteHistory() { | |
86 DigestHelper dh = new DigestHelper(); | |
87 for (String fname : cmdLineOpts.getList("")) { | |
88 System.out.println(fname); | |
89 HgDataFile fn = hgRepo.getFileNode(fname); | |
90 if (fn.exists()) { | |
91 int total = fn.getRevisionCount(); | |
92 System.out.printf("Total revisions: %d\n", total); | |
93 for (int i = 0; i < total; i++) { | |
94 byte[] content = fn.content(i); | |
95 System.out.println("==========>"); | |
96 System.out.println(new String(content)); | |
97 int[] parentRevisions = new int[2]; | |
98 byte[] parent1 = new byte[20]; | |
99 byte[] parent2 = new byte[20]; | |
100 fn.parents(i, parentRevisions, parent1, parent2); | |
101 System.out.println(dh.sha1(parent1, parent2, content).asHexString()); | |
102 } | |
103 } else { | |
104 System.out.println(">>>Not found!"); | |
105 } | |
106 } | |
107 } | |
108 | |
109 private void dumpCompleteManifestLow() { | |
110 hgRepo.getManifest().walk(0, TIP, new ManifestDump()); | |
111 } | |
112 | |
113 public static final class ManifestDump implements HgManifest.Inspector { | |
114 public boolean begin(int revision, Nodeid nid) { | |
115 System.out.printf("%d : %s\n", revision, nid); | |
116 return true; | |
117 } | |
118 | |
119 public boolean next(Nodeid nid, String fname, String flags) { | |
120 System.out.println(nid + "\t" + fname + "\t\t" + flags); | |
121 return true; | |
122 } | |
123 | |
124 public boolean end(int revision) { | |
125 System.out.println(); | |
126 return true; | |
127 } | |
128 } | |
129 | |
130 private void dumpCompleteManifestHigh() { | |
131 new HgManifestCommand(hgRepo).dirs(true).execute(new HgManifestCommand.Handler() { | |
132 | |
133 public void begin(Nodeid manifestRevision) { | |
134 System.out.println(">> " + manifestRevision); | |
135 } | |
136 public void dir(Path p) { | |
137 System.out.println(p); | |
138 } | |
139 public void file(FileRevision fileRevision) { | |
140 System.out.print(fileRevision.getRevision());; | |
141 System.out.print(" "); | |
142 System.out.println(fileRevision.getPath()); | |
143 } | |
144 | |
145 public void end(Nodeid manifestRevision) { | |
146 System.out.println(); | |
147 } | |
148 }); | |
149 } | |
150 | |
151 private void bunchOfTests() throws Exception { | |
152 HgInternals debug = new HgInternals(hgRepo); | |
153 debug.dumpDirstate(); | |
154 final StatusDump dump = new StatusDump(); | |
155 dump.showIgnored = false; | |
156 dump.showClean = false; | |
157 HgStatusCollector sc = new HgStatusCollector(hgRepo); | |
158 final int r1 = 0, r2 = 3; | |
159 System.out.printf("Status for changes between revision %d and %d:\n", r1, r2); | |
160 sc.walk(r1, r2, dump); | |
161 // | |
162 System.out.println("\n\nSame, but sorted in the way hg status does:"); | |
163 HgStatusCollector.Record r = sc.status(r1, r2); | |
164 sortAndPrint('M', r.getModified(), null); | |
165 sortAndPrint('A', r.getAdded(), null); | |
166 sortAndPrint('R', r.getRemoved(), null); | |
167 // | |
168 System.out.println("\n\nTry hg status --change <rev>:"); | |
169 sc.change(0, dump); | |
170 System.out.println("\nStatus against working dir:"); | |
171 HgWorkingCopyStatusCollector wcc = new HgWorkingCopyStatusCollector(hgRepo); | |
172 wcc.walk(TIP, dump); | |
173 System.out.println(); | |
174 System.out.printf("Manifest of the revision %d:\n", r2); | |
175 hgRepo.getManifest().walk(r2, r2, new ManifestDump()); | |
176 System.out.println(); | |
177 System.out.printf("\nStatus of working dir against %d:\n", r2); | |
178 r = wcc.status(r2); | |
179 sortAndPrint('M', r.getModified(), null); | |
180 sortAndPrint('A', r.getAdded(), r.getCopied()); | |
181 sortAndPrint('R', r.getRemoved(), null); | |
182 sortAndPrint('?', r.getUnknown(), null); | |
183 sortAndPrint('I', r.getIgnored(), null); | |
184 sortAndPrint('C', r.getClean(), null); | |
185 sortAndPrint('!', r.getMissing(), null); | |
186 } | |
187 | |
188 private void sortAndPrint(char prefix, List<Path> ul, Map<Path, Path> copies) { | |
189 ArrayList<Path> sortList = new ArrayList<Path>(ul); | |
190 Collections.sort(sortList); | |
191 for (Path s : sortList) { | |
192 System.out.print(prefix); | |
193 System.out.print(' '); | |
194 System.out.println(s); | |
195 if (copies != null && copies.containsKey(s)) { | |
196 System.out.println(" " + copies.get(s)); | |
197 } | |
198 } | |
199 } | |
200 | |
201 | |
202 private void testStatusInternals() { | |
203 HgDataFile n = hgRepo.getFileNode(Path.create("design.txt")); | |
204 for (String s : new String[] {"011dfd44417c72bd9e54cf89b82828f661b700ed", "e5529faa06d53e06a816e56d218115b42782f1ba", "c18e7111f1fc89a80a00f6a39d51288289a382fc"}) { | |
205 // expected: 359, 2123, 3079 | |
206 byte[] b = s.getBytes(); | |
207 final Nodeid nid = Nodeid.fromAscii(b, 0, b.length); | |
208 System.out.println(s + " : " + n.length(nid)); | |
209 } | |
210 } | |
211 | |
212 private static class StatusDump implements HgStatusInspector { | |
213 public boolean hideStatusPrefix = false; // hg status -n option | |
214 public boolean showCopied = true; // -C | |
215 public boolean showIgnored = true; // -i | |
216 public boolean showClean = true; // -c | |
217 | |
218 public void modified(Path fname) { | |
219 print('M', fname); | |
220 } | |
221 | |
222 public void added(Path fname) { | |
223 print('A', fname); | |
224 } | |
225 | |
226 public void copied(Path fnameOrigin, Path fnameAdded) { | |
227 added(fnameAdded); | |
228 if (showCopied) { | |
229 print(' ', fnameOrigin); | |
230 } | |
231 } | |
232 | |
233 public void removed(Path fname) { | |
234 print('R', fname); | |
235 } | |
236 | |
237 public void clean(Path fname) { | |
238 if (showClean) { | |
239 print('C', fname); | |
240 } | |
241 } | |
242 | |
243 public void missing(Path fname) { | |
244 print('!', fname); | |
245 } | |
246 | |
247 public void unknown(Path fname) { | |
248 print('?', fname); | |
249 } | |
250 | |
251 public void ignored(Path fname) { | |
252 if (showIgnored) { | |
253 print('I', fname); | |
254 } | |
255 } | |
256 | |
257 private void print(char status, Path fname) { | |
258 if (!hideStatusPrefix) { | |
259 System.out.print(status); | |
260 System.out.print(' '); | |
261 } | |
262 System.out.println(fname); | |
263 } | |
264 } | |
265 } |