diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/StatusTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/StatusTest.java index 7ffcae598..793fc7daf 100644 --- a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/StatusTest.java +++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/StatusTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012, 2013 François Rey + * Copyright (C) 2012, 2015 François Rey * and other copyright owners as documented in the project's IP log. * * This program and the accompanying materials are made available @@ -43,17 +43,144 @@ package org.eclipse.jgit.pgm; +import java.io.IOException; + import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.CLIRepositoryTestCase; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Test; public class StatusTest extends CLIRepositoryTestCase { + @Test - public void testStatus() throws Exception { + public void testStatusDefault() throws Exception { + executeTest("git status", false, true); + } + + @Test + public void testStatusU() throws Exception { + executeTest("git status -u", false, true); + } + + @Test + public void testStatusUno() throws Exception { + executeTest("git status -uno", false, false); + } + + @Test + public void testStatusUall() throws Exception { + executeTest("git status -uall", false, true); + } + + @Test + public void testStatusUntrackedFiles() throws Exception { + executeTest("git status --untracked-files", false, true); + } + + @Test + public void testStatusUntrackedFilesNo() throws Exception { + executeTest("git status --untracked-files=no", false, false); + } + + @Test + public void testStatusUntrackedFilesAll() throws Exception { + executeTest("git status --untracked-files=all", false, true); + } + + @Test + public void testStatusPorcelain() throws Exception { + executeTest("git status --porcelain", true, true); + } + + @Test + public void testStatusPorcelainU() throws Exception { + executeTest("git status --porcelain -u", true, true); + } + + @Test + public void testStatusPorcelainUno() throws Exception { + executeTest("git status --porcelain -uno", true, false); + } + + @Test + public void testStatusPorcelainUall() throws Exception { + executeTest("git status --porcelain -uall", true, true); + } + + @Test + public void testStatusPorcelainUntrackedFiles() throws Exception { + executeTest("git status --porcelain --untracked-files", true, true); + } + + @Test + public void testStatusPorcelainUntrackedFilesNo() throws Exception { + executeTest("git status --porcelain --untracked-files=no", true, false); + } + + @Test + public void testStatusPorcelainUntrackedFilesAll() throws Exception { + executeTest("git status --porcelain --untracked-files=all", true, true); + } + + /** + * Executes the test sequence. + * + * @param command + * full git command and parameters to be used + * @param porcelain + * indicates that porcelain format is expected in the output + * @param untrackedFiles + * indicates that untracked files are expected in the output + * + * @throws Exception + * if error during test execution + */ + private void executeTest(String command, boolean porcelain, + boolean untrackedFiles) throws Exception { Git git = new Git(db); // Write all files + writeAllFiles(); + // Test untracked + assertUntrackedFiles(command, porcelain, untrackedFiles); + // Add to index + addFilesToIndex(git); + // Test staged count + assertStagedFiles(command, porcelain, untrackedFiles); + // Commit + makeInitialCommit(git); + assertAfterInitialCommit(command, porcelain, untrackedFiles); + // Make some changes and stage them + makeSomeChangesAndStageThem(git); + // Test staged/not-staged status + assertStagedStatus(command, porcelain, untrackedFiles); + // Create unmerged file + createUnmergedFile(git); + // Commit pending changes + commitPendingChanges(git); + assertUntracked(command, porcelain, untrackedFiles, "master"); + // Checkout new branch + checkoutTestBranch(git); + // Test branch status + assertUntracked(command, porcelain, untrackedFiles, "test"); + // Commit change and checkout master again + RevCommit testBranch = commitChangesInTestBranch(git); + assertUntracked(command, porcelain, untrackedFiles, "test"); + checkoutMasterBranch(git); + // Change the same file and commit + changeUnmergedFileAndCommit(git); + assertUntracked(command, porcelain, untrackedFiles, "master"); + // Merge test branch into master + mergeTestBranchInMaster(git, testBranch); + // Test unmerged status + assertUntrackedAndUnmerged(command, porcelain, untrackedFiles, "master"); + // Test detached head + detachHead(git); + assertUntrackedAndUnmerged(command, porcelain, untrackedFiles, null); + } + + private void writeAllFiles() throws IOException { writeTrashFile("tracked", "tracked"); writeTrashFile("stagedNew", "stagedNew"); writeTrashFile("stagedModified", "stagedModified"); @@ -61,9 +188,101 @@ public void testStatus() throws Exception { writeTrashFile("trackedModified", "trackedModified"); writeTrashFile("trackedDeleted", "trackedDeleted"); writeTrashFile("untracked", "untracked"); - // Test untracked - assertArrayOfLinesEquals(new String[] { // git status output - "On branch master", // + } + + private void addFilesToIndex(Git git) throws GitAPIException { + git.add().addFilepattern("tracked").call(); + git.add().addFilepattern("stagedModified").call(); + git.add().addFilepattern("stagedDeleted").call(); + git.add().addFilepattern("trackedModified").call(); + git.add().addFilepattern("trackedDeleted").call(); + } + + private void makeInitialCommit(Git git) throws GitAPIException { + git.commit().setMessage("initial commit").call(); + } + + private void makeSomeChangesAndStageThem(Git git) throws IOException, + GitAPIException { + writeTrashFile("stagedModified", "stagedModified modified"); + deleteTrashFile("stagedDeleted"); + writeTrashFile("trackedModified", "trackedModified modified"); + deleteTrashFile("trackedDeleted"); + git.add().addFilepattern("stagedModified").call(); + git.rm().addFilepattern("stagedDeleted").call(); + git.add().addFilepattern("stagedNew").call(); + } + + private void createUnmergedFile(Git git) throws IOException, + GitAPIException { + writeTrashFile("unmerged", "unmerged"); + git.add().addFilepattern("unmerged").call(); + } + + private void commitPendingChanges(Git git) throws GitAPIException { + git.add().addFilepattern("trackedModified").call(); + git.rm().addFilepattern("trackedDeleted").call(); + git.commit().setMessage("commit before branching").call(); + } + + private void checkoutTestBranch(Git git) throws GitAPIException { + git.checkout().setCreateBranch(true).setName("test").call(); + } + + private RevCommit commitChangesInTestBranch(Git git) throws IOException, + GitAPIException { + writeTrashFile("unmerged", "changed in test branch"); + git.add().addFilepattern("unmerged").call(); + return git.commit() + .setMessage("changed unmerged in test branch").call(); + } + + private void checkoutMasterBranch(Git git) throws GitAPIException { + git.checkout().setName("master").call(); + } + + private void changeUnmergedFileAndCommit(Git git) throws IOException, + GitAPIException { + writeTrashFile("unmerged", "changed in master branch"); + git.add().addFilepattern("unmerged").call(); + git.commit().setMessage("changed unmerged in master branch").call(); + } + + private void mergeTestBranchInMaster(Git git, RevCommit aCommit) + throws GitAPIException { + git.merge().include(aCommit.getId()).call(); + } + + private void detachHead(Git git) throws IOException, GitAPIException { + String commitId = db.getRef(Constants.MASTER).getObjectId().name(); + git.checkout().setName(commitId).call(); + } + + private void assertUntrackedFiles(String command, boolean porcelain, + boolean untrackedFiles) throws Exception { + String[] output = new String[0]; + + if (porcelain) { + if (untrackedFiles) { + output = new String[] { // + "?? stagedDeleted", // + "?? stagedModified", // + "?? stagedNew", // + "?? tracked", // + "?? trackedDeleted", // + "?? trackedModified", // + "?? untracked", // + "" // + }; + } else { + output = new String[] { // + "" // + }; + } + } else { + if (untrackedFiles) { + output = new String[] { // + "On branch master", // "Untracked files:", // "",// "\tstagedDeleted", // @@ -74,16 +293,48 @@ public void testStatus() throws Exception { "\ttrackedModified", // "\tuntracked", // "" // - }, execute("git status")); // - // Add to index - git.add().addFilepattern("tracked").call(); - git.add().addFilepattern("stagedModified").call(); - git.add().addFilepattern("stagedDeleted").call(); - git.add().addFilepattern("trackedModified").call(); - git.add().addFilepattern("trackedDeleted").call(); - // Test staged count - assertArrayOfLinesEquals(new String[] { // git status output - "On branch master", // + }; + } else { + output = new String[] { // + "On branch master", // + "" // + }; + } + } + + assertArrayOfLinesEquals(output, execute(command)); + } + + private void assertStagedFiles(String command, boolean porcelain, + boolean untrackedFiles) throws Exception { + String[] output = new String[0]; + + if (porcelain) { + if (untrackedFiles) { + output = new String[] { // + "A stagedDeleted", // + "A stagedModified", // + "A tracked", // + "A trackedDeleted", // + "A trackedModified", // + "?? stagedNew", // + "?? untracked", // + "" // + }; + } else { + output = new String[] { // + "A stagedDeleted", // + "A stagedModified", // + "A tracked", // + "A trackedDeleted", // + "A trackedModified", // + "" // + }; + } + } else { + if (untrackedFiles) { + output = new String[] { // + "On branch master", // "Changes to be committed:", // "", // "\tnew file: stagedDeleted", // @@ -97,29 +348,91 @@ public void testStatus() throws Exception { "\tstagedNew", // "\tuntracked", // "" // - }, execute("git status")); // - // Commit - git.commit().setMessage("initial commit") - .call(); - assertArrayOfLinesEquals(new String[] { // git status output - "On branch master", // + }; + } else { + output = new String[] { // + "On branch master", // + "Changes to be committed:", // + "", // + "\tnew file: stagedDeleted", // + "\tnew file: stagedModified", // + "\tnew file: tracked", // + "\tnew file: trackedDeleted", // + "\tnew file: trackedModified", // + "" // + }; + } + } + + assertArrayOfLinesEquals(output, execute(command)); + } + + private void assertAfterInitialCommit(String command, boolean porcelain, + boolean untrackedFiles) throws Exception { + String[] output = new String[0]; + + if (porcelain) { + if (untrackedFiles) { + output = new String[] { // + "?? stagedNew", // + "?? untracked", // + "" // + }; + } else { + output = new String[] { // + "" // + }; + } + } else { + if (untrackedFiles) { + output = new String[] { // + "On branch master", // "Untracked files:", // "", // "\tstagedNew", // "\tuntracked", // "" // - }, execute("git status")); // - // Make some changes and stage them - writeTrashFile("stagedModified", "stagedModified modified"); - deleteTrashFile("stagedDeleted"); - writeTrashFile("trackedModified", "trackedModified modified"); - deleteTrashFile("trackedDeleted"); - git.add().addFilepattern("stagedModified").call(); - git.rm().addFilepattern("stagedDeleted").call(); - git.add().addFilepattern("stagedNew").call(); - // Test staged/not-staged status - assertArrayOfLinesEquals(new String[] { // git status output - "On branch master", // + }; + } else { + output = new String[] { // + "On branch master", // + "" // + }; + } + } + + assertArrayOfLinesEquals(output, execute(command)); + } + + private void assertStagedStatus(String command, boolean porcelain, + boolean untrackedFiles) throws Exception { + String[] output = new String[0]; + + if (porcelain) { + if (untrackedFiles) { + output = new String[] { // + "D stagedDeleted", // + "M stagedModified", // + "A stagedNew", // + " D trackedDeleted", // + " M trackedModified", // + "?? untracked", // + "" // + }; + } else { + output = new String[] { // + "D stagedDeleted", // + "M stagedModified", // + "A stagedNew", // + " D trackedDeleted", // + " M trackedModified", // + "" // + }; + } + } else { + if (untrackedFiles) { + output = new String[] { // + "On branch master", // "Changes to be committed:", // "", // "\tdeleted: stagedDeleted", // @@ -135,200 +448,109 @@ public void testStatus() throws Exception { "", // "\tuntracked", // "" // - }, execute("git status")); // - // Create unmerged file - writeTrashFile("unmerged", "unmerged"); - git.add().addFilepattern("unmerged").call(); - // Commit pending changes - git.add().addFilepattern("trackedModified").call(); - git.rm().addFilepattern("trackedDeleted").call(); - git.commit().setMessage("commit before branching").call(); - assertArrayOfLinesEquals(new String[] { // git status output - "On branch master", // - "Untracked files:", // + }; + } else { + output = new String[] { // + "On branch master", // + "Changes to be committed:", // "", // - "\tuntracked", // - "" // - }, execute("git status")); // - // Checkout new branch - git.checkout().setCreateBranch(true).setName("test").call(); - // Test branch status - assertArrayOfLinesEquals(new String[] { // git status output - "On branch test", // - "Untracked files:", // + "\tdeleted: stagedDeleted", // + "\tmodified: stagedModified", // + "\tnew file: stagedNew", // "", // - "\tuntracked", // - "" // - }, execute("git status")); // - // Commit change and checkout master again - writeTrashFile("unmerged", "changed in test branch"); - git.add().addFilepattern("unmerged").call(); - RevCommit testBranch = git.commit() - .setMessage("changed unmerged in test branch").call(); - assertArrayOfLinesEquals(new String[] { // git status output - "On branch test", // - "Untracked files:", // + "Changes not staged for commit:", // "", // - "\tuntracked", // - "" // - }, execute("git status")); // - git.checkout().setName("master").call(); - // Change the same file and commit - writeTrashFile("unmerged", "changed in master branch"); - git.add().addFilepattern("unmerged").call(); - git.commit().setMessage("changed unmerged in master branch").call(); - assertArrayOfLinesEquals(new String[] { // git status output - "On branch master", // - "Untracked files:", // + "\tdeleted: trackedDeleted", // + "\tmodified: trackedModified", // "", // - "\tuntracked", // - "" // - }, execute("git status")); // - // Merge test branch into master - git.merge().include(testBranch.getId()).call(); - // Test unmerged status - assertArrayOfLinesEquals(new String[] { // git status output - "On branch master", // - "Unmerged paths:", // - "", // - "\tboth modified: unmerged", // - "", // - "Untracked files:", // - "", // - "\tuntracked", // - "" // - }, execute("git status")); // - // Test detached head - String commitId = db.getRef(Constants.MASTER).getObjectId().name(); - git.checkout().setName(commitId).call(); - assertArrayOfLinesEquals(new String[] { // git status output - "Not currently on any branch.", // - "Unmerged paths:", // - "", // - "\tboth modified: unmerged", // - "", // - "Untracked files:", // - "", // - "\tuntracked", // - "" // - }, execute("git status")); // + }; + } + } + + assertArrayOfLinesEquals(output, execute(command)); } - @Test - public void testStatusPorcelain() throws Exception { - Git git = new Git(db); - // Write all files - writeTrashFile("tracked", "tracked"); - writeTrashFile("stagedNew", "stagedNew"); - writeTrashFile("stagedModified", "stagedModified"); - writeTrashFile("stagedDeleted", "stagedDeleted"); - writeTrashFile("trackedModified", "trackedModified"); - writeTrashFile("trackedDeleted", "trackedDeleted"); - writeTrashFile("untracked", "untracked"); - // Test untracked - assertArrayOfLinesEquals(new String[] { // git status output - "?? stagedDeleted", // - "?? stagedModified", // - "?? stagedNew", // - "?? tracked", // - "?? trackedDeleted", // - "?? trackedModified", // + private void assertUntracked(String command, + boolean porcelain, + boolean untrackedFiles, String branch) throws Exception { + String[] output = new String[0]; + String branchHeader = "On branch " + branch; + + if (porcelain) { + if (untrackedFiles) { + output = new String[] { // "?? untracked", // "" // - }, execute("git status --porcelain")); // - // Add to index - git.add().addFilepattern("tracked").call(); - git.add().addFilepattern("stagedModified").call(); - git.add().addFilepattern("stagedDeleted").call(); - git.add().addFilepattern("trackedModified").call(); - git.add().addFilepattern("trackedDeleted").call(); - // Test staged count - assertArrayOfLinesEquals(new String[] { // git status output - "A stagedDeleted", // - "A stagedModified", // - "A tracked", // - "A trackedDeleted", // - "A trackedModified", // - "?? stagedNew", // - "?? untracked", // + }; + } else { + output = new String[] { // "" // - }, execute("git status --porcelain")); // - // Commit - git.commit().setMessage("initial commit").call(); - assertArrayOfLinesEquals(new String[] { // git status output - "?? stagedNew", // - "?? untracked", // + }; + } + } else { + if (untrackedFiles) { + output = new String[] { // + branchHeader, // + "Untracked files:", // + "", // + "\tuntracked", // "" // - }, execute("git status --porcelain")); // - // Make some changes and stage them - writeTrashFile("stagedModified", "stagedModified modified"); - deleteTrashFile("stagedDeleted"); - writeTrashFile("trackedModified", "trackedModified modified"); - deleteTrashFile("trackedDeleted"); - git.add().addFilepattern("stagedModified").call(); - git.rm().addFilepattern("stagedDeleted").call(); - git.add().addFilepattern("stagedNew").call(); - // Test staged/not-staged status - assertArrayOfLinesEquals(new String[] { // git status output - "D stagedDeleted", // - "M stagedModified", // - "A stagedNew", // - " D trackedDeleted", // - " M trackedModified", // - "?? untracked", // + }; + } else { + output = new String[] { // + branchHeader, // "" // - }, execute("git status --porcelain")); // - // Create unmerged file - writeTrashFile("unmerged", "unmerged"); - git.add().addFilepattern("unmerged").call(); - // Commit pending changes - git.add().addFilepattern("trackedModified").call(); - git.rm().addFilepattern("trackedDeleted").call(); - git.commit().setMessage("commit before branching").call(); - assertArrayOfLinesEquals(new String[] { // git status output - "?? untracked", // - "" // - }, execute("git status --porcelain")); // - // Checkout new branch - git.checkout().setCreateBranch(true).setName("test").call(); - // Test branch status - assertArrayOfLinesEquals(new String[] { // git status output - "?? untracked", // - "" // - }, execute("git status --porcelain")); // - // Commit change and checkout master again - writeTrashFile("unmerged", "changed in test branch"); - git.add().addFilepattern("unmerged").call(); - RevCommit testBranch = git.commit() - .setMessage("changed unmerged in test branch").call(); - assertArrayOfLinesEquals(new String[] { // git status output - "?? untracked", // - "" // - }, execute("git status --porcelain")); // - git.checkout().setName("master").call(); - // Change the same file and commit - writeTrashFile("unmerged", "changed in master branch"); - git.add().addFilepattern("unmerged").call(); - git.commit().setMessage("changed unmerged in master branch").call(); - assertArrayOfLinesEquals(new String[] { // git status output - "?? untracked", // - "" // - }, execute("git status --porcelain")); // - // Merge test branch into master - git.merge().include(testBranch.getId()).call(); - // Test unmerged status - assertArrayOfLinesEquals(new String[] { // git status output + }; + } + } + + assertArrayOfLinesEquals(output, execute(command)); + } + + private void assertUntrackedAndUnmerged(String command, boolean porcelain, + boolean untrackedFiles, String branch) throws Exception { + String[] output = new String[0]; + String branchHeader = (branch == null) // + ? "Not currently on any branch." // + : "On branch " + branch; + + if (porcelain) { + if (untrackedFiles) { + output = new String[] { // "UU unmerged", // "?? untracked", // "" // - }, execute("git status --porcelain")); // - // Test detached head - String commitId = db.getRef(Constants.MASTER).getObjectId().name(); - git.checkout().setName(commitId).call(); - assertArrayOfLinesEquals(new String[] { // git status output + }; + } else { + output = new String[] { // "UU unmerged", // - "?? untracked", // "" // - }, execute("git status --porcelain")); // + }; + } + } else { + if (untrackedFiles) { + output = new String[] { // + branchHeader, // + "Unmerged paths:", // + "", // + "\tboth modified: unmerged", // + "", // + "Untracked files:", // + "", // + "\tuntracked", // + "" // + }; + } else { + output = new String[] { // + branchHeader, // + "Unmerged paths:", // + "", // + "\tboth modified: unmerged", // + "" // + }; + } + } + + assertArrayOfLinesEquals(output, execute(command)); } } diff --git a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF index 94651acfb..796cb7610 100644 --- a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF @@ -36,7 +36,7 @@ Import-Package: org.apache.commons.compress.archivers;version="[1.3,2.0)", org.eclipse.jgit.util;version="[4.0.0,4.1.0)", org.eclipse.jgit.util.io;version="[4.0.0,4.1.0)", org.kohsuke.args4j;version="[2.0.12,2.1.0)", - org.kohsuke.args4j.spi;version="[2.0.12,2.1.0)" + org.kohsuke.args4j.spi;version="[2.0.15,2.1.0)" Bundle-ActivationPolicy: lazy Export-Package: org.eclipse.jgit.console;version="4.0.0", org.eclipse.jgit.pgm;version="4.0.0"; 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 4bbb61392..f7591fd80 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 @@ -346,6 +346,7 @@ usage_symbolicVersionForTheProject=Symbolic version for the project usage_tags=fetch all tags usage_notags=do not fetch tags usage_tagMessage=tag message +usage_untrackedFilesMode=show untracked files usage_updateRemoteRefsFromAnotherRepository=Update remote refs from another repository usage_useNameInsteadOfOriginToTrackUpstream=use instead of 'origin' to track upstream usage_checkoutBranchAfterClone=checkout named branch instead of remotes's HEAD 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 2ae950bdc..12d420815 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 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011, 2013 François Rey + * Copyright (C) 2011, 2015 François Rey * and other copyright owners as documented in the project's IP log. * * This program and the accompanying materials are made available @@ -61,6 +61,11 @@ import org.eclipse.jgit.pgm.internal.CLIText; import org.kohsuke.args4j.Option; +import org.eclipse.jgit.pgm.opt.UntrackedFilesHandler; + +/** + * Status command + */ @Command(usage = "usage_Status", common = true) class Status extends TextBuiltin { @@ -75,6 +80,9 @@ class Status extends TextBuiltin { @Option(name = "--porcelain", usage = "usage_machineReadableOutput") protected boolean porcelain; + @Option(name = "--untracked-files", aliases = { "-u", "-uno", "-uall" }, usage = "usage_untrackedFilesMode", handler = UntrackedFilesHandler.class) + protected String untrackedFilesMode = "all"; // default value //$NON-NLS-1$ + @Option(name = "--", metaVar = "metaVar_path", multiValued = true) protected List filterPaths; @@ -174,9 +182,12 @@ else if (missing.contains(path)) } // untracked are always at the end of the list - TreeSet untracked = new TreeSet(status.getUntracked()); - for (String path : untracked) - printPorcelainLine('?', '?', path); + if ("all".equals(untrackedFilesMode)) { //$NON-NLS-1$ + TreeSet untracked = new TreeSet( + status.getUntracked()); + for (String path : untracked) + printPorcelainLine('?', '?', path); + } } private void printPorcelainLine(char x, char y, String path) @@ -240,7 +251,7 @@ private void printLongStatus(org.eclipse.jgit.api.Status status) firstHeader = false; } int nbUntracked = untracked.size(); - if (nbUntracked > 0) { + if (nbUntracked > 0 && ("all".equals(untrackedFilesMode))) { //$NON-NLS-1$ if (!firstHeader) printSectionHeader(""); //$NON-NLS-1$ printSectionHeader(CLIText.get().untrackedFiles); @@ -250,11 +261,13 @@ private void printLongStatus(org.eclipse.jgit.api.Status status) protected void printSectionHeader(String pattern, Object... arguments) throws IOException { - outw.println(CLIText.formatLine(MessageFormat - .format(pattern, arguments))); - if (!pattern.equals("")) //$NON-NLS-1$ - outw.println(CLIText.formatLine("")); //$NON-NLS-1$ - outw.flush(); + if (!porcelain) { + outw.println(CLIText.formatLine(MessageFormat.format(pattern, + arguments))); + if (!pattern.equals("")) //$NON-NLS-1$ + outw.println(CLIText.formatLine("")); //$NON-NLS-1$ + outw.flush(); + } } protected int printList(Collection list) throws IOException { diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/UntrackedFilesHandler.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/UntrackedFilesHandler.java new file mode 100644 index 000000000..c4e8b0537 --- /dev/null +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/opt/UntrackedFilesHandler.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2015 Zend Technologies Ltd. and others + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.eclipse.jgit.pgm.opt; + +import org.kohsuke.args4j.CmdLineException; +import org.kohsuke.args4j.CmdLineParser; +import org.kohsuke.args4j.OptionDef; +import org.kohsuke.args4j.spi.Parameters; +import org.kohsuke.args4j.spi.Setter; +import org.kohsuke.args4j.spi.StringOptionHandler; + +/** + * Special handler for the --untracked-files option of the + * status command. + * + * The following rules apply: + *
    + *
  • If no mode is given, i.e. just --untracked-files is passed, + * then it is the same as --untracked-files=all
  • + *
  • If the -u alias is passed then it is the same as + * --untracked-files
  • + *
  • If the -uno alias is passed then it is the same as + * --untracked-files=no
  • + *
  • If the -uall alias is passed then it is the same as + * --untracked-files=all
  • + *
+ * + * @since 4.0 + */ +public class UntrackedFilesHandler extends StringOptionHandler { + + /** + * @param parser + * The parser to which this handler belongs to. + * @param option + * The annotation. + * @param setter + * Object to be used for setting value. + */ + public UntrackedFilesHandler(CmdLineParser parser, OptionDef option, + Setter setter) { + super(parser, option, setter); + } + + @Override + public int parseArguments(Parameters params) throws CmdLineException { + String alias = params.getParameter(-1); + if ("-u".equals(alias)) { //$NON-NLS-1$ + setter.addValue("all"); //$NON-NLS-1$ + return 0; + } else if ("-uno".equals(alias)) { //$NON-NLS-1$ + setter.addValue("no"); //$NON-NLS-1$ + return 0; + } else if ("-uall".equals(alias)) { //$NON-NLS-1$ + setter.addValue("all"); //$NON-NLS-1$ + return 0; + } else if (params.size() == 0) { + setter.addValue("all"); //$NON-NLS-1$ + return 0; + } else if (params.size() == 1) { + String mode = params.getParameter(0); + if ("no".equals(mode) || "all".equals(mode)) { //$NON-NLS-1$ //$NON-NLS-2$ + setter.addValue(mode); + } else { + throw new CmdLineException(owner, String.format( + "Invalid untracked files mode '%s'", mode)); //$NON-NLS-1$ + } + return 1; + } else { + return super.parseArguments(params); + } + } + +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index cab5c2d9a..254934dd0 100644 --- a/pom.xml +++ b/pom.xml @@ -181,8 +181,7 @@ 0.7.9 4.11 1C - - 2.0.12 + 2.0.15 1.6 4.3.1 2.5