Mercurial > jhg
comparison cmdline/org/tmatesoft/hg/console/Status.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 | 4a948ec83980 |
| children | d5268ca7715b |
comparison
equal
deleted
inserted
replaced
| 142:37a34044e6bd | 143:b9700740553a |
|---|---|
| 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 static org.tmatesoft.hg.repo.HgRepository.TIP; | 19 import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; |
| 20 | 20 |
| 21 import java.util.ArrayList; | 21 import java.util.ArrayList; |
| 22 import java.util.Collections; | 22 import java.util.Collections; |
| 23 import java.util.HashMap; | |
| 24 import java.util.LinkedList; | |
| 23 import java.util.List; | 25 import java.util.List; |
| 24 import java.util.Map; | 26 import java.util.Map; |
| 27 import java.util.TreeMap; | |
| 25 | 28 |
| 26 import org.tmatesoft.hg.core.Nodeid; | 29 import org.tmatesoft.hg.core.HgRepoFacade; |
| 27 import org.tmatesoft.hg.repo.HgDataFile; | 30 import org.tmatesoft.hg.core.HgStatus; |
| 28 import org.tmatesoft.hg.repo.HgRepository; | 31 import org.tmatesoft.hg.core.HgStatus.Kind; |
| 29 import org.tmatesoft.hg.repo.HgStatusInspector; | 32 import org.tmatesoft.hg.core.HgStatusCommand; |
| 30 import org.tmatesoft.hg.repo.HgInternals; | |
| 31 import org.tmatesoft.hg.repo.HgStatusCollector; | |
| 32 import org.tmatesoft.hg.repo.HgStatusCollector.Record; | |
| 33 import org.tmatesoft.hg.repo.HgWorkingCopyStatusCollector; | |
| 34 import org.tmatesoft.hg.util.Path; | 33 import org.tmatesoft.hg.util.Path; |
| 35 | 34 |
| 36 /** | 35 /** |
| 37 * | 36 * |
| 38 * @author Artem Tikhomirov | 37 * @author Artem Tikhomirov |
| 40 */ | 39 */ |
| 41 public class Status { | 40 public class Status { |
| 42 | 41 |
| 43 public static void main(String[] args) throws Exception { | 42 public static void main(String[] args) throws Exception { |
| 44 Options cmdLineOpts = Options.parse(args); | 43 Options cmdLineOpts = Options.parse(args); |
| 45 HgRepository hgRepo = cmdLineOpts.findRepository(); | 44 HgRepoFacade hgRepo = new HgRepoFacade(); |
| 46 if (hgRepo.isInvalid()) { | 45 if (!hgRepo.init(cmdLineOpts.findRepository())) { |
| 47 System.err.printf("Can't find repository in: %s\n", hgRepo.getLocation()); | 46 System.err.printf("Can't find repository in: %s\n", hgRepo.getRepository().getLocation()); |
| 48 return; | 47 return; |
| 49 } | 48 } |
| 50 System.out.println(hgRepo.getLocation()); | |
| 51 // | 49 // |
| 52 // bunchOfTests(hgRepo); | 50 HgStatusCommand cmd = hgRepo.createStatusCommand(); |
| 53 // | 51 if (cmdLineOpts.getBoolean("-A", "-all")) { |
| 54 // new Internals(hgRepo).dumpDirstate(); | 52 cmd.all(); |
| 55 // | 53 } else { |
| 56 statusWorkingCopy(hgRepo); | 54 // default: mardu |
| 57 //statusRevVsWorkingCopy(hgRepo); | 55 cmd.modified(cmdLineOpts.getBoolean(true, "-m", "--modified")); |
| 58 } | 56 cmd.added(cmdLineOpts.getBoolean(true, "-a", "--added")); |
| 57 cmd.removed(cmdLineOpts.getBoolean(true, "-r", "--removed")); | |
| 58 cmd.deleted(cmdLineOpts.getBoolean(true, "-d", "--deleted")); | |
| 59 cmd.unknown(cmdLineOpts.getBoolean(true, "-u", "--unknonwn")); | |
| 60 cmd.clean(cmdLineOpts.getBoolean("-c", "--clean")); | |
| 61 cmd.ignored(cmdLineOpts.getBoolean("-i", "--ignored")); | |
| 62 } | |
| 63 // cmd.subrepo(cmdLineOpts.getBoolean("-S", "--subrepos")) | |
| 64 final boolean noStatusPrefix = cmdLineOpts.getBoolean("-n", "--no-status"); | |
| 65 final boolean showCopies = cmdLineOpts.getBoolean("-C", "--copies"); | |
| 66 class StatusHandler implements HgStatusCommand.Handler { | |
| 67 | |
| 68 final Map<HgStatus.Kind, List<Path>> data = new TreeMap<HgStatus.Kind, List<Path>>(); | |
| 69 final Map<Path, Path> copies = showCopies ? new HashMap<Path,Path>() : null; | |
| 70 | |
| 71 public void handleStatus(HgStatus s) { | |
| 72 List<Path> l = data.get(s.getKind()); | |
| 73 if (l == null) { | |
| 74 l = new LinkedList<Path>(); | |
| 75 data.put(s.getKind(), l); | |
| 76 } | |
| 77 l.add(s.getPath()); | |
| 78 if (s.isCopy() && showCopies) { | |
| 79 copies.put(s.getPath(), s.getOriginalPath()); | |
| 80 } | |
| 81 } | |
| 82 | |
| 83 public void dump() { | |
| 84 sortAndPrint('M', data.get(Kind.Modified), null); | |
| 85 sortAndPrint('A', data.get(Kind.Added), copies); | |
| 86 sortAndPrint('R', data.get(Kind.Removed), null); | |
| 87 sortAndPrint('?', data.get(Kind.Unknown), null); | |
| 88 sortAndPrint('I', data.get(Kind.Ignored), null); | |
| 89 sortAndPrint('C', data.get(Kind.Clean), null); | |
| 90 sortAndPrint('!', data.get(Kind.Missing), null); | |
| 91 } | |
| 59 | 92 |
| 60 private static void statusWorkingCopy(HgRepository hgRepo) { | 93 private void sortAndPrint(char prefix, List<Path> ul, Map<Path, Path> copies) { |
| 61 HgWorkingCopyStatusCollector wcc = new HgWorkingCopyStatusCollector(hgRepo); | 94 if (ul == null) { |
| 62 HgStatusCollector.Record r = new HgStatusCollector.Record(); | 95 return; |
| 63 wcc.walk(TIP, r); | 96 } |
| 64 mardu(r); | 97 ArrayList<Path> sortList = new ArrayList<Path>(ul); |
| 65 } | 98 Collections.sort(sortList); |
| 99 for (Path s : sortList) { | |
| 100 if (!noStatusPrefix) { | |
| 101 System.out.print(prefix); | |
| 102 System.out.print(' '); | |
| 103 } | |
| 104 System.out.println(s); | |
| 105 if (copies != null && copies.containsKey(s)) { | |
| 106 System.out.println(" " + copies.get(s)); | |
| 107 } | |
| 108 } | |
| 109 } | |
| 110 }; | |
| 66 | 111 |
| 67 private static void mardu(Record r) { | 112 StatusHandler statusHandler = new StatusHandler(); |
| 68 sortAndPrint('M', r.getModified()); | 113 int changeRev = cmdLineOpts.getSingleInt(BAD_REVISION, "--change"); |
| 69 sortAndPrint('A', r.getAdded(), r.getCopied()); | 114 if (changeRev != BAD_REVISION) { |
| 70 sortAndPrint('R', r.getRemoved()); | 115 cmd.change(changeRev); |
| 71 sortAndPrint('?', r.getUnknown()); | 116 } else { |
| 72 // sortAndPrint('I', r.getIgnored()); | 117 List<String> revisions = cmdLineOpts.getList("--rev"); |
| 73 // sortAndPrint('C', r.getClean()); | 118 int size = revisions.size(); |
| 74 sortAndPrint('!', r.getMissing()); | 119 if (size > 1) { |
| 75 } | 120 cmd.base(Integer.parseInt(revisions.get(size - 2))).revision(Integer.parseInt(revisions.get(size - 1))); |
| 76 | 121 } else if (size > 0) { |
| 77 private static void statusRevVsWorkingCopy(HgRepository hgRepo) { | 122 cmd.base(Integer.parseInt(revisions.get(0))); |
| 78 HgWorkingCopyStatusCollector wcc = new HgWorkingCopyStatusCollector(hgRepo); | |
| 79 HgStatusCollector.Record r = new HgStatusCollector.Record(); | |
| 80 wcc.walk(3, r); | |
| 81 mardu(r); | |
| 82 } | |
| 83 | |
| 84 private static void bunchOfTests(HgRepository hgRepo) throws Exception { | |
| 85 HgInternals debug = new HgInternals(hgRepo); | |
| 86 debug.dumpDirstate(); | |
| 87 final StatusDump dump = new StatusDump(); | |
| 88 dump.showIgnored = false; | |
| 89 dump.showClean = false; | |
| 90 HgStatusCollector sc = new HgStatusCollector(hgRepo); | |
| 91 final int r1 = 0, r2 = 3; | |
| 92 System.out.printf("Status for changes between revision %d and %d:\n", r1, r2); | |
| 93 sc.walk(r1, r2, dump); | |
| 94 // | |
| 95 System.out.println("\n\nSame, but sorted in the way hg status does:"); | |
| 96 HgStatusCollector.Record r = sc.status(r1, r2); | |
| 97 sortAndPrint('M', r.getModified()); | |
| 98 sortAndPrint('A', r.getAdded()); | |
| 99 sortAndPrint('R', r.getRemoved()); | |
| 100 // | |
| 101 System.out.println("\n\nTry hg status --change <rev>:"); | |
| 102 sc.change(0, dump); | |
| 103 System.out.println("\nStatus against working dir:"); | |
| 104 HgWorkingCopyStatusCollector wcc = new HgWorkingCopyStatusCollector(hgRepo); | |
| 105 wcc.walk(TIP, dump); | |
| 106 System.out.println(); | |
| 107 System.out.printf("Manifest of the revision %d:\n", r2); | |
| 108 hgRepo.getManifest().walk(r2, r2, new Manifest.Dump()); | |
| 109 System.out.println(); | |
| 110 System.out.printf("\nStatus of working dir against %d:\n", r2); | |
| 111 r = wcc.status(r2); | |
| 112 sortAndPrint('M', r.getModified()); | |
| 113 sortAndPrint('A', r.getAdded(), r.getCopied()); | |
| 114 sortAndPrint('R', r.getRemoved()); | |
| 115 sortAndPrint('?', r.getUnknown()); | |
| 116 sortAndPrint('I', r.getIgnored()); | |
| 117 sortAndPrint('C', r.getClean()); | |
| 118 sortAndPrint('!', r.getMissing()); | |
| 119 } | |
| 120 | |
| 121 private static void sortAndPrint(char prefix, List<Path> ul) { | |
| 122 sortAndPrint(prefix, ul, null); | |
| 123 } | |
| 124 private static void sortAndPrint(char prefix, List<Path> ul, Map<Path, Path> copies) { | |
| 125 ArrayList<Path> sortList = new ArrayList<Path>(ul); | |
| 126 Collections.sort(sortList); | |
| 127 for (Path s : sortList) { | |
| 128 System.out.print(prefix); | |
| 129 System.out.print(' '); | |
| 130 System.out.println(s); | |
| 131 if (copies != null && copies.containsKey(s)) { | |
| 132 System.out.println(" " + copies.get(s)); | |
| 133 } | 123 } |
| 134 } | 124 } |
| 135 } | 125 cmd.execute(statusHandler); |
| 136 | 126 statusHandler.dump(); |
| 137 protected static void testStatusInternals(HgRepository hgRepo) { | |
| 138 HgDataFile n = hgRepo.getFileNode(Path.create("design.txt")); | |
| 139 for (String s : new String[] {"011dfd44417c72bd9e54cf89b82828f661b700ed", "e5529faa06d53e06a816e56d218115b42782f1ba", "c18e7111f1fc89a80a00f6a39d51288289a382fc"}) { | |
| 140 // expected: 359, 2123, 3079 | |
| 141 byte[] b = s.getBytes(); | |
| 142 final Nodeid nid = Nodeid.fromAscii(b, 0, b.length); | |
| 143 System.out.println(s + " : " + n.length(nid)); | |
| 144 } | |
| 145 } | |
| 146 | |
| 147 private static class StatusDump implements HgStatusInspector { | |
| 148 public boolean hideStatusPrefix = false; // hg status -n option | |
| 149 public boolean showCopied = true; // -C | |
| 150 public boolean showIgnored = true; // -i | |
| 151 public boolean showClean = true; // -c | |
| 152 | |
| 153 public void modified(Path fname) { | |
| 154 print('M', fname); | |
| 155 } | |
| 156 | |
| 157 public void added(Path fname) { | |
| 158 print('A', fname); | |
| 159 } | |
| 160 | |
| 161 public void copied(Path fnameOrigin, Path fnameAdded) { | |
| 162 added(fnameAdded); | |
| 163 if (showCopied) { | |
| 164 print(' ', fnameOrigin); | |
| 165 } | |
| 166 } | |
| 167 | |
| 168 public void removed(Path fname) { | |
| 169 print('R', fname); | |
| 170 } | |
| 171 | |
| 172 public void clean(Path fname) { | |
| 173 if (showClean) { | |
| 174 print('C', fname); | |
| 175 } | |
| 176 } | |
| 177 | |
| 178 public void missing(Path fname) { | |
| 179 print('!', fname); | |
| 180 } | |
| 181 | |
| 182 public void unknown(Path fname) { | |
| 183 print('?', fname); | |
| 184 } | |
| 185 | |
| 186 public void ignored(Path fname) { | |
| 187 if (showIgnored) { | |
| 188 print('I', fname); | |
| 189 } | |
| 190 } | |
| 191 | |
| 192 private void print(char status, Path fname) { | |
| 193 if (!hideStatusPrefix) { | |
| 194 System.out.print(status); | |
| 195 System.out.print(' '); | |
| 196 } | |
| 197 System.out.println(fname); | |
| 198 } | |
| 199 } | 127 } |
| 200 } | 128 } |
