@ -186,297 +186,302 @@ public class CommitCommandTest extends RepositoryTestCase {
@Test
public void commitNewSubmodule ( ) throws Exception {
Git git = new Git ( db ) ;
writeTrashFile ( "file.txt" , "content" ) ;
git . add ( ) . addFilepattern ( "file.txt" ) . call ( ) ;
RevCommit commit = git . commit ( ) . setMessage ( "create file" ) . call ( ) ;
SubmoduleAddCommand command = new SubmoduleAddCommand ( db ) ;
String path = "sub" ;
command . setPath ( path ) ;
String uri = db . getDirectory ( ) . toURI ( ) . toString ( ) ;
command . setURI ( uri ) ;
Repository repo = command . call ( ) ;
assertNotNull ( repo ) ;
addRepoToClose ( repo ) ;
SubmoduleWalk generator = SubmoduleWalk . forIndex ( db ) ;
assertTrue ( generator . next ( ) ) ;
assertEquals ( path , generator . getPath ( ) ) ;
assertEquals ( commit , generator . getObjectId ( ) ) ;
assertEquals ( uri , generator . getModulesUrl ( ) ) ;
assertEquals ( path , generator . getModulesPath ( ) ) ;
assertEquals ( uri , generator . getConfigUrl ( ) ) ;
Repository subModRepo = generator . getRepository ( ) ;
assertNotNull ( subModRepo ) ;
subModRepo . close ( ) ;
assertEquals ( commit , repo . resolve ( Constants . HEAD ) ) ;
RevCommit submoduleCommit = git . commit ( ) . setMessage ( "submodule add" )
. setOnly ( path ) . call ( ) ;
assertNotNull ( submoduleCommit ) ;
TreeWalk walk = new TreeWalk ( db ) ;
walk . addTree ( commit . getTree ( ) ) ;
walk . addTree ( submoduleCommit . getTree ( ) ) ;
walk . setFilter ( TreeFilter . ANY_DIFF ) ;
List < DiffEntry > diffs = DiffEntry . scan ( walk ) ;
assertEquals ( 1 , diffs . size ( ) ) ;
DiffEntry subDiff = diffs . get ( 0 ) ;
assertEquals ( FileMode . MISSING , subDiff . getOldMode ( ) ) ;
assertEquals ( FileMode . GITLINK , subDiff . getNewMode ( ) ) ;
assertEquals ( ObjectId . zeroId ( ) , subDiff . getOldId ( ) . toObjectId ( ) ) ;
assertEquals ( commit , subDiff . getNewId ( ) . toObjectId ( ) ) ;
assertEquals ( path , subDiff . getNewPath ( ) ) ;
try ( Git git = new Git ( db ) ) {
writeTrashFile ( "file.txt" , "content" ) ;
git . add ( ) . addFilepattern ( "file.txt" ) . call ( ) ;
RevCommit commit = git . commit ( ) . setMessage ( "create file" ) . call ( ) ;
SubmoduleAddCommand command = new SubmoduleAddCommand ( db ) ;
String path = "sub" ;
command . setPath ( path ) ;
String uri = db . getDirectory ( ) . toURI ( ) . toString ( ) ;
command . setURI ( uri ) ;
Repository repo = command . call ( ) ;
assertNotNull ( repo ) ;
addRepoToClose ( repo ) ;
SubmoduleWalk generator = SubmoduleWalk . forIndex ( db ) ;
assertTrue ( generator . next ( ) ) ;
assertEquals ( path , generator . getPath ( ) ) ;
assertEquals ( commit , generator . getObjectId ( ) ) ;
assertEquals ( uri , generator . getModulesUrl ( ) ) ;
assertEquals ( path , generator . getModulesPath ( ) ) ;
assertEquals ( uri , generator . getConfigUrl ( ) ) ;
Repository subModRepo = generator . getRepository ( ) ;
assertNotNull ( subModRepo ) ;
subModRepo . close ( ) ;
assertEquals ( commit , repo . resolve ( Constants . HEAD ) ) ;
RevCommit submoduleCommit = git . commit ( ) . setMessage ( "submodule add" )
. setOnly ( path ) . call ( ) ;
assertNotNull ( submoduleCommit ) ;
try ( TreeWalk walk = new TreeWalk ( db ) ) {
walk . addTree ( commit . getTree ( ) ) ;
walk . addTree ( submoduleCommit . getTree ( ) ) ;
walk . setFilter ( TreeFilter . ANY_DIFF ) ;
List < DiffEntry > diffs = DiffEntry . scan ( walk ) ;
assertEquals ( 1 , diffs . size ( ) ) ;
DiffEntry subDiff = diffs . get ( 0 ) ;
assertEquals ( FileMode . MISSING , subDiff . getOldMode ( ) ) ;
assertEquals ( FileMode . GITLINK , subDiff . getNewMode ( ) ) ;
assertEquals ( ObjectId . zeroId ( ) , subDiff . getOldId ( ) . toObjectId ( ) ) ;
assertEquals ( commit , subDiff . getNewId ( ) . toObjectId ( ) ) ;
assertEquals ( path , subDiff . getNewPath ( ) ) ;
}
}
}
@Test
public void commitSubmoduleUpdate ( ) throws Exception {
Git git = new Git ( db ) ;
writeTrashFile ( "file.txt" , "content" ) ;
git . add ( ) . addFilepattern ( "file.txt" ) . call ( ) ;
RevCommit commit = git . commit ( ) . setMessage ( "create file" ) . call ( ) ;
writeTrashFile ( "file.txt" , "content2" ) ;
git . add ( ) . addFilepattern ( "file.txt" ) . call ( ) ;
RevCommit commit2 = git . commit ( ) . setMessage ( "edit file" ) . call ( ) ;
SubmoduleAddCommand command = new SubmoduleAddCommand ( db ) ;
String path = "sub" ;
command . setPath ( path ) ;
String uri = db . getDirectory ( ) . toURI ( ) . toString ( ) ;
command . setURI ( uri ) ;
Repository repo = command . call ( ) ;
assertNotNull ( repo ) ;
addRepoToClose ( repo ) ;
SubmoduleWalk generator = SubmoduleWalk . forIndex ( db ) ;
assertTrue ( generator . next ( ) ) ;
assertEquals ( path , generator . getPath ( ) ) ;
assertEquals ( commit2 , generator . getObjectId ( ) ) ;
assertEquals ( uri , generator . getModulesUrl ( ) ) ;
assertEquals ( path , generator . getModulesPath ( ) ) ;
assertEquals ( uri , generator . getConfigUrl ( ) ) ;
Repository subModRepo = generator . getRepository ( ) ;
assertNotNull ( subModRepo ) ;
subModRepo . close ( ) ;
assertEquals ( commit2 , repo . resolve ( Constants . HEAD ) ) ;
RevCommit submoduleAddCommit = git . commit ( ) . setMessage ( "submodule add" )
. setOnly ( path ) . call ( ) ;
assertNotNull ( submoduleAddCommit ) ;
RefUpdate update = repo . updateRef ( Constants . HEAD ) ;
update . setNewObjectId ( commit ) ;
assertEquals ( Result . FORCED , update . forceUpdate ( ) ) ;
RevCommit submoduleEditCommit = git . commit ( )
. setMessage ( "submodule add" ) . setOnly ( path ) . call ( ) ;
assertNotNull ( submoduleEditCommit ) ;
TreeWalk walk = new TreeWalk ( db ) ;
walk . addTree ( submoduleAddCommit . getTree ( ) ) ;
walk . addTree ( submoduleEditCommit . getTree ( ) ) ;
walk . setFilter ( TreeFilter . ANY_DIFF ) ;
List < DiffEntry > diffs = DiffEntry . scan ( walk ) ;
assertEquals ( 1 , diffs . size ( ) ) ;
DiffEntry subDiff = diffs . get ( 0 ) ;
assertEquals ( FileMode . GITLINK , subDiff . getOldMode ( ) ) ;
assertEquals ( FileMode . GITLINK , subDiff . getNewMode ( ) ) ;
assertEquals ( commit2 , subDiff . getOldId ( ) . toObjectId ( ) ) ;
assertEquals ( commit , subDiff . getNewId ( ) . toObjectId ( ) ) ;
assertEquals ( path , subDiff . getNewPath ( ) ) ;
assertEquals ( path , subDiff . getOldPath ( ) ) ;
try ( Git git = new Git ( db ) ) {
writeTrashFile ( "file.txt" , "content" ) ;
git . add ( ) . addFilepattern ( "file.txt" ) . call ( ) ;
RevCommit commit = git . commit ( ) . setMessage ( "create file" ) . call ( ) ;
writeTrashFile ( "file.txt" , "content2" ) ;
git . add ( ) . addFilepattern ( "file.txt" ) . call ( ) ;
RevCommit commit2 = git . commit ( ) . setMessage ( "edit file" ) . call ( ) ;
SubmoduleAddCommand command = new SubmoduleAddCommand ( db ) ;
String path = "sub" ;
command . setPath ( path ) ;
String uri = db . getDirectory ( ) . toURI ( ) . toString ( ) ;
command . setURI ( uri ) ;
Repository repo = command . call ( ) ;
assertNotNull ( repo ) ;
addRepoToClose ( repo ) ;
SubmoduleWalk generator = SubmoduleWalk . forIndex ( db ) ;
assertTrue ( generator . next ( ) ) ;
assertEquals ( path , generator . getPath ( ) ) ;
assertEquals ( commit2 , generator . getObjectId ( ) ) ;
assertEquals ( uri , generator . getModulesUrl ( ) ) ;
assertEquals ( path , generator . getModulesPath ( ) ) ;
assertEquals ( uri , generator . getConfigUrl ( ) ) ;
Repository subModRepo = generator . getRepository ( ) ;
assertNotNull ( subModRepo ) ;
subModRepo . close ( ) ;
assertEquals ( commit2 , repo . resolve ( Constants . HEAD ) ) ;
RevCommit submoduleAddCommit = git . commit ( ) . setMessage ( "submodule add" )
. setOnly ( path ) . call ( ) ;
assertNotNull ( submoduleAddCommit ) ;
RefUpdate update = repo . updateRef ( Constants . HEAD ) ;
update . setNewObjectId ( commit ) ;
assertEquals ( Result . FORCED , update . forceUpdate ( ) ) ;
RevCommit submoduleEditCommit = git . commit ( )
. setMessage ( "submodule add" ) . setOnly ( path ) . call ( ) ;
assertNotNull ( submoduleEditCommit ) ;
try ( TreeWalk walk = new TreeWalk ( db ) ) {
walk . addTree ( submoduleAddCommit . getTree ( ) ) ;
walk . addTree ( submoduleEditCommit . getTree ( ) ) ;
walk . setFilter ( TreeFilter . ANY_DIFF ) ;
List < DiffEntry > diffs = DiffEntry . scan ( walk ) ;
assertEquals ( 1 , diffs . size ( ) ) ;
DiffEntry subDiff = diffs . get ( 0 ) ;
assertEquals ( FileMode . GITLINK , subDiff . getOldMode ( ) ) ;
assertEquals ( FileMode . GITLINK , subDiff . getNewMode ( ) ) ;
assertEquals ( commit2 , subDiff . getOldId ( ) . toObjectId ( ) ) ;
assertEquals ( commit , subDiff . getNewId ( ) . toObjectId ( ) ) ;
assertEquals ( path , subDiff . getNewPath ( ) ) ;
assertEquals ( path , subDiff . getOldPath ( ) ) ;
}
}
}
@Test
public void commitUpdatesSmudgedEntries ( ) throws Exception {
Git git = new Git ( db ) ;
File file1 = writeTrashFile ( "file1.txt" , "content1" ) ;
assertTrue ( file1 . setLastModified ( file1 . lastModified ( ) - 5000 ) ) ;
File file2 = writeTrashFile ( "file2.txt" , "content2" ) ;
assertTrue ( file2 . setLastModified ( file2 . lastModified ( ) - 5000 ) ) ;
File file3 = writeTrashFile ( "file3.txt" , "content3" ) ;
assertTrue ( file3 . setLastModified ( file3 . lastModified ( ) - 5000 ) ) ;
assertNotNull ( git . add ( ) . addFilepattern ( "file1.txt" )
. addFilepattern ( "file2.txt" ) . addFilepattern ( "file3.txt " ) . call ( ) ) ;
RevCommit commit = git . commit ( ) . setMessage ( "add files" ) . call ( ) ;
assertNotNull ( commit ) ;
DirCache cache = DirCache . read ( db . getIndexFile ( ) , db . getFS ( ) ) ;
int file1 Size = cache . getEntry ( "file1 .txt" ) . getLength ( ) ;
int file2 Size = cache . getEntry ( "file2 .txt" ) . getLength ( ) ;
int file3Size = cache . getEntry ( "file3.txt" ) . getLength ( ) ;
ObjectId file2 Id = cache . getEntry ( "file2 .txt" ) . getObjectId ( ) ;
ObjectId file3Id = cache . getEntry ( "file3.txt" ) . getObjectId ( ) ;
assertTrue ( file1 Size > 0 ) ;
assertTrue ( file2 Size > 0 ) ;
assertTrue ( file3Size > 0 ) ;
// Smudge entries
cache = DirCache . lock ( db . getIndexFile ( ) , db . getFS ( ) ) ;
cache . getEntry ( "file1 .txt" ) . setLength ( 0 ) ;
cache . getEntry ( "file2 .txt" ) . setLength ( 0 ) ;
cache . getEntry ( "file3.txt" ) . setLength ( 0 ) ;
cache . write ( ) ;
assertTrue ( cache . commit ( ) ) ;
// Verify entries smudged
cache = DirCache . read ( db . getIndexFile ( ) , db . getFS ( ) ) ;
assertEquals ( 0 , cache . getEntry ( "file1 .txt" ) . getLength ( ) ) ;
assertEquals ( 0 , cache . getEntry ( "file2 .txt" ) . getLength ( ) ) ;
assertEquals ( 0 , cache . getEntry ( "file3.txt" ) . getLength ( ) ) ;
long indexTime = db . getIndexFile ( ) . lastModified ( ) ;
db . getIndexFile ( ) . setLastModified ( indexTime - 5000 ) ;
write ( file1 , "content4" ) ;
assertTrue ( file1 . setLastModified ( file1 . lastModified ( ) + 2500 ) ) ;
assertNotNull ( git . commit ( ) . setMessage ( "edit file" ) . setOnly ( "file1.txt" )
. call ( ) ) ;
cache = db . readDirCache ( ) ;
assertEquals ( file1 Size , cache . getEntry ( "file1 .txt" ) . getLength ( ) ) ;
assertEquals ( file2 Size , cache . getEntry ( "file2 .txt" ) . getLength ( ) ) ;
assertEquals ( file3Size , cache . getEntry ( "file3.txt" ) . getLength ( ) ) ;
assertEquals ( file2 Id , cache . getEntry ( "file2 .txt" ) . getObjectId ( ) ) ;
assertEquals ( file3Id , cache . getEntry ( "file3.txt" ) . getObjectId ( ) ) ;
try ( Git git = new Git ( db ) ) {
File file1 = writeTrashFile ( "file1.txt" , "content1" ) ;
assertTrue ( file1 . setLastModified ( file1 . lastModified ( ) - 5000 ) ) ;
File file2 = writeTrashFile ( "file2.txt" , "content2" ) ;
assertTrue ( file2 . setLastModified ( file2 . lastModified ( ) - 5000 ) ) ;
File file3 = writeTrashFile ( "file3.txt" , "content3" ) ;
assertTrue ( file3 . setLastModified ( file3 . lastModified ( ) - 5000 ) ) ;
assertNotNull ( git . add ( ) . addFilepattern ( "file1.txt" )
. addFilepattern ( "file2.txt" ) . addFilepattern ( "file3.txt" ) . call ( ) ) ;
RevCommit commit = git . commit ( ) . setMessage ( "add files ") . call ( ) ;
assertNotNull ( commit ) ;
DirCache cache = DirCache . read ( db . getIndexFile ( ) , db . getFS ( ) ) ;
int file1Size = cache . getEntry ( "file1.txt" ) . getLength ( ) ;
int file2 Size = cache . getEntry ( "file2 .txt" ) . getLength ( ) ;
int file3 Size = cache . getEntry ( "file3 .txt" ) . getLength ( ) ;
ObjectId file2Id = cache . getEntry ( "file2.txt" ) . getObjectId ( ) ;
ObjectId file3 Id = cache . getEntry ( "file3 .txt" ) . getObjectId ( ) ;
assertTrue ( file1Size > 0 ) ;
assertTrue ( file2 Size > 0 ) ;
assertTrue ( file3 Size > 0 ) ;
// Smudge entries
cache = DirCache . lock ( db . getIndexFile ( ) , db . getFS ( ) ) ;
cache . getEntry ( "file1.txt" ) . setLength ( 0 ) ;
cache . getEntry ( "file2 .txt" ) . setLength ( 0 ) ;
cache . getEntry ( "file3 .txt" ) . setLength ( 0 ) ;
cache . write ( ) ;
assertTrue ( cache . commit ( ) ) ;
// Verify entries smudged
cache = DirCache . read ( db . getIndexFile ( ) , db . getFS ( ) ) ;
assertEquals ( 0 , cache . getEntry ( "file1.txt" ) . getLength ( ) ) ;
assertEquals ( 0 , cache . getEntry ( "file2 .txt" ) . getLength ( ) ) ;
assertEquals ( 0 , cache . getEntry ( "file3 .txt" ) . getLength ( ) ) ;
long indexTime = db . getIndexFile ( ) . lastModified ( ) ;
db . getIndexFile ( ) . setLastModified ( indexTime - 5000 ) ;
write ( file1 , "content4" ) ;
assertTrue ( file1 . setLastModified ( file1 . lastModified ( ) + 2500 ) ) ;
assertNotNull ( git . commit ( ) . setMessage ( "edit file" ) . setOnly ( "file1.txt" )
. call ( ) ) ;
cache = db . readDirCache ( ) ;
assertEquals ( file1Size , cache . getEntry ( "file1.txt" ) . getLength ( ) ) ;
assertEquals ( file2 Size , cache . getEntry ( "file2 .txt" ) . getLength ( ) ) ;
assertEquals ( file3 Size , cache . getEntry ( "file3 .txt" ) . getLength ( ) ) ;
assertEquals ( file2Id , cache . getEntry ( "file2.txt" ) . getObjectId ( ) ) ;
assertEquals ( file3 Id , cache . getEntry ( "file3 .txt" ) . getObjectId ( ) ) ;
}
}
@Test
public void commitIgnoresSmudgedEntryWithDifferentId ( ) throws Exception {
Git git = new Git ( db ) ;
File file1 = writeTrashFile ( "file1.txt" , "content1" ) ;
assertTrue ( file1 . setLastModified ( file1 . lastModified ( ) - 5000 ) ) ;
File file2 = writeTrashFile ( "file2.txt" , "content2" ) ;
assertTrue ( file2 . setLastModified ( file2 . lastModified ( ) - 5000 ) ) ;
assertNotNull ( git . add ( ) . addFilepattern ( "file1.txt" )
. addFilepattern ( "file2.txt" ) . call ( ) ) ;
RevCommit commit = git . commit ( ) . setMessage ( "add files" ) . call ( ) ;
assertNotNull ( commit ) ;
DirCache cache = DirCache . read ( db . getIndexFile ( ) , db . getFS ( ) ) ;
int file1 Size = cache . getEntry ( "file1 .txt" ) . getLength ( ) ;
int file2Size = cache . getEntry ( "file2.txt" ) . getLength ( ) ;
assertTrue ( file1 Size > 0 ) ;
assertTrue ( file2Size > 0 ) ;
writeTrashFile ( "file2.txt" , "content3" ) ;
assertNotNull ( git . add ( ) . addFilepattern ( "file2.txt" ) . call ( ) ) ;
writeTrashFile ( "file2.txt" , "content4" ) ;
// Smudge entries
cache = DirCache . lock ( db . getIndexFile ( ) , db . getFS ( ) ) ;
cache . getEntry ( "file1 .txt" ) . setLength ( 0 ) ;
cache . getEntry ( "file2.txt" ) . setLength ( 0 ) ;
cache . write ( ) ;
assertTrue ( cache . commit ( ) ) ;
// Verify entries smudged
cache = db . readDirCache ( ) ;
assertEquals ( 0 , cache . getEntry ( "file1 .txt" ) . getLength ( ) ) ;
assertEquals ( 0 , cache . getEntry ( "file2.txt" ) . getLength ( ) ) ;
long indexTime = db . getIndexFile ( ) . lastModified ( ) ;
db . getIndexFile ( ) . setLastModified ( indexTime - 5000 ) ;
write ( file1 , "content5" ) ;
assertTrue ( file1 . setLastModified ( file1 . lastModified ( ) + 1000 ) ) ;
assertNotNull ( git . commit ( ) . setMessage ( "edit file" ) . setOnly ( "file1.txt" )
. call ( ) ) ;
cache = db . readDirCache ( ) ;
assertEquals ( file1Size , cache . getEntry ( "file1 .txt" ) . getLength ( ) ) ;
assertEquals ( 0 , cache . getEntry ( "file2.txt" ) . getLength ( ) ) ;
try ( Git git = new Git ( db ) ) {
File file1 = writeTrashFile ( "file1.txt" , "content1" ) ;
assertTrue ( file1 . setLastModified ( file1 . lastModified ( ) - 5000 ) ) ;
File file2 = writeTrashFile ( "file2.txt" , "content2" ) ;
assertTrue ( file2 . setLastModified ( file2 . lastModified ( ) - 5000 ) ) ;
assertNotNull ( git . add ( ) . addFilepattern ( "file1.txt" )
. addFilepattern ( "file2.txt" ) . call ( ) ) ;
RevCommit commit = git . commit ( ) . setMessage ( "add files" ) . call ( ) ;
assertNotNull ( commit ) ;
DirCache cache = DirCache . read ( db . getIndexFile ( ) , db . getFS ( ) ) ;
int file1Size = cache . getEntry ( "file1.txt" ) . getLength ( ) ;
int file2 Size = cache . getEntry ( "file2 .txt" ) . getLength ( ) ;
assertTrue ( file1Size > 0 ) ;
assertTrue ( file2 Size > 0 ) ;
writeTrashFile ( "file2.txt" , "content3" ) ;
assertNotNull ( git . add ( ) . addFilepattern ( "file2.txt" ) . call ( ) ) ;
writeTrashFile ( "file2.txt" , "content4" ) ;
// Smudge entries
cache = DirCache . lock ( db . getIndexFile ( ) , db . getFS ( ) ) ;
cache . getEntry ( "file1.txt" ) . setLength ( 0 ) ;
cache . getEntry ( "file2 .txt" ) . setLength ( 0 ) ;
cache . write ( ) ;
assertTrue ( cache . commit ( ) ) ;
// Verify entries smudged
cache = db . readDirCache ( ) ;
assertEquals ( 0 , cache . getEntry ( "file1.txt" ) . getLength ( ) ) ;
assertEquals ( 0 , cache . getEntry ( "file2 .txt" ) . getLength ( ) ) ;
long indexTime = db . getIndexFile ( ) . lastModified ( ) ;
db . getIndexFile ( ) . setLastModified ( indexTime - 5000 ) ;
write ( file1 , "content5" ) ;
assertTrue ( file1 . setLastModified ( file1 . lastModified ( ) + 1000 ) ) ;
assertNotNull ( git . commit ( ) . setMessage ( "edit file" ) . setOnly ( "file1.txt" )
. call ( ) ) ;
cache = db . readDirCache ( ) ;
assertEquals ( file1Size , cache . getEntry ( "file1.txt" ) . getLength ( ) ) ;
assertEquals ( 0 , cache . getEntry ( "file2 .txt" ) . getLength ( ) ) ;
}
}
@Test
public void commitAfterSquashMerge ( ) throws Exception {
Git git = new Git ( db ) ;
writeTrashFile ( "file1" , "file1" ) ;
git . add ( ) . addFilepattern ( "file1" ) . call ( ) ;
RevCommit first = git . commit ( ) . setMessage ( "initial commit" ) . call ( ) ;
try ( Git git = new Git ( db ) ) {
writeTrashFile ( "file1" , "file1" ) ;
git . add ( ) . addFilepattern ( "file1" ) . call ( ) ;
RevCommit first = git . commit ( ) . setMessage ( "initial commit" ) . call ( ) ;
assertTrue ( new File ( db . getWorkTree ( ) , "file1" ) . exists ( ) ) ;
createBranch ( first , "refs/heads/branch1" ) ;
checkoutBranch ( "refs/heads/branch1" ) ;
assertTrue ( new File ( db . getWorkTree ( ) , "file1" ) . exists ( ) ) ;
createBranch ( first , "refs/heads/branch1" ) ;
checkoutBranch ( "refs/heads/branch1" ) ;
writeTrashFile ( "file2" , "file2" ) ;
git . add ( ) . addFilepattern ( "file2" ) . call ( ) ;
git . commit ( ) . setMessage ( "second commit" ) . call ( ) ;
assertTrue ( new File ( db . getWorkTree ( ) , "file2" ) . exists ( ) ) ;
writeTrashFile ( "file2" , "file2" ) ;
git . add ( ) . addFilepattern ( "file2" ) . call ( ) ;
git . commit ( ) . setMessage ( "second commit" ) . call ( ) ;
assertTrue ( new File ( db . getWorkTree ( ) , "file2" ) . exists ( ) ) ;
checkoutBranch ( "refs/heads/master" ) ;
checkoutBranch ( "refs/heads/master" ) ;
MergeResult result = git . merge ( )
. include ( db . exactRef ( "refs/heads/branch1" ) )
. setSquash ( true )
. call ( ) ;
MergeResult result = git . merge ( )
. include ( db . exactRef ( "refs/heads/branch1" ) )
. setSquash ( true )
. call ( ) ;
assertTrue ( new File ( db . getWorkTree ( ) , "file1" ) . exists ( ) ) ;
assertTrue ( new File ( db . getWorkTree ( ) , "file2" ) . exists ( ) ) ;
assertEquals ( MergeResult . MergeStatus . FAST_FORWARD_SQUASHED ,
result . getMergeStatus ( ) ) ;
assertTrue ( new File ( db . getWorkTree ( ) , "file1" ) . exists ( ) ) ;
assertTrue ( new File ( db . getWorkTree ( ) , "file2" ) . exists ( ) ) ;
assertEquals ( MergeResult . MergeStatus . FAST_FORWARD_SQUASHED ,
result . getMergeStatus ( ) ) ;
// comment not set, should be inferred from SQUASH_MSG
RevCommit squashedCommit = git . commit ( ) . call ( ) ;
// comment not set, should be inferred from SQUASH_MSG
RevCommit squashedCommit = git . commit ( ) . call ( ) ;
assertEquals ( 1 , squashedCommit . getParentCount ( ) ) ;
assertNull ( db . readSquashCommitMsg ( ) ) ;
assertEquals ( "commit: Squashed commit of the following:" , db
. getReflogReader ( Constants . HEAD ) . getLastEntry ( ) . getComment ( ) ) ;
assertEquals ( "commit: Squashed commit of the following:" , db
. getReflogReader ( db . getBranch ( ) ) . getLastEntry ( ) . getComment ( ) ) ;
assertEquals ( 1 , squashedCommit . getParentCount ( ) ) ;
assertNull ( db . readSquashCommitMsg ( ) ) ;
assertEquals ( "commit: Squashed commit of the following:" , db
. getReflogReader ( Constants . HEAD ) . getLastEntry ( ) . getComment ( ) ) ;
assertEquals ( "commit: Squashed commit of the following:" , db
. getReflogReader ( db . getBranch ( ) ) . getLastEntry ( ) . getComment ( ) ) ;
}
}
@Test ( expected = WrongRepositoryStateException . class )
public void commitAmendOnInitialShouldFail ( ) throws Exception {
Git git = new Git ( db ) ;
git . commit ( ) . setAmend ( true ) . setMessage ( "initial commit" ) . call ( ) ;
try ( Git git = new Git ( db ) ) {
git . commit ( ) . setAmend ( true ) . setMessage ( "initial commit" ) . call ( ) ;
}
}
@Test
public void commitAmendWithoutAuthorShouldSetOriginalAuthorAndAuthorTime ( )
throws Exception {
Git git = new Git ( db ) ;
writeTrashFile ( "file1" , "file1" ) ;
git . add ( ) . addFilepattern ( "file1" ) . call ( ) ;
try ( Git git = new Git ( db ) ) {
writeTrashFile ( "file1" , "file1" ) ;
git . add ( ) . addFilepattern ( "file1" ) . call ( ) ;
final String authorName = "First Author" ;
final String authorEmail = "author@example.org" ;
final Date authorDate = new Date ( 1349621117000L ) ;
PersonIdent firstAuthor = new PersonIdent ( authorName , authorEmail ,
authorDate , TimeZone . getTimeZone ( "UTC" ) ) ;
git . commit ( ) . setMessage ( "initial commit" ) . setAuthor ( firstAuthor ) . call ( ) ;
final String authorName = "First Author" ;
final String authorEmail = "author@example.org" ;
final Date authorDate = new Date ( 1349621117000L ) ;
PersonIdent firstAuthor = new PersonIdent ( authorName , authorEmail ,
authorDate , TimeZone . getTimeZone ( "UTC" ) ) ;
git . commit ( ) . setMessage ( "initial commit" ) . setAuthor ( firstAuthor ) . call ( ) ;
RevCommit amended = git . commit ( ) . setAmend ( true )
. setMessage ( "amend commit" ) . call ( ) ;
RevCommit amended = git . commit ( ) . setAmend ( true )
. setMessage ( "amend commit" ) . call ( ) ;
PersonIdent amendedAuthor = amended . getAuthorIdent ( ) ;
assertEquals ( authorName , amendedAuthor . getName ( ) ) ;
assertEquals ( authorEmail , amendedAuthor . getEmailAddress ( ) ) ;
assertEquals ( authorDate . getTime ( ) , amendedAuthor . getWhen ( ) . getTime ( ) ) ;
PersonIdent amendedAuthor = amended . getAuthorIdent ( ) ;
assertEquals ( authorName , amendedAuthor . getName ( ) ) ;
assertEquals ( authorEmail , amendedAuthor . getEmailAddress ( ) ) ;
assertEquals ( authorDate . getTime ( ) , amendedAuthor . getWhen ( ) . getTime ( ) ) ;
}
}
@Test
public void commitAmendWithAuthorShouldUseIt ( ) throws Exception {
Git git = new Git ( db ) ;
writeTrashFile ( "file1" , "file1" ) ;
git . add ( ) . addFilepattern ( "file1" ) . call ( ) ;
git . commit ( ) . setMessage ( "initial commit" ) . call ( ) ;
try ( Git git = new Git ( db ) ) {
writeTrashFile ( "file1" , "file1" ) ;
git . add ( ) . addFilepattern ( "file1" ) . call ( ) ;
git . commit ( ) . setMessage ( "initial commit" ) . call ( ) ;
RevCommit amended = git . commit ( ) . setAmend ( true )
. setAuthor ( "New Author" , "newauthor@example.org" )
. setMessage ( "amend commit" ) . call ( ) ;
RevCommit amended = git . commit ( ) . setAmend ( true )
. setAuthor ( "New Author" , "newauthor@example.org" )
. setMessage ( "amend commit" ) . call ( ) ;
PersonIdent amendedAuthor = amended . getAuthorIdent ( ) ;
assertEquals ( "New Author" , amendedAuthor . getName ( ) ) ;
assertEquals ( "newauthor@example.org" , amendedAuthor . getEmailAddress ( ) ) ;
PersonIdent amendedAuthor = amended . getAuthorIdent ( ) ;
assertEquals ( "New Author" , amendedAuthor . getName ( ) ) ;
assertEquals ( "newauthor@example.org" , amendedAuthor . getEmailAddress ( ) ) ;
}
}
@Test
@ -532,18 +537,19 @@ public class CommitCommandTest extends RepositoryTestCase {
+ "[unmerged2, mode:100644, stage:3]" ,
indexState ( 0 ) ) ;
Git git = new Git ( db ) ;
RevCommit commit = git . commit ( ) . setOnly ( "unmerged1" )
. setMessage ( "Only one file" ) . call ( ) ;
try ( Git git = new Git ( db ) ) {
RevCommit commit = git . commit ( ) . setOnly ( "unmerged1" )
. setMessage ( "Only one file" ) . call ( ) ;
assertEquals ( "[other, mode:100644]" + "[unmerged1, mode:100644]"
+ "[unmerged2, mode:100644, stage:1]"
+ "[unmerged2, mode:100644, stage:2]"
+ "[unmerged2, mode:100644, stage:3]" ,
indexState ( 0 ) ) ;
assertEquals ( "[other, mode:100644]" + "[unmerged1, mode:100644]"
+ "[unmerged2, mode:100644, stage:1]"
+ "[unmerged2, mode:100644, stage:2]"
+ "[unmerged2, mode:100644, stage:3]" ,
indexState ( 0 ) ) ;
try ( TreeWalk walk = TreeWalk . forPath ( db , "unmerged1" , commit . getTree ( ) ) ) {
assertEquals ( FileMode . REGULAR_FILE , walk . getFileMode ( 0 ) ) ;
try ( TreeWalk walk = TreeWalk . forPath ( db , "unmerged1" , commit . getTree ( ) ) ) {
assertEquals ( FileMode . REGULAR_FILE , walk . getFileMode ( 0 ) ) ;
}
}
}