diff options
Diffstat (limited to 'org.eclipse.jgit.pgm.test/tst')
-rw-r--r-- | org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/StatusTest.java | 634 |
1 files changed, 428 insertions, 206 deletions
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 7ffcae598a..793fc7daf6 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 <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 @@ -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 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"); @@ -61,55 +188,22 @@ public class StatusTest extends CLIRepositoryTestCase { 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"); @@ -117,116 +211,60 @@ public class StatusTest extends CLIRepositoryTestCase { 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", // @@ -235,15 +273,45 @@ public class StatusTest extends CLIRepositoryTestCase { "?? 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", // @@ -252,24 +320,97 @@ public class StatusTest extends CLIRepositoryTestCase { "?? 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", // @@ -277,58 +418,139 @@ public class StatusTest extends CLIRepositoryTestCase { " 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)); } } |