Mercurial > jhg
comparison src/com/tmate/hgkit/console/Log.java @ 49:26e3eeaa3962
branch and user filtering for log operation
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Sat, 15 Jan 2011 01:15:38 +0100 |
parents | e34f90b9ded1 |
children | f1db8610da62 |
comparison
equal
deleted
inserted
replaced
48:e34f90b9ded1 | 49:26e3eeaa3962 |
---|---|
2 * Copyright (c) 2010, 2011 Artem Tikhomirov | 2 * Copyright (c) 2010, 2011 Artem Tikhomirov |
3 */ | 3 */ |
4 package com.tmate.hgkit.console; | 4 package com.tmate.hgkit.console; |
5 | 5 |
6 import java.util.Formatter; | 6 import java.util.Formatter; |
7 import java.util.LinkedHashSet; | |
7 import java.util.LinkedList; | 8 import java.util.LinkedList; |
8 import java.util.List; | 9 import java.util.List; |
10 import java.util.Map; | |
11 import java.util.Set; | |
9 | 12 |
10 import com.tmate.hgkit.fs.RepositoryLookup; | 13 import com.tmate.hgkit.fs.RepositoryLookup; |
11 import com.tmate.hgkit.ll.Changeset; | 14 import com.tmate.hgkit.ll.Changeset; |
12 import com.tmate.hgkit.ll.HgDataFile; | 15 import com.tmate.hgkit.ll.HgDataFile; |
13 import com.tmate.hgkit.ll.HgRepository; | 16 import com.tmate.hgkit.ll.HgRepository; |
14 import com.tmate.hgkit.ll.Nodeid; | 17 import com.tmate.hgkit.ll.Nodeid; |
18 import com.tmate.hgkit.ll.Revlog; | |
15 | 19 |
16 /** | 20 /** |
17 * @author artem | 21 * @author artem |
18 */ | 22 */ |
19 public class Log { | 23 public class Log { |
26 System.err.printf("Can't find repository in: %s\n", hgRepo.getLocation()); | 30 System.err.printf("Can't find repository in: %s\n", hgRepo.getLocation()); |
27 return; | 31 return; |
28 } | 32 } |
29 System.out.println(hgRepo.getLocation()); | 33 System.out.println(hgRepo.getLocation()); |
30 final Dump dump = new Dump(hgRepo); | 34 final Dump dump = new Dump(hgRepo); |
31 dump.complete = false; //cmdLineOpts; | 35 dump.complete = true; //cmdLineOpts; |
32 dump.reverseOrder = true; | 36 dump.reverseOrder = true; |
37 dump.branches = cmdLineOpts.branches; | |
38 if (cmdLineOpts.users != null) { | |
39 dump.users = new LinkedHashSet<String>(); | |
40 for (String u : cmdLineOpts.users) { | |
41 dump.users.add(u.toLowerCase()); | |
42 } | |
43 } | |
33 if (cmdLineOpts.files.isEmpty()) { | 44 if (cmdLineOpts.files.isEmpty()) { |
34 // no revisions and no limit | |
35 if (cmdLineOpts.limit == -1) { | 45 if (cmdLineOpts.limit == -1) { |
46 // no revisions and no limit | |
36 hgRepo.getChangelog().all(dump); | 47 hgRepo.getChangelog().all(dump); |
37 } else { | 48 } else { |
49 // in fact, external (to dump inspector) --limit processing yelds incorrect results when other args | |
50 // e.g. -u or -b are used (i.e. with -u shall give <limit> csets with user, not check last <limit> csets for user | |
38 int[] r = new int[] { 0, hgRepo.getChangelog().getRevisionCount() }; | 51 int[] r = new int[] { 0, hgRepo.getChangelog().getRevisionCount() }; |
39 if (fixRange(r, dump.reverseOrder, cmdLineOpts.limit) == 0) { | 52 if (fixRange(r, dump.reverseOrder, cmdLineOpts.limit) == 0) { |
40 System.out.println("No changes"); | 53 System.out.println("No changes"); |
41 return; | 54 return; |
42 } | 55 } |
59 } | 72 } |
60 dump.complete(); | 73 dump.complete(); |
61 } | 74 } |
62 } | 75 } |
63 // | 76 // |
64 // System.out.println("\n\n========================="); | 77 // XXX new ChangelogWalker().setFile("hello.c").setRevisionRange(1, 4).accept(new Visitor); |
65 // System.out.println("Range 1-3:"); | |
66 // f1.history(1,3, callback); | |
67 // | |
68 //new ChangelogWalker().setFile("hello.c").setRevisionRange(1, 4).accept(new Visitor); | |
69 } | 78 } |
70 | 79 |
71 private static int fixRange(int[] start_end, boolean reverse, int limit) { | 80 private static int fixRange(int[] start_end, boolean reverse, int limit) { |
72 assert start_end.length == 2; | 81 assert start_end.length == 2; |
73 if (limit < start_end[1]) { | 82 if (limit < start_end[1]) { |
81 int rv = start_end[1] - start_end[0]; | 90 int rv = start_end[1] - start_end[0]; |
82 start_end[1]--; // range needs index, not length | 91 start_end[1]--; // range needs index, not length |
83 return rv; | 92 return rv; |
84 } | 93 } |
85 | 94 |
95 // Differences with standard hg log output | |
96 // - complete == true (--debug) files are not broke down to modified,+ and - | |
86 private static final class Dump implements Changeset.Inspector { | 97 private static final class Dump implements Changeset.Inspector { |
87 // params | 98 // params |
88 boolean complete = false; | 99 boolean complete = false; |
89 boolean reverseOrder = false; | 100 boolean reverseOrder = false; |
101 Set<String> branches; | |
102 Set<String> users; // shall be lowercased | |
90 // own | 103 // own |
91 private LinkedList<String> l = new LinkedList<String>(); | 104 private LinkedList<String> l = new LinkedList<String>(); |
92 private final HgRepository repo; | 105 private final HgRepository repo; |
106 private Revlog.ParentWalker changelogWalker; | |
107 private final int tip ; | |
93 | 108 |
94 public Dump(HgRepository hgRepo) { | 109 public Dump(HgRepository hgRepo) { |
95 this.repo = hgRepo; | 110 repo = hgRepo; |
111 tip = hgRepo.getChangelog().getRevisionCount() - 1; | |
96 } | 112 } |
97 | 113 |
98 public void next(int revisionNumber, Nodeid nodeid, Changeset cset) { | 114 public void next(int revisionNumber, Nodeid nodeid, Changeset cset) { |
115 if (branches != null && !branches.contains(cset.branch())) { | |
116 return; | |
117 } | |
118 if (users != null) { | |
119 String csetUser = cset.user().toLowerCase(); | |
120 boolean found = false; | |
121 for (String u : users) { | |
122 if (csetUser.indexOf(u) != -1) { | |
123 found = true; | |
124 break; | |
125 } | |
126 } | |
127 if (!found) { | |
128 return; | |
129 } | |
130 } | |
99 final String s = print(revisionNumber, nodeid, cset); | 131 final String s = print(revisionNumber, nodeid, cset); |
100 if (reverseOrder) { | 132 if (reverseOrder) { |
101 l.addFirst(s); | 133 l.addFirst(s); |
102 } else { | 134 } else { |
103 System.out.print(s); | 135 System.out.print(s); |
110 } | 142 } |
111 for (String s : l) { | 143 for (String s : l) { |
112 System.out.print(s); | 144 System.out.print(s); |
113 } | 145 } |
114 l.clear(); | 146 l.clear(); |
147 changelogWalker = null; | |
115 } | 148 } |
116 | 149 |
117 private String print(int revNumber, Nodeid csetNodeid, Changeset cset) { | 150 private String print(int revNumber, Nodeid csetNodeid, Changeset cset) { |
118 StringBuilder sb = new StringBuilder(); | 151 StringBuilder sb = new StringBuilder(); |
119 Formatter f = new Formatter(sb); | 152 Formatter f = new Formatter(sb); |
120 f.format("changeset: %d:%s\n", revNumber, complete ? csetNodeid : csetNodeid.shortNotation()); | 153 f.format("changeset: %d:%s\n", revNumber, complete ? csetNodeid : csetNodeid.shortNotation()); |
154 if (revNumber == tip) { | |
155 sb.append("tag: tip\n"); | |
156 } | |
121 if (complete) { | 157 if (complete) { |
122 f.format("parent: %s\nparent: %s\nmanifest: %s\n", "-1", "-1", cset.manifest()); | 158 if (changelogWalker == null) { |
159 changelogWalker = repo.getChangelog().new ParentWalker(); | |
160 changelogWalker.init(); | |
161 } | |
162 Nodeid p1 = changelogWalker.safeFirstParent(csetNodeid); | |
163 Nodeid p2 = changelogWalker.safeSecondParent(csetNodeid); | |
164 int p1x = p1 == Nodeid.NULL ? -1 : repo.getChangelog().getLocalRevisionNumber(p1); | |
165 int p2x = p2 == Nodeid.NULL ? -1 : repo.getChangelog().getLocalRevisionNumber(p2); | |
166 int mx = repo.getManifest().getLocalRevisionNumber(cset.manifest()); | |
167 f.format("parent: %d:%s\nparent: %d:%s\nmanifest: %d:%s\n", p1x, p1, p2x, p2, mx, cset.manifest()); | |
123 } | 168 } |
124 f.format("user: %s\ndate: %s\n", cset.user(), cset.dateString()); | 169 f.format("user: %s\ndate: %s\n", cset.user(), cset.dateString()); |
125 if (complete) { | 170 if (complete) { |
126 final List<String> files = cset.files(); | 171 final List<String> files = cset.files(); |
127 sb.append("files: "); | 172 sb.append("files: "); |
128 for (String s : files) { | 173 for (String s : files) { |
129 sb.append(' '); | 174 sb.append(' '); |
130 sb.append(s); | 175 sb.append(s); |
131 } | 176 } |
177 if (cset.extras() != null) { | |
178 sb.append("\nextra: "); | |
179 for (Map.Entry<String, String> e : cset.extras().entrySet()) { | |
180 sb.append(' '); | |
181 sb.append(e.getKey()); | |
182 sb.append('='); | |
183 sb.append(e.getValue()); | |
184 } | |
185 } | |
132 f.format("\ndescription:\n%s\n\n", cset.comment()); | 186 f.format("\ndescription:\n%s\n\n", cset.comment()); |
133 } else { | 187 } else { |
134 f.format("summary: %s\n\n", cset.comment()); | 188 f.format("summary: %s\n\n", cset.comment()); |
135 } | |
136 if (cset.extras() != null) { | |
137 f.format("extra: " + cset.extras()); // TODO | |
138 } | 189 } |
139 return sb.toString(); | 190 return sb.toString(); |
140 } | 191 } |
141 } | 192 } |
142 } | 193 } |