diff options
Diffstat (limited to 'org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm')
3 files changed, 127 insertions, 8 deletions
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java index 8115039729..2f35ecbabd 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Checkout.java @@ -1,5 +1,6 @@ /* * Copyright (C) 2010, 2012 Chris Aniszczyk <caniszczyk@gmail.com> + * Copyright (C) 2013, Obeo * and other copyright owners as documented in the project's IP log. * * This program and the accompanying materials are made available @@ -47,6 +48,7 @@ import java.text.MessageFormat; import org.eclipse.jgit.api.CheckoutCommand; import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.CheckoutConflictException; import org.eclipse.jgit.api.errors.RefAlreadyExistsException; import org.eclipse.jgit.api.errors.RefNotFoundException; import org.eclipse.jgit.lib.Constants; @@ -107,6 +109,11 @@ class Checkout extends TextBuiltin { } catch (RefAlreadyExistsException e) { throw die(MessageFormat.format(CLIText.get().branchAlreadyExists, name)); + } catch (CheckoutConflictException e) { + outw.println(CLIText.get().checkoutConflict); + for (String path : e.getConflictingPaths()) + outw.println(MessageFormat.format( + CLIText.get().checkoutConflictPathLine, path)); } } } diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Status.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Status.java index 0214ed00e0..2ae950bdc5 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Status.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Status.java @@ -50,6 +50,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.TreeSet; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.StatusCommand; @@ -71,26 +72,134 @@ class Status extends TextBuiltin { protected final String statusFileListFormatUnmerged = CLIText.get().statusFileListFormatUnmerged; + @Option(name = "--porcelain", usage = "usage_machineReadableOutput") + protected boolean porcelain; + @Option(name = "--", metaVar = "metaVar_path", multiValued = true) protected List<String> filterPaths; @Override protected void run() throws Exception { + StatusCommand statusCommand = new Git(db).status(); + if (filterPaths != null && filterPaths.size() > 0) + for (String path : filterPaths) + statusCommand.addPath(path); + org.eclipse.jgit.api.Status status = statusCommand.call(); + printStatus(status); + } + + private void printStatus(org.eclipse.jgit.api.Status status) + throws IOException { + if (porcelain) + printPorcelainStatus(status); + else + printLongStatus(status); + } + + private void printPorcelainStatus(org.eclipse.jgit.api.Status status) + throws IOException { + + Collection<String> added = status.getAdded(); + Collection<String> changed = status.getChanged(); + Collection<String> removed = status.getRemoved(); + Collection<String> modified = status.getModified(); + Collection<String> missing = status.getMissing(); + Map<String, StageState> conflicting = status.getConflictingStageState(); + + // build a sorted list of all paths except untracked and ignored + TreeSet<String> sorted = new TreeSet<String>(); + sorted.addAll(added); + sorted.addAll(changed); + sorted.addAll(removed); + sorted.addAll(modified); + sorted.addAll(missing); + sorted.addAll(conflicting.keySet()); + + // list each path + for (String path : sorted) { + char x = ' '; + char y = ' '; + + if (added.contains(path)) + x = 'A'; + else if (changed.contains(path)) + x = 'M'; + else if (removed.contains(path)) + x = 'D'; + + if (modified.contains(path)) + y = 'M'; + else if (missing.contains(path)) + y = 'D'; + + if (conflicting.containsKey(path)) { + StageState stageState = conflicting.get(path); + + switch (stageState) { + case BOTH_DELETED: + x = 'D'; + y = 'D'; + break; + case ADDED_BY_US: + x = 'A'; + y = 'U'; + break; + case DELETED_BY_THEM: + x = 'U'; + y = 'D'; + break; + case ADDED_BY_THEM: + x = 'U'; + y = 'A'; + break; + case DELETED_BY_US: + x = 'D'; + y = 'U'; + break; + case BOTH_ADDED: + x = 'A'; + y = 'A'; + break; + case BOTH_MODIFIED: + x = 'U'; + y = 'U'; + break; + default: + throw new IllegalArgumentException("Unknown StageState: " //$NON-NLS-1$ + + stageState); + } + } + + printPorcelainLine(x, y, path); + } + + // untracked are always at the end of the list + TreeSet<String> untracked = new TreeSet<String>(status.getUntracked()); + for (String path : untracked) + printPorcelainLine('?', '?', path); + } + + private void printPorcelainLine(char x, char y, String path) + throws IOException { + StringBuilder lineBuilder = new StringBuilder(); + lineBuilder.append(x).append(y).append(' ').append(path); + outw.println(lineBuilder.toString()); + } + + private void printLongStatus(org.eclipse.jgit.api.Status status) + throws IOException { // Print current branch name final Ref head = db.getRef(Constants.HEAD); - boolean firstHeader = true; if (head != null && head.isSymbolic()) { String branch = Repository.shortenRefName(head.getLeaf().getName()); - outw.println(CLIText.formatLine( - MessageFormat.format(CLIText.get().onBranch, branch))); + outw.println(CLIText.formatLine(MessageFormat.format( + CLIText.get().onBranch, branch))); } else outw.println(CLIText.formatLine(CLIText.get().notOnAnyBranch)); + // List changes - StatusCommand statusCommand = new Git(db).status(); - if (filterPaths != null && filterPaths.size() > 0) - for (String path : filterPaths) - statusCommand.addPath(path); - org.eclipse.jgit.api.Status status = statusCommand.call(); + boolean firstHeader = true; + Collection<String> added = status.getAdded(); Collection<String> changed = status.getChanged(); Collection<String> removed = status.getRemoved(); diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java index de8675e0fb..a51313ae1e 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java @@ -1,5 +1,6 @@ /* * Copyright (C) 2010, 2013 Sasa Zivkov <sasa.zivkov@sap.com> + * Copyright (C) 2013, Obeo * and other copyright owners as documented in the project's IP log. * * This program and the accompanying materials are made available @@ -106,6 +107,8 @@ public class CLIText extends TranslationBundle { /***/ public String cantWrite; /***/ public String changesNotStagedForCommit; /***/ public String changesToBeCommitted; + /***/ public String checkoutConflict; + /***/ public String checkoutConflictPathLine; /***/ public String commitLabel; /***/ public String conflictingUsageOf_git_dir_andArguments; /***/ public String couldNotCreateBranch; |