summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.pgm.test/tst
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jgit.pgm.test/tst')
-rw-r--r--org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/StatusTest.java634
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));
}
}