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@299: import static org.tmatesoft.hg.console.Options.asSet; tikhomirov@143: import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; tikhomirov@18: tikhomirov@55: import java.util.ArrayList; tikhomirov@55: import java.util.Collections; tikhomirov@279: import java.util.EnumMap; tikhomirov@143: import java.util.HashMap; tikhomirov@143: import java.util.LinkedList; tikhomirov@55: import java.util.List; tikhomirov@74: import java.util.Map; tikhomirov@299: import java.util.Set; tikhomirov@55: tikhomirov@143: import org.tmatesoft.hg.core.HgRepoFacade; tikhomirov@143: import org.tmatesoft.hg.core.HgStatus; tikhomirov@143: import org.tmatesoft.hg.core.HgStatus.Kind; tikhomirov@143: import org.tmatesoft.hg.core.HgStatusCommand; tikhomirov@360: import org.tmatesoft.hg.core.HgStatusHandler; tikhomirov@456: import org.tmatesoft.hg.util.Outcome; tikhomirov@133: import org.tmatesoft.hg.util.Path; 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@299: final Set flagOpts = asSet("-A", "-all", "-m", "--modified", "-a", "--added", "-r", "--removed", tikhomirov@299: "--d", "--deleted", "-u", "--unknown", "-c", "--clean", "-i", "--ignored", tikhomirov@299: "-n", "--no-status", "-C", "--copies"); tikhomirov@299: Options cmdLineOpts = Options.parse(args, flagOpts); tikhomirov@143: HgRepoFacade hgRepo = new HgRepoFacade(); tikhomirov@143: if (!hgRepo.init(cmdLineOpts.findRepository())) { tikhomirov@143: System.err.printf("Can't find repository in: %s\n", hgRepo.getRepository().getLocation()); tikhomirov@10: return; tikhomirov@10: } tikhomirov@74: // tikhomirov@143: HgStatusCommand cmd = hgRepo.createStatusCommand(); tikhomirov@157: if (cmdLineOpts.getBoolean("-A", "--all")) { tikhomirov@143: cmd.all(); tikhomirov@143: } else { tikhomirov@143: // default: mardu tikhomirov@143: cmd.modified(cmdLineOpts.getBoolean(true, "-m", "--modified")); tikhomirov@143: cmd.added(cmdLineOpts.getBoolean(true, "-a", "--added")); tikhomirov@143: cmd.removed(cmdLineOpts.getBoolean(true, "-r", "--removed")); tikhomirov@143: cmd.deleted(cmdLineOpts.getBoolean(true, "-d", "--deleted")); tikhomirov@143: cmd.unknown(cmdLineOpts.getBoolean(true, "-u", "--unknonwn")); tikhomirov@143: cmd.clean(cmdLineOpts.getBoolean("-c", "--clean")); tikhomirov@143: cmd.ignored(cmdLineOpts.getBoolean("-i", "--ignored")); tikhomirov@143: } tikhomirov@143: // cmd.subrepo(cmdLineOpts.getBoolean("-S", "--subrepos")) tikhomirov@143: final boolean noStatusPrefix = cmdLineOpts.getBoolean("-n", "--no-status"); tikhomirov@143: final boolean showCopies = cmdLineOpts.getBoolean("-C", "--copies"); tikhomirov@360: class StatusHandler implements HgStatusHandler { tikhomirov@143: tikhomirov@279: final EnumMap> data = new EnumMap>(HgStatus.Kind.class); tikhomirov@143: final Map copies = showCopies ? new HashMap() : null; tikhomirov@143: tikhomirov@427: public void status(HgStatus s) { tikhomirov@143: List l = data.get(s.getKind()); tikhomirov@143: if (l == null) { tikhomirov@143: l = new LinkedList(); tikhomirov@143: data.put(s.getKind(), l); tikhomirov@143: } tikhomirov@143: l.add(s.getPath()); tikhomirov@143: if (s.isCopy() && showCopies) { tikhomirov@143: copies.put(s.getPath(), s.getOriginalPath()); tikhomirov@143: } tikhomirov@143: } tikhomirov@143: tikhomirov@456: public void error(Path file, Outcome s) { tikhomirov@360: System.out.printf("FAILURE: %s %s\n", s.getMessage(), file); tikhomirov@360: s.getException().printStackTrace(System.out); tikhomirov@360: } tikhomirov@360: tikhomirov@143: public void dump() { tikhomirov@143: sortAndPrint('M', data.get(Kind.Modified), null); tikhomirov@143: sortAndPrint('A', data.get(Kind.Added), copies); tikhomirov@143: sortAndPrint('R', data.get(Kind.Removed), null); tikhomirov@143: sortAndPrint('?', data.get(Kind.Unknown), null); tikhomirov@143: sortAndPrint('I', data.get(Kind.Ignored), null); tikhomirov@143: sortAndPrint('C', data.get(Kind.Clean), null); tikhomirov@143: sortAndPrint('!', data.get(Kind.Missing), null); tikhomirov@143: } tikhomirov@74: tikhomirov@143: private void sortAndPrint(char prefix, List ul, Map copies) { tikhomirov@143: if (ul == null) { tikhomirov@143: return; tikhomirov@143: } tikhomirov@143: ArrayList sortList = new ArrayList(ul); tikhomirov@143: Collections.sort(sortList); tikhomirov@143: for (Path s : sortList) { tikhomirov@143: if (!noStatusPrefix) { tikhomirov@143: System.out.print(prefix); tikhomirov@143: System.out.print(' '); tikhomirov@143: } tikhomirov@143: System.out.println(s); tikhomirov@143: if (copies != null && copies.containsKey(s)) { tikhomirov@143: System.out.println(" " + copies.get(s)); tikhomirov@143: } tikhomirov@143: } tikhomirov@143: } tikhomirov@143: }; tikhomirov@143: tikhomirov@143: StatusHandler statusHandler = new StatusHandler(); tikhomirov@143: int changeRev = cmdLineOpts.getSingleInt(BAD_REVISION, "--change"); tikhomirov@143: if (changeRev != BAD_REVISION) { tikhomirov@143: cmd.change(changeRev); tikhomirov@143: } else { tikhomirov@143: List revisions = cmdLineOpts.getList("--rev"); tikhomirov@143: int size = revisions.size(); tikhomirov@143: if (size > 1) { tikhomirov@143: cmd.base(Integer.parseInt(revisions.get(size - 2))).revision(Integer.parseInt(revisions.get(size - 1))); tikhomirov@143: } else if (size > 0) { tikhomirov@143: cmd.base(Integer.parseInt(revisions.get(0))); tikhomirov@74: } tikhomirov@55: } tikhomirov@143: cmd.execute(statusHandler); tikhomirov@143: statusHandler.dump(); tikhomirov@10: } tikhomirov@10: }