/*
- * Copyright (C) 2012, 2013 François Rey <eclipse.org_@_francois_._rey_._name>
+ * Copyright (C) 2012, 2015 François Rey <eclipse.org_@_francois_._rey_._name>
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
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 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 testStatus() throws Exception {
+ 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");
writeTrashFile("trackedModified", "trackedModified");
writeTrashFile("trackedDeleted", "trackedDeleted");
writeTrashFile("untracked", "untracked");
- // Test untracked
- assertArrayOfLinesEquals(new String[] { // git status output
- "On branch master", //
- "Untracked files:", //
- "",//
- "\tstagedDeleted", //
- "\tstagedModified", //
- "\tstagedNew", //
- "\ttracked", //
- "\ttrackedDeleted", //
- "\ttrackedModified", //
- "\tuntracked", //
- "" //
- }, execute("git status")); //
- // Add to index
+ }
+
+ 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();
- // Test staged count
- assertArrayOfLinesEquals(new String[] { // git status output
- "On branch master", //
- "Changes to be committed:", //
- "", //
- "\tnew file: stagedDeleted", //
- "\tnew file: stagedModified", //
- "\tnew file: tracked", //
- "\tnew file: trackedDeleted", //
- "\tnew file: trackedModified", //
- "", //
- "Untracked files:", //
- "", //
- "\tstagedNew", //
- "\tuntracked", //
- "" //
- }, execute("git status")); //
- // Commit
- git.commit().setMessage("initial commit")
- .call();
- assertArrayOfLinesEquals(new String[] { // git status output
- "On branch master", //
- "Untracked files:", //
- "", //
- "\tstagedNew", //
- "\tuntracked", //
- "" //
- }, execute("git status")); //
- // Make some changes and stage them
+ }
+
+ 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");
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", //
- "Changes to be committed:", //
- "", //
- "\tdeleted: stagedDeleted", //
- "\tmodified: stagedModified", //
- "\tnew file: stagedNew", //
- "", //
- "Changes not staged for commit:", //
- "", //
- "\tdeleted: trackedDeleted", //
- "\tmodified: trackedModified", //
- "", //
- "Untracked files:", //
- "", //
- "\tuntracked", //
- "" //
- }, execute("git status")); //
- // Create unmerged file
+ }
+
+ private void createUnmergedFile(Git git) throws IOException,
+ GitAPIException {
writeTrashFile("unmerged", "unmerged");
git.add().addFilepattern("unmerged").call();
- // Commit pending changes
+ }
+
+ private void commitPendingChanges(Git git) throws GitAPIException {
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:", //
- "", //
- "\tuntracked", //
- "" //
- }, execute("git status")); //
- // Checkout new branch
+ }
+
+ private void checkoutTestBranch(Git git) throws GitAPIException {
git.checkout().setCreateBranch(true).setName("test").call();
- // Test branch status
- assertArrayOfLinesEquals(new String[] { // git status output
- "On branch test", //
- "Untracked files:", //
- "", //
- "\tuntracked", //
- "" //
- }, execute("git status")); //
- // Commit change and checkout master again
+ }
+
+ private RevCommit commitChangesInTestBranch(Git git) throws IOException,
+ GitAPIException {
writeTrashFile("unmerged", "changed in test branch");
git.add().addFilepattern("unmerged").call();
- RevCommit testBranch = git.commit()
+ return git.commit()
.setMessage("changed unmerged in test branch").call();
- assertArrayOfLinesEquals(new String[] { // git status output
- "On branch test", //
- "Untracked files:", //
- "", //
- "\tuntracked", //
- "" //
- }, execute("git status")); //
+ }
+
+ private void checkoutMasterBranch(Git git) throws GitAPIException {
git.checkout().setName("master").call();
- // Change the same file and commit
+ }
+
+ 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();
- assertArrayOfLinesEquals(new String[] { // git status output
- "On branch master", //
- "Untracked files:", //
- "", //
- "\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
+ }
+
+ 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();
- assertArrayOfLinesEquals(new String[] { // git status output
- "Not currently on any branch.", //
- "Unmerged paths:", //
- "", //
- "\tboth modified: unmerged", //
- "", //
- "Untracked files:", //
- "", //
- "\tuntracked", //
- "" //
- }, execute("git status")); //
}
- @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
+ 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", //
"?? trackedModified", //
"?? 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
+ };
+ } else {
+ output = new String[] { //
+ "" //
+ };
+ }
+ } else {
+ if (untrackedFiles) {
+ output = new String[] { //
+ "On branch master", //
+ "Untracked files:", //
+ "",//
+ "\tstagedDeleted", //
+ "\tstagedModified", //
+ "\tstagedNew", //
+ "\ttracked", //
+ "\ttrackedDeleted", //
+ "\ttrackedModified", //
+ "\tuntracked", //
+ "" //
+ };
+ } 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", //
"?? stagedNew", //
"?? untracked", //
"" //
- }, execute("git status --porcelain")); //
- // Commit
- git.commit().setMessage("initial commit").call();
- assertArrayOfLinesEquals(new String[] { // git status output
+ };
+ } 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", //
+ "\tnew file: stagedModified", //
+ "\tnew file: tracked", //
+ "\tnew file: trackedDeleted", //
+ "\tnew file: trackedModified", //
+ "", //
+ "Untracked files:", //
+ "", //
+ "\tstagedNew", //
+ "\tuntracked", //
+ "" //
+ };
+ } 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", //
"" //
- }, 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
+ };
+ } else {
+ output = new String[] { //
+ "" //
+ };
+ }
+ } else {
+ if (untrackedFiles) {
+ output = new String[] { //
+ "On branch master", //
+ "Untracked files:", //
+ "", //
+ "\tstagedNew", //
+ "\tuntracked", //
+ "" //
+ };
+ } 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", //
" M trackedModified", //
"?? untracked", //
"" //
- }, 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", //
+ };
+ } else {
+ output = new String[] { //
+ "D stagedDeleted", //
+ "M stagedModified", //
+ "A stagedNew", //
+ " D trackedDeleted", //
+ " M trackedModified", //
"" //
- }, execute("git status --porcelain")); //
- // Checkout new branch
- git.checkout().setCreateBranch(true).setName("test").call();
- // Test branch status
- assertArrayOfLinesEquals(new String[] { // git status output
- "?? untracked", //
+ };
+ }
+ } else {
+ if (untrackedFiles) {
+ output = new String[] { //
+ "On branch master", //
+ "Changes to be committed:", //
+ "", //
+ "\tdeleted: stagedDeleted", //
+ "\tmodified: stagedModified", //
+ "\tnew file: stagedNew", //
+ "", //
+ "Changes not staged for commit:", //
+ "", //
+ "\tdeleted: trackedDeleted", //
+ "\tmodified: trackedModified", //
+ "", //
+ "Untracked files:", //
+ "", //
+ "\tuntracked", //
"" //
- }, 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
+ };
+ } else {
+ output = new String[] { //
+ "On branch master", //
+ "Changes to be committed:", //
+ "", //
+ "\tdeleted: stagedDeleted", //
+ "\tmodified: stagedModified", //
+ "\tnew file: stagedNew", //
+ "", //
+ "Changes not staged for commit:", //
+ "", //
+ "\tdeleted: trackedDeleted", //
+ "\tmodified: trackedModified", //
+ "", //
+ };
+ }
+ }
+
+ assertArrayOfLinesEquals(output, execute(command));
+ }
+
+ 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")); //
- 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", //
+ };
+ } else {
+ output = new String[] { //
"" //
- }, execute("git status --porcelain")); //
- // Merge test branch into master
- git.merge().include(testBranch.getId()).call();
- // Test unmerged status
- assertArrayOfLinesEquals(new String[] { // git status output
+ };
+ }
+ } else {
+ if (untrackedFiles) {
+ output = new String[] { //
+ branchHeader, //
+ "Untracked files:", //
+ "", //
+ "\tuntracked", //
+ "" //
+ };
+ } else {
+ output = new String[] { //
+ branchHeader, //
+ "" //
+ };
+ }
+ }
+
+ 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));
}
}
--- /dev/null
+/*
+ * 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 <code>--untracked-files</code> option of the
+ * <code>status</code> command.
+ *
+ * The following rules apply:
+ * <ul>
+ * <li>If no mode is given, i.e. just <code>--untracked-files</code> is passed,
+ * then it is the same as <code>--untracked-files=all</code></li>
+ * <li>If the <code>-u</code> alias is passed then it is the same as
+ * <code>--untracked-files</code></li>
+ * <li>If the <code>-uno</code> alias is passed then it is the same as
+ * <code>--untracked-files=no</code></li>
+ * <li>If the <code>-uall</code> alias is passed then it is the same as
+ * <code>--untracked-files=all</code></li>
+ * </ul>
+ *
+ * @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<? super String> 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