tikhomirov@10: /* tikhomirov@72: * Copyright (c) 2010-2011 TMate Software Ltd tikhomirov@72: * tikhomirov@72: * This program is free software; you can redistribute it and/or modify tikhomirov@72: * it under the terms of the GNU General Public License as published by tikhomirov@72: * the Free Software Foundation; version 2 of the License. tikhomirov@72: * tikhomirov@72: * This program is distributed in the hope that it will be useful, tikhomirov@72: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@72: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@72: * GNU General Public License for more details. tikhomirov@72: * tikhomirov@72: * For information on how to redistribute this software under tikhomirov@72: * the terms of a license other than GNU General Public License tikhomirov@102: * contact TMate Software at support@hg4j.com tikhomirov@10: */ tikhomirov@72: package org.tmatesoft.hg.console; tikhomirov@10: tikhomirov@74: import static org.tmatesoft.hg.repo.HgRepository.TIP; tikhomirov@18: tikhomirov@55: import java.util.ArrayList; tikhomirov@55: import java.util.Collections; tikhomirov@55: import java.util.List; tikhomirov@74: import java.util.Map; tikhomirov@55: tikhomirov@74: import org.tmatesoft.hg.core.Nodeid; tikhomirov@74: import org.tmatesoft.hg.core.Path; tikhomirov@74: import org.tmatesoft.hg.repo.HgDataFile; tikhomirov@74: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@93: import org.tmatesoft.hg.repo.HgStatusInspector; tikhomirov@96: import org.tmatesoft.hg.repo.HgInternals; tikhomirov@94: import org.tmatesoft.hg.repo.HgStatusCollector; tikhomirov@94: import org.tmatesoft.hg.repo.HgStatusCollector.Record; tikhomirov@94: import org.tmatesoft.hg.repo.HgWorkingCopyStatusCollector; tikhomirov@10: tikhomirov@10: /** tikhomirov@10: * tikhomirov@72: * @author Artem Tikhomirov tikhomirov@72: * @author TMate Software Ltd. tikhomirov@10: */ tikhomirov@10: public class Status { tikhomirov@10: tikhomirov@10: public static void main(String[] args) throws Exception { tikhomirov@74: Options cmdLineOpts = Options.parse(args); tikhomirov@74: HgRepository hgRepo = cmdLineOpts.findRepository(); tikhomirov@10: if (hgRepo.isInvalid()) { tikhomirov@10: System.err.printf("Can't find repository in: %s\n", hgRepo.getLocation()); tikhomirov@10: return; tikhomirov@10: } tikhomirov@10: System.out.println(hgRepo.getLocation()); tikhomirov@74: // tikhomirov@74: // bunchOfTests(hgRepo); tikhomirov@74: // tikhomirov@74: // new Internals(hgRepo).dumpDirstate(); tikhomirov@74: // tikhomirov@117: statusWorkingCopy(hgRepo); tikhomirov@117: //statusRevVsWorkingCopy(hgRepo); tikhomirov@74: } tikhomirov@88: tikhomirov@88: private static void statusWorkingCopy(HgRepository hgRepo) { tikhomirov@94: HgWorkingCopyStatusCollector wcc = new HgWorkingCopyStatusCollector(hgRepo); tikhomirov@94: HgStatusCollector.Record r = new HgStatusCollector.Record(); tikhomirov@74: wcc.walk(TIP, r); tikhomirov@88: mardu(r); tikhomirov@88: } tikhomirov@88: tikhomirov@88: private static void mardu(Record r) { tikhomirov@74: sortAndPrint('M', r.getModified()); tikhomirov@74: sortAndPrint('A', r.getAdded(), r.getCopied()); tikhomirov@74: sortAndPrint('R', r.getRemoved()); tikhomirov@74: sortAndPrint('?', r.getUnknown()); tikhomirov@74: // sortAndPrint('I', r.getIgnored()); tikhomirov@74: // sortAndPrint('C', r.getClean()); tikhomirov@74: sortAndPrint('!', r.getMissing()); tikhomirov@74: } tikhomirov@88: tikhomirov@88: private static void statusRevVsWorkingCopy(HgRepository hgRepo) { tikhomirov@94: HgWorkingCopyStatusCollector wcc = new HgWorkingCopyStatusCollector(hgRepo); tikhomirov@94: HgStatusCollector.Record r = new HgStatusCollector.Record(); tikhomirov@88: wcc.walk(3, r); tikhomirov@88: mardu(r); tikhomirov@88: } tikhomirov@74: tikhomirov@74: private static void bunchOfTests(HgRepository hgRepo) throws Exception { tikhomirov@96: HgInternals debug = new HgInternals(hgRepo); tikhomirov@59: debug.dumpDirstate(); tikhomirov@18: final StatusDump dump = new StatusDump(); tikhomirov@18: dump.showIgnored = false; tikhomirov@18: dump.showClean = false; tikhomirov@94: HgStatusCollector sc = new HgStatusCollector(hgRepo); tikhomirov@55: final int r1 = 0, r2 = 3; tikhomirov@20: System.out.printf("Status for changes between revision %d and %d:\n", r1, r2); tikhomirov@55: sc.walk(r1, r2, dump); tikhomirov@55: // tikhomirov@55: System.out.println("\n\nSame, but sorted in the way hg status does:"); tikhomirov@94: HgStatusCollector.Record r = sc.status(r1, r2); tikhomirov@55: sortAndPrint('M', r.getModified()); tikhomirov@55: sortAndPrint('A', r.getAdded()); tikhomirov@55: sortAndPrint('R', r.getRemoved()); tikhomirov@56: // tikhomirov@56: System.out.println("\n\nTry hg status --change :"); tikhomirov@56: sc.change(0, dump); tikhomirov@57: System.out.println("\nStatus against working dir:"); tikhomirov@94: HgWorkingCopyStatusCollector wcc = new HgWorkingCopyStatusCollector(hgRepo); tikhomirov@58: wcc.walk(TIP, dump); tikhomirov@57: System.out.println(); tikhomirov@57: System.out.printf("Manifest of the revision %d:\n", r2); tikhomirov@57: hgRepo.getManifest().walk(r2, r2, new Manifest.Dump()); tikhomirov@57: System.out.println(); tikhomirov@57: System.out.printf("\nStatus of working dir against %d:\n", r2); tikhomirov@58: r = wcc.status(r2); tikhomirov@58: sortAndPrint('M', r.getModified()); tikhomirov@74: sortAndPrint('A', r.getAdded(), r.getCopied()); tikhomirov@58: sortAndPrint('R', r.getRemoved()); tikhomirov@58: sortAndPrint('?', r.getUnknown()); tikhomirov@58: sortAndPrint('I', r.getIgnored()); tikhomirov@58: sortAndPrint('C', r.getClean()); tikhomirov@58: sortAndPrint('!', r.getMissing()); tikhomirov@55: } tikhomirov@55: tikhomirov@93: private static void sortAndPrint(char prefix, List ul) { tikhomirov@74: sortAndPrint(prefix, ul, null); tikhomirov@74: } tikhomirov@93: private static void sortAndPrint(char prefix, List ul, Map copies) { tikhomirov@93: ArrayList sortList = new ArrayList(ul); tikhomirov@55: Collections.sort(sortList); tikhomirov@93: for (Path s : sortList) { tikhomirov@55: System.out.print(prefix); tikhomirov@55: System.out.print(' '); tikhomirov@55: System.out.println(s); tikhomirov@74: if (copies != null && copies.containsKey(s)) { tikhomirov@74: System.out.println(" " + copies.get(s)); tikhomirov@74: } tikhomirov@55: } tikhomirov@22: } tikhomirov@22: tikhomirov@22: protected static void testStatusInternals(HgRepository hgRepo) { tikhomirov@74: HgDataFile n = hgRepo.getFileNode(Path.create("design.txt")); tikhomirov@22: for (String s : new String[] {"011dfd44417c72bd9e54cf89b82828f661b700ed", "e5529faa06d53e06a816e56d218115b42782f1ba", "c18e7111f1fc89a80a00f6a39d51288289a382fc"}) { tikhomirov@22: // expected: 359, 2123, 3079 tikhomirov@22: byte[] b = s.getBytes(); tikhomirov@22: final Nodeid nid = Nodeid.fromAscii(b, 0, b.length); tikhomirov@22: System.out.println(s + " : " + n.length(nid)); tikhomirov@22: } tikhomirov@18: } tikhomirov@18: tikhomirov@93: private static class StatusDump implements HgStatusInspector { tikhomirov@18: public boolean hideStatusPrefix = false; // hg status -n option tikhomirov@18: public boolean showCopied = true; // -C tikhomirov@18: public boolean showIgnored = true; // -i tikhomirov@18: public boolean showClean = true; // -c tikhomirov@18: tikhomirov@93: public void modified(Path fname) { tikhomirov@18: print('M', fname); tikhomirov@18: } tikhomirov@18: tikhomirov@93: public void added(Path fname) { tikhomirov@18: print('A', fname); tikhomirov@18: } tikhomirov@18: tikhomirov@93: public void copied(Path fnameOrigin, Path fnameAdded) { tikhomirov@18: added(fnameAdded); tikhomirov@18: if (showCopied) { tikhomirov@18: print(' ', fnameOrigin); tikhomirov@18: } tikhomirov@18: } tikhomirov@18: tikhomirov@93: public void removed(Path fname) { tikhomirov@18: print('R', fname); tikhomirov@18: } tikhomirov@18: tikhomirov@93: public void clean(Path fname) { tikhomirov@18: if (showClean) { tikhomirov@18: print('C', fname); tikhomirov@18: } tikhomirov@18: } tikhomirov@18: tikhomirov@93: public void missing(Path fname) { tikhomirov@18: print('!', fname); tikhomirov@18: } tikhomirov@18: tikhomirov@93: public void unknown(Path fname) { tikhomirov@18: print('?', fname); tikhomirov@18: } tikhomirov@18: tikhomirov@93: public void ignored(Path fname) { tikhomirov@18: if (showIgnored) { tikhomirov@18: print('I', fname); tikhomirov@18: } tikhomirov@18: } tikhomirov@18: tikhomirov@93: private void print(char status, Path fname) { tikhomirov@18: if (!hideStatusPrefix) { tikhomirov@18: System.out.print(status); tikhomirov@18: System.out.print(' '); tikhomirov@18: } tikhomirov@18: System.out.println(fname); tikhomirov@18: } tikhomirov@10: } tikhomirov@10: }