diff options
author | Matthias Sohn <matthias.sohn@sap.com> | 2013-12-04 09:26:16 -0500 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org <gerrit@eclipse.org> | 2013-12-04 09:26:16 -0500 |
commit | ba0f50d7d34a0a3d47f53139ba78de04b3ebdff6 (patch) | |
tree | 4bf32e98bf7a76100ae41240f217be106eb77033 /org.eclipse.jgit.pgm | |
parent | 77432969d3f5fc1c695db0dc1bdaf74b5723d555 (diff) | |
parent | 7026658ac8915bf1e0534132f7c5d4d02473490b (diff) | |
download | jgit-ba0f50d7d34a0a3d47f53139ba78de04b3ebdff6.tar.gz jgit-ba0f50d7d34a0a3d47f53139ba78de04b3ebdff6.zip |
Merge "CLI status should support --porcelain"
Diffstat (limited to 'org.eclipse.jgit.pgm')
-rw-r--r-- | org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/internal/CLIText.properties | 1 | ||||
-rw-r--r-- | org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Status.java | 125 |
2 files changed, 118 insertions, 8 deletions
diff --git a/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/internal/CLIText.properties b/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/internal/CLIText.properties index fc83b956b9..d23f378993 100644 --- a/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/internal/CLIText.properties +++ b/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/internal/CLIText.properties @@ -282,6 +282,7 @@ usage_inputOutputFile=Input/output file usage_listBothRemoteTrackingAndLocalBranches=list both remote-tracking and local branches usage_listCreateOrDeleteBranches=List, create, or delete branches usage_logAllPretty=format:%H %ct %P' output=log --all '--pretty=format:%H %ct %P' output +usage_machineReadableOutput=machine-readable output usage_manageReflogInformation=Manage reflog information usage_mergeFf=When the merge resolves as a fast-forward, only update the branch pointer, without creating a merge commit. usage_mergeNoFf=Create a merge commit even when the merge resolves as a fast-forward. 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(); |