@ -62,6 +62,7 @@ import org.eclipse.jgit.junit.RepositoryTestCase;
import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason ;
import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason ;
import org.eclipse.jgit.revwalk.RevCommit ;
import org.eclipse.jgit.revwalk.RevCommit ;
import org.eclipse.jgit.treewalk.FileTreeIterator ;
import org.eclipse.jgit.treewalk.FileTreeIterator ;
import org.eclipse.jgit.util.FS ;
import org.eclipse.jgit.util.FileUtils ;
import org.eclipse.jgit.util.FileUtils ;
import org.junit.Assert ;
import org.junit.Assert ;
import org.junit.experimental.theories.DataPoint ;
import org.junit.experimental.theories.DataPoint ;
@ -694,7 +695,7 @@ public class ResolveMergerTest extends RepositoryTestCase {
// Create initial content and remember when the last file was written.
// Create initial content and remember when the last file was written.
f = writeTrashFiles ( false , "orig" , "orig" , "1\n2\n3" , "orig" , "orig" ) ;
f = writeTrashFiles ( false , "orig" , "orig" , "1\n2\n3" , "orig" , "orig" ) ;
lastTs4 = f . lastModified ( ) ;
lastTs4 = FS . DETECTED . lastModified ( f ) ;
// add all files, commit and check this doesn't update any working tree
// add all files, commit and check this doesn't update any working tree
// files and that the index is in a new file system timer tick. Make
// files and that the index is in a new file system timer tick. Make
@ -707,8 +708,8 @@ public class ResolveMergerTest extends RepositoryTestCase {
checkConsistentLastModified ( "0" , "1" , "2" , "3" , "4" ) ;
checkConsistentLastModified ( "0" , "1" , "2" , "3" , "4" ) ;
checkModificationTimeStampOrder ( "1" , "2" , "3" , "4" , "<.git/index" ) ;
checkModificationTimeStampOrder ( "1" , "2" , "3" , "4" , "<.git/index" ) ;
assertEquals ( "Commit should not touch working tree file 4" , lastTs4 ,
assertEquals ( "Commit should not touch working tree file 4" , lastTs4 ,
new File ( db . getWorkTree ( ) , "4" ) . lastModified ( ) ) ;
FS . DETECTED . lastModified ( new File ( db . getWorkTree ( ) , "4" ) ) ) ;
lastTsIndex = indexFile . lastModified ( ) ;
lastTsIndex = FS . DETECTED . lastModified ( indexFile ) ;
// Do modifications on the master branch. Then add and commit. This
// Do modifications on the master branch. Then add and commit. This
// should touch only "0", "2 and "3"
// should touch only "0", "2 and "3"
@ -722,7 +723,7 @@ public class ResolveMergerTest extends RepositoryTestCase {
checkConsistentLastModified ( "0" , "1" , "2" , "3" , "4" ) ;
checkConsistentLastModified ( "0" , "1" , "2" , "3" , "4" ) ;
checkModificationTimeStampOrder ( "1" , "4" , "*" + lastTs4 , "<*"
checkModificationTimeStampOrder ( "1" , "4" , "*" + lastTs4 , "<*"
+ lastTsIndex , "<0" , "2" , "3" , "<.git/index" ) ;
+ lastTsIndex , "<0" , "2" , "3" , "<.git/index" ) ;
lastTsIndex = indexFile . lastModified ( ) ;
lastTsIndex = FS . DETECTED . lastModified ( indexFile ) ;
// Checkout a side branch. This should touch only "0", "2 and "3"
// Checkout a side branch. This should touch only "0", "2 and "3"
fsTick ( indexFile ) ;
fsTick ( indexFile ) ;
@ -731,7 +732,7 @@ public class ResolveMergerTest extends RepositoryTestCase {
checkConsistentLastModified ( "0" , "1" , "2" , "3" , "4" ) ;
checkConsistentLastModified ( "0" , "1" , "2" , "3" , "4" ) ;
checkModificationTimeStampOrder ( "1" , "4" , "*" + lastTs4 , "<*"
checkModificationTimeStampOrder ( "1" , "4" , "*" + lastTs4 , "<*"
+ lastTsIndex , "<0" , "2" , "3" , ".git/index" ) ;
+ lastTsIndex , "<0" , "2" , "3" , ".git/index" ) ;
lastTsIndex = indexFile . lastModified ( ) ;
lastTsIndex = FS . DETECTED . lastModified ( indexFile ) ;
// This checkout may have populated worktree and index so fast that we
// This checkout may have populated worktree and index so fast that we
// may have smudged entries now. Check that we have the right content
// may have smudged entries now. Check that we have the right content
@ -744,13 +745,13 @@ public class ResolveMergerTest extends RepositoryTestCase {
indexState ( CONTENT ) ) ;
indexState ( CONTENT ) ) ;
fsTick ( indexFile ) ;
fsTick ( indexFile ) ;
f = writeTrashFiles ( false , "orig" , "orig" , "1\n2\n3" , "orig" , "orig" ) ;
f = writeTrashFiles ( false , "orig" , "orig" , "1\n2\n3" , "orig" , "orig" ) ;
lastTs4 = f . lastModified ( ) ;
lastTs4 = FS . DETECTED . lastModified ( f ) ;
fsTick ( f ) ;
fsTick ( f ) ;
git . add ( ) . addFilepattern ( "." ) . call ( ) ;
git . add ( ) . addFilepattern ( "." ) . call ( ) ;
checkConsistentLastModified ( "0" , "1" , "2" , "3" , "4" ) ;
checkConsistentLastModified ( "0" , "1" , "2" , "3" , "4" ) ;
checkModificationTimeStampOrder ( "*" + lastTsIndex , "<0" , "1" , "2" , "3" ,
checkModificationTimeStampOrder ( "*" + lastTsIndex , "<0" , "1" , "2" , "3" ,
"4" , "<.git/index" ) ;
"4" , "<.git/index" ) ;
lastTsIndex = indexFile . lastModified ( ) ;
lastTsIndex = FS . DETECTED . lastModified ( indexFile ) ;
// Do modifications on the side branch. Touch only "1", "2 and "3"
// Do modifications on the side branch. Touch only "1", "2 and "3"
fsTick ( indexFile ) ;
fsTick ( indexFile ) ;
@ -761,7 +762,7 @@ public class ResolveMergerTest extends RepositoryTestCase {
checkConsistentLastModified ( "0" , "1" , "2" , "3" , "4" ) ;
checkConsistentLastModified ( "0" , "1" , "2" , "3" , "4" ) ;
checkModificationTimeStampOrder ( "0" , "4" , "*" + lastTs4 , "<*"
checkModificationTimeStampOrder ( "0" , "4" , "*" + lastTs4 , "<*"
+ lastTsIndex , "<1" , "2" , "3" , "<.git/index" ) ;
+ lastTsIndex , "<1" , "2" , "3" , "<.git/index" ) ;
lastTsIndex = indexFile . lastModified ( ) ;
lastTsIndex = FS . DETECTED . lastModified ( indexFile ) ;
// merge master and side. Should only touch "0," "2" and "3"
// merge master and side. Should only touch "0," "2" and "3"
fsTick ( indexFile ) ;
fsTick ( indexFile ) ;
@ -789,7 +790,7 @@ public class ResolveMergerTest extends RepositoryTestCase {
"IndexEntry with path "
"IndexEntry with path "
+ path
+ path
+ " has lastmodified with is different from the worktree file" ,
+ " has lastmodified with is different from the worktree file" ,
new File ( workTree , path ) . lastModified ( ) , dc . getEntry ( path )
FS . DETECTED . lastModified ( new File ( workTree , path ) ) , dc . getEntry ( path )
. getLastModified ( ) ) ;
. getLastModified ( ) ) ;
}
}
@ -799,14 +800,15 @@ public class ResolveMergerTest extends RepositoryTestCase {
// then this file must be younger then file i. A path "*<modtime>"
// then this file must be younger then file i. A path "*<modtime>"
// represents a file with a modification time of <modtime>
// represents a file with a modification time of <modtime>
// E.g. ("a", "b", "<c", "f/a.txt") means: a<=b<c<=f/a.txt
// E.g. ("a", "b", "<c", "f/a.txt") means: a<=b<c<=f/a.txt
private void checkModificationTimeStampOrder ( String . . . pathes ) {
private void checkModificationTimeStampOrder ( String . . . pathes )
throws IOException {
long lastMod = Long . MIN_VALUE ;
long lastMod = Long . MIN_VALUE ;
for ( String p : pathes ) {
for ( String p : pathes ) {
boolean strong = p . startsWith ( "<" ) ;
boolean strong = p . startsWith ( "<" ) ;
boolean fixed = p . charAt ( strong ? 1 : 0 ) = = '*' ;
boolean fixed = p . charAt ( strong ? 1 : 0 ) = = '*' ;
p = p . substring ( ( strong ? 1 : 0 ) + ( fixed ? 1 : 0 ) ) ;
p = p . substring ( ( strong ? 1 : 0 ) + ( fixed ? 1 : 0 ) ) ;
long curMod = fixed ? Long . valueOf ( p ) . longValue ( ) : new File (
long curMod = fixed ? Long . valueOf ( p ) . longValue ( )
db . getWorkTree ( ) , p ) . lastModified ( ) ;
: FS . DETECTED . lastModified ( new File ( db . getWorkTree ( ) , p ) ) ;
if ( strong )
if ( strong )
assertTrue ( "path " + p + " is not younger than predecesssor" ,
assertTrue ( "path " + p + " is not younger than predecesssor" ,
curMod > lastMod ) ;
curMod > lastMod ) ;