Browse Source

Merge "Fix CheckoutCommand to return updated files even on NONDELETED status"

tags/v4.6.0.201612231935-r
Christian Halstrick 7 years ago
parent
commit
295e5a4f1e

+ 33
- 0
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java View File

@@ -89,6 +89,7 @@ import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.transport.URIish;
import org.eclipse.jgit.util.FileUtils;
import org.eclipse.jgit.util.SystemReader;
import org.junit.Before;
import org.junit.Test;

@@ -791,6 +792,38 @@ public class CheckoutCommandTest extends RepositoryTestCase {
}
}

@Test
public void testNonDeletableFilesOnWindows()
throws GitAPIException, IOException {
// Only on windows a FileInputStream blocks us from deleting a file
org.junit.Assume.assumeTrue(SystemReader.getInstance().isWindows());
writeTrashFile("toBeModified.txt", "a");
writeTrashFile("toBeDeleted.txt", "a");
git.add().addFilepattern(".").call();
RevCommit addFiles = git.commit().setMessage("add more files").call();

git.rm().setCached(false).addFilepattern("Test.txt")
.addFilepattern("toBeDeleted.txt").call();
writeTrashFile("toBeModified.txt", "b");
writeTrashFile("toBeCreated.txt", "a");
git.add().addFilepattern(".").call();
RevCommit crudCommit = git.commit().setMessage("delete, modify, add")
.call();
git.checkout().setName(addFiles.getName()).call();
try ( FileInputStream fis=new FileInputStream(new File(db.getWorkTree(), "Test.txt")) ) {
CheckoutCommand coCommand = git.checkout();
coCommand.setName(crudCommit.getName()).call();
CheckoutResult result = coCommand.getResult();
assertEquals(Status.NONDELETED, result.getStatus());
assertEquals("[Test.txt, toBeDeleted.txt]",
result.getRemovedList().toString());
assertEquals("[toBeCreated.txt, toBeModified.txt]",
result.getModifiedList().toString());
assertEquals("[Test.txt]", result.getUndeletedList().toString());
assertTrue(result.getConflictList().isEmpty());
}
}

private File writeTempFile(String body) throws IOException {
File f = File.createTempFile("AddCommandTest_", "");
JGitTestUtil.write(f, body);

+ 3
- 1
org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java View File

@@ -318,7 +318,9 @@ public class CheckoutCommand extends GitCommand<Ref> {

if (!dco.getToBeDeleted().isEmpty()) {
status = new CheckoutResult(Status.NONDELETED,
dco.getToBeDeleted());
dco.getToBeDeleted(),
new ArrayList<String>(dco.getUpdated().keySet()),
dco.getRemoved());
} else
status = new CheckoutResult(new ArrayList<String>(dco
.getUpdated().keySet()), dco.getRemoved());

+ 24
- 2
org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutResult.java View File

@@ -113,6 +113,28 @@ public class CheckoutResult {
* {@link Status#CONFLICTS} or {@link Status#NONDELETED}.
*/
CheckoutResult(Status status, List<String> fileList) {
this(status, fileList, null, null);
}

/**
* Create a new fail result. If status is {@link Status#CONFLICTS},
* <code>fileList</code> is a list of conflicting files, if status is
* {@link Status#NONDELETED}, <code>fileList</code> is a list of not deleted
* files. All other values ignore <code>fileList</code>. To create a result
* for {@link Status#OK}, see {@link #CheckoutResult(List, List)}.
*
* @param status
* the failure status
* @param fileList
* the list of files to store, status has to be either
* {@link Status#CONFLICTS} or {@link Status#NONDELETED}.
* @param modified
* the modified files
* @param removed
* the removed files.
*/
CheckoutResult(Status status, List<String> fileList, List<String> modified,
List<String> removed) {
myStatus = status;
if (status == Status.CONFLICTS)
this.conflictList = fileList;
@@ -123,8 +145,8 @@ public class CheckoutResult {
else
this.undeletedList = new ArrayList<String>(0);

this.modifiedList = new ArrayList<String>(0);
this.removedList = new ArrayList<String>(0);
this.modifiedList = modified;
this.removedList = removed;
}

/**

Loading…
Cancel
Save