@ -80,7 +80,6 @@ import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.ReflogEntry ;
import org.eclipse.jgit.lib.RepositoryState ;
import org.eclipse.jgit.merge.MergeStrategy ;
import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason ;
import org.eclipse.jgit.revwalk.RevCommit ;
import org.eclipse.jgit.revwalk.RevWalk ;
import org.eclipse.jgit.util.FileUtils ;
@ -1200,9 +1199,9 @@ public class RebaseCommandTest extends RepositoryTestCase {
// rebase
RebaseResult result = git . rebase ( ) . setUpstream ( "refs/heads/master" )
. call ( ) ;
assertEquals ( Status . CONFLICT S, result . getStatus ( ) ) ;
assertEquals ( 1 , result . getConflict s ( ) . size ( ) ) ;
assertEquals ( "file2" , result . getConflict s ( ) . get ( 0 ) ) ;
assertEquals ( Status . UNCOMMITTED_CHANGE S, result . getStatus ( ) ) ;
assertEquals ( 1 , result . getUncommittedChange s ( ) . size ( ) ) ;
assertEquals ( "file2" , result . getUncommittedChange s ( ) . get ( 0 ) ) ;
}
@Test
@ -1233,9 +1232,9 @@ public class RebaseCommandTest extends RepositoryTestCase {
RebaseResult result = git . rebase ( ) . setUpstream ( "refs/heads/master" )
. call ( ) ;
assertEquals ( Status . CONFLICT S, result . getStatus ( ) ) ;
assertEquals ( 1 , result . getConflict s ( ) . size ( ) ) ;
assertEquals ( "file2" , result . getConflict s ( ) . get ( 0 ) ) ;
assertEquals ( Status . UNCOMMITTED_CHANGE S, result . getStatus ( ) ) ;
assertEquals ( 1 , result . getUncommittedChange s ( ) . size ( ) ) ;
assertEquals ( "file2" , result . getUncommittedChange s ( ) . get ( 0 ) ) ;
checkFile ( uncommittedFile , "uncommitted file2" ) ;
assertEquals ( RepositoryState . SAFE , git . getRepository ( ) . getRepositoryState ( ) ) ;
@ -1268,9 +1267,9 @@ public class RebaseCommandTest extends RepositoryTestCase {
// rebase
RebaseResult result = git . rebase ( ) . setUpstream ( "refs/heads/master" )
. call ( ) ;
assertEquals ( Status . CONFLICT S, result . getStatus ( ) ) ;
assertEquals ( 1 , result . getConflict s ( ) . size ( ) ) ;
assertEquals ( FILE1 , result . getConflict s ( ) . get ( 0 ) ) ;
assertEquals ( Status . UNCOMMITTED_CHANGE S, result . getStatus ( ) ) ;
assertEquals ( 1 , result . getUncommittedChange s ( ) . size ( ) ) ;
assertEquals ( FILE1 , result . getUncommittedChange s ( ) . get ( 0 ) ) ;
}
@Test
@ -1302,9 +1301,9 @@ public class RebaseCommandTest extends RepositoryTestCase {
// rebase
RebaseResult result = git . rebase ( ) . setUpstream ( "refs/heads/master" )
. call ( ) ;
assertEquals ( Status . CONFLICT S, result . getStatus ( ) ) ;
assertEquals ( 1 , result . getConflict s ( ) . size ( ) ) ;
assertEquals ( FILE1 , result . getConflict s ( ) . get ( 0 ) ) ;
assertEquals ( Status . UNCOMMITTED_CHANGE S, result . getStatus ( ) ) ;
assertEquals ( 1 , result . getUncommittedChange s ( ) . size ( ) ) ;
assertEquals ( FILE1 , result . getUncommittedChange s ( ) . get ( 0 ) ) ;
}
@Test
@ -1333,7 +1332,8 @@ public class RebaseCommandTest extends RepositoryTestCase {
writeTrashFile ( "file0" , "unstaged modified file0" ) ;
// rebase
assertEquals ( Status . OK , git . rebase ( ) . setUpstream ( "refs/heads/master" )
assertEquals ( Status . UNCOMMITTED_CHANGES ,
git . rebase ( ) . setUpstream ( "refs/heads/master" )
. call ( ) . getStatus ( ) ) ;
}
@ -1371,12 +1371,8 @@ public class RebaseCommandTest extends RepositoryTestCase {
// rebase
RebaseResult result = git . rebase ( ) . setUpstream ( "refs/heads/master" )
. call ( ) ;
assertEquals ( Status . FAILED , result . getStatus ( ) ) ;
// staged file0 causes DIRTY_INDEX
assertEquals ( 1 , result . getFailingPaths ( ) . size ( ) ) ;
assertEquals ( MergeFailureReason . DIRTY_INDEX , result . getFailingPaths ( )
. get ( "file0" ) ) ;
assertEquals ( "unstaged modified file0" , read ( file0 ) ) ;
assertEquals ( Status . UNCOMMITTED_CHANGES , result . getStatus ( ) ) ;
assertEquals ( 1 , result . getUncommittedChanges ( ) . size ( ) ) ;
// index shall be unchanged
assertEquals ( indexState , indexState ( CONTENT ) ) ;
assertEquals ( RepositoryState . SAFE , db . getRepositoryState ( ) ) ;
@ -1412,7 +1408,8 @@ public class RebaseCommandTest extends RepositoryTestCase {
writeTrashFile ( "file0" , "unstaged modified file0" ) ;
// rebase
assertEquals ( Status . OK , git . rebase ( ) . setUpstream ( "refs/heads/master" )
assertEquals ( Status . UNCOMMITTED_CHANGES ,
git . rebase ( ) . setUpstream ( "refs/heads/master" )
. call ( ) . getStatus ( ) ) ;
}
@ -1453,17 +1450,91 @@ public class RebaseCommandTest extends RepositoryTestCase {
// rebase
RebaseResult result = git . rebase ( ) . setUpstream ( "refs/heads/master" )
. call ( ) ;
assertEquals ( Status . FAILED , result . getStatus ( ) ) ;
assertEquals ( Status . UNCOMMITTED_CHANGES , result . getStatus ( ) ) ;
// staged file0 causes DIRTY_INDEX
assertEquals ( 1 , result . getFailingPaths ( ) . size ( ) ) ;
assertEquals ( MergeFailureReason . DIRTY_INDEX , result . getFailingPaths ( )
. get ( "file0" ) ) ;
assertEquals ( 1 , result . getUncommittedChanges ( ) . size ( ) ) ;
assertEquals ( "unstaged modified file0" , read ( file0 ) ) ;
// index shall be unchanged
assertEquals ( indexState , indexState ( CONTENT ) ) ;
assertEquals ( RepositoryState . SAFE , db . getRepositoryState ( ) ) ;
}
@Test
public void testFastForwardRebaseWithModification ( ) throws Exception {
// create file0 + file1, add and commit
writeTrashFile ( "file0" , "file0" ) ;
writeTrashFile ( FILE1 , "file1" ) ;
git . add ( ) . addFilepattern ( "file0" ) . addFilepattern ( FILE1 ) . call ( ) ;
RevCommit commit = git . commit ( ) . setMessage ( "commit1" ) . call ( ) ;
// create topic branch
createBranch ( commit , "refs/heads/topic" ) ;
// still on master / modify file1, add and commit
writeTrashFile ( FILE1 , "modified file1" ) ;
git . add ( ) . addFilepattern ( FILE1 ) . call ( ) ;
git . commit ( ) . setMessage ( "commit2" ) . call ( ) ;
// checkout topic branch / modify file0 and add to index
checkoutBranch ( "refs/heads/topic" ) ;
writeTrashFile ( "file0" , "modified file0 in index" ) ;
git . add ( ) . addFilepattern ( "file0" ) . addFilepattern ( FILE1 ) . call ( ) ;
// modify once more
writeTrashFile ( "file0" , "modified file0" ) ;
// rebase
RebaseResult result = git . rebase ( ) . setUpstream ( "refs/heads/master" )
. call ( ) ;
assertEquals ( Status . FAST_FORWARD , result . getStatus ( ) ) ;
checkFile ( new File ( db . getWorkTree ( ) , "file0" ) , "modified file0" ) ;
checkFile ( new File ( db . getWorkTree ( ) , FILE1 ) , "modified file1" ) ;
assertEquals ( "[file0, mode:100644, content:modified file0 in index]"
+ "[file1, mode:100644, content:modified file1]" ,
indexState ( CONTENT ) ) ;
assertEquals ( RepositoryState . SAFE , db . getRepositoryState ( ) ) ;
}
@Test
public void testRebaseWithModificationShouldNotDeleteData ( )
throws Exception {
// create file0 + file1, add and commit
writeTrashFile ( "file0" , "file0" ) ;
writeTrashFile ( FILE1 , "file1" ) ;
git . add ( ) . addFilepattern ( "file0" ) . addFilepattern ( FILE1 ) . call ( ) ;
RevCommit commit = git . commit ( ) . setMessage ( "commit1" ) . call ( ) ;
// create topic branch
createBranch ( commit , "refs/heads/topic" ) ;
// still on master / modify file1, add and commit
writeTrashFile ( FILE1 , "modified file1" ) ;
git . add ( ) . addFilepattern ( FILE1 ) . call ( ) ;
git . commit ( ) . setMessage ( "commit2" ) . call ( ) ;
// checkout topic branch / modify file1, add and commit
checkoutBranch ( "refs/heads/topic" ) ;
writeTrashFile ( FILE1 , "modified file1 on topic" ) ;
git . add ( ) . addFilepattern ( FILE1 ) . call ( ) ;
git . commit ( ) . setMessage ( "commit3" ) . call ( ) ;
writeTrashFile ( "file0" , "modified file0" ) ;
RebaseResult result = git . rebase ( ) . setUpstream ( "refs/heads/master" )
. call ( ) ;
// the following condition was true before commit 83b6ab233:
// jgit started the rebase and deleted the change on abort
// This test should verify that content was deleted
if ( result . getStatus ( ) = = Status . STOPPED )
git . rebase ( ) . setOperation ( Operation . ABORT ) . call ( ) ;
checkFile ( new File ( db . getWorkTree ( ) , "file0" ) , "modified file0" ) ;
checkFile ( new File ( db . getWorkTree ( ) , FILE1 ) ,
"modified file1 on topic" ) ;
assertEquals ( "[file0, mode:100644, content:file0]"
+ "[file1, mode:100644, content:modified file1 on topic]" ,
indexState ( CONTENT ) ) ;
}
@Test
public void testRebaseWithUncommittedDelete ( ) throws Exception {
// create file0 + file1, add and commit
@ -1595,9 +1666,9 @@ public class RebaseCommandTest extends RepositoryTestCase {
// and attempt to rebase
RebaseResult rebaseResult = git . rebase ( )
. setUpstream ( "refs/heads/master" ) . call ( ) ;
assertEquals ( Status . CONFLICT S, rebaseResult . getStatus ( ) ) ;
assertEquals ( 1 , rebaseResult . getConflict s ( ) . size ( ) ) ;
assertEquals ( FILE1 , rebaseResult . getConflict s ( ) . get ( 0 ) ) ;
assertEquals ( Status . UNCOMMITTED_CHANGE S, rebaseResult . getStatus ( ) ) ;
assertEquals ( 1 , rebaseResult . getUncommittedChange s ( ) . size ( ) ) ;
assertEquals ( FILE1 , rebaseResult . getUncommittedChange s ( ) . get ( 0 ) ) ;
checkFile ( theFile , "dirty the file" ) ;
@ -2585,6 +2656,59 @@ public class RebaseCommandTest extends RepositoryTestCase {
}
@Test
public void testInteractiveRebaseWithModificationShouldNotDeleteDataOnAbort ( )
throws Exception {
// create file0 + file1, add and commit
writeTrashFile ( "file0" , "file0" ) ;
writeTrashFile ( FILE1 , "file1" ) ;
git . add ( ) . addFilepattern ( "file0" ) . addFilepattern ( FILE1 ) . call ( ) ;
git . commit ( ) . setMessage ( "commit1" ) . call ( ) ;
// modify file1, add and commit
writeTrashFile ( FILE1 , "modified file1" ) ;
git . add ( ) . addFilepattern ( FILE1 ) . call ( ) ;
git . commit ( ) . setMessage ( "commit2" ) . call ( ) ;
// modify file1, add and commit
writeTrashFile ( FILE1 , "modified file1 a second time" ) ;
git . add ( ) . addFilepattern ( FILE1 ) . call ( ) ;
git . commit ( ) . setMessage ( "commit3" ) . call ( ) ;
// modify file0, but do not commit
writeTrashFile ( "file0" , "modified file0 in index" ) ;
git . add ( ) . addFilepattern ( "file0" ) . addFilepattern ( FILE1 ) . call ( ) ;
// do not commit
writeTrashFile ( "file0" , "modified file0" ) ;
// start rebase
RebaseResult result = git . rebase ( ) . setUpstream ( "HEAD~2" )
. runInteractively ( new InteractiveHandler ( ) {
public void prepareSteps ( List < RebaseTodoLine > steps ) {
steps . get ( 0 ) . setAction ( Action . EDIT ) ;
steps . get ( 1 ) . setAction ( Action . PICK ) ;
}
public String modifyCommitMessage ( String commit ) {
return commit ;
}
} ) . call ( ) ;
// the following condition was true before commit 83b6ab233:
// jgit started the rebase and deleted the change on abort
// This test should verify that content was deleted
if ( result . getStatus ( ) = = Status . EDIT )
git . rebase ( ) . setOperation ( Operation . ABORT ) . call ( ) ;
checkFile ( new File ( db . getWorkTree ( ) , "file0" ) , "modified file0" ) ;
checkFile ( new File ( db . getWorkTree ( ) , "file1" ) ,
"modified file1 a second time" ) ;
assertEquals ( "[file0, mode:100644, content:modified file0 in index]"
+ "[file1, mode:100644, content:modified file1 a second time]" ,
indexState ( CONTENT ) ) ;
}
private File getTodoFile ( ) {
File todoFile = new File ( db . getDirectory ( ) , GIT_REBASE_TODO ) ;
return todoFile ;