@ -43,7 +43,10 @@
package org.eclipse.jgit.notes ;
package org.eclipse.jgit.notes ;
import java.io.IOException ;
import org.eclipse.jgit.junit.TestRepository ;
import org.eclipse.jgit.junit.TestRepository ;
import org.eclipse.jgit.lib.CommitBuilder ;
import org.eclipse.jgit.lib.MutableObjectId ;
import org.eclipse.jgit.lib.MutableObjectId ;
import org.eclipse.jgit.lib.ObjectInserter ;
import org.eclipse.jgit.lib.ObjectInserter ;
import org.eclipse.jgit.lib.ObjectReader ;
import org.eclipse.jgit.lib.ObjectReader ;
@ -51,6 +54,8 @@ import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryTestCase ;
import org.eclipse.jgit.lib.RepositoryTestCase ;
import org.eclipse.jgit.revwalk.RevBlob ;
import org.eclipse.jgit.revwalk.RevBlob ;
import org.eclipse.jgit.revwalk.RevCommit ;
import org.eclipse.jgit.revwalk.RevCommit ;
import org.eclipse.jgit.revwalk.RevTree ;
import org.eclipse.jgit.treewalk.TreeWalk ;
import org.eclipse.jgit.util.RawParseUtils ;
import org.eclipse.jgit.util.RawParseUtils ;
public class NoteMapTest extends RepositoryTestCase {
public class NoteMapTest extends RepositoryTestCase {
@ -188,6 +193,59 @@ public class NoteMapTest extends RepositoryTestCase {
assertEquals ( exp , RawParseUtils . decode ( act ) ) ;
assertEquals ( exp , RawParseUtils . decode ( act ) ) ;
}
}
public void testWriteUnchangedFlat ( ) throws Exception {
RevBlob a = tr . blob ( "a" ) ;
RevBlob b = tr . blob ( "b" ) ;
RevBlob data1 = tr . blob ( "data1" ) ;
RevBlob data2 = tr . blob ( "data2" ) ;
RevCommit r = tr . commit ( ) //
. add ( a . name ( ) , data1 ) //
. add ( b . name ( ) , data2 ) //
. add ( ".gitignore" , "" ) //
. add ( "zoo-animals.txt" , "" ) //
. create ( ) ;
tr . parseBody ( r ) ;
NoteMap map = NoteMap . read ( reader , r ) ;
assertTrue ( "has note for a" , map . contains ( a ) ) ;
assertTrue ( "has note for b" , map . contains ( b ) ) ;
RevCommit n = commitNoteMap ( map ) ;
assertNotSame ( "is new commit" , r , n ) ;
assertSame ( "same tree" , r . getTree ( ) , n . getTree ( ) ) ;
}
public void testWriteUnchangedFanout2_38 ( ) throws Exception {
RevBlob a = tr . blob ( "a" ) ;
RevBlob b = tr . blob ( "b" ) ;
RevBlob data1 = tr . blob ( "data1" ) ;
RevBlob data2 = tr . blob ( "data2" ) ;
RevCommit r = tr . commit ( ) //
. add ( fanout ( 2 , a . name ( ) ) , data1 ) //
. add ( fanout ( 2 , b . name ( ) ) , data2 ) //
. add ( ".gitignore" , "" ) //
. add ( "zoo-animals.txt" , "" ) //
. create ( ) ;
tr . parseBody ( r ) ;
NoteMap map = NoteMap . read ( reader , r ) ;
assertTrue ( "has note for a" , map . contains ( a ) ) ;
assertTrue ( "has note for b" , map . contains ( b ) ) ;
// This is a non-lazy map, so we'll be looking at the leaf buckets.
RevCommit n = commitNoteMap ( map ) ;
assertNotSame ( "is new commit" , r , n ) ;
assertSame ( "same tree" , r . getTree ( ) , n . getTree ( ) ) ;
// Use a lazy-map for the next round of the same test.
map = NoteMap . read ( reader , r ) ;
n = commitNoteMap ( map ) ;
assertNotSame ( "is new commit" , r , n ) ;
assertSame ( "same tree" , r . getTree ( ) , n . getTree ( ) ) ;
}
public void testCreateFromEmpty ( ) throws Exception {
public void testCreateFromEmpty ( ) throws Exception {
RevBlob a = tr . blob ( "a" ) ;
RevBlob a = tr . blob ( "a" ) ;
RevBlob b = tr . blob ( "b" ) ;
RevBlob b = tr . blob ( "b" ) ;
@ -226,6 +284,8 @@ public class NoteMapTest extends RepositoryTestCase {
RevCommit r = tr . commit ( ) //
RevCommit r = tr . commit ( ) //
. add ( a . name ( ) , data1 ) //
. add ( a . name ( ) , data1 ) //
. add ( b . name ( ) , data2 ) //
. add ( b . name ( ) , data2 ) //
. add ( ".gitignore" , "" ) //
. add ( "zoo-animals.txt" , b ) //
. create ( ) ;
. create ( ) ;
tr . parseBody ( r ) ;
tr . parseBody ( r ) ;
@ -250,6 +310,15 @@ public class NoteMapTest extends RepositoryTestCase {
id . setByte ( 1 , p ) ;
id . setByte ( 1 , p ) ;
assertTrue ( "contains " + id , map . contains ( id ) ) ;
assertTrue ( "contains " + id , map . contains ( id ) ) ;
}
}
RevCommit n = commitNoteMap ( map ) ;
map = NoteMap . read ( reader , n ) ;
assertEquals ( data2 , map . get ( a ) ) ;
assertEquals ( b , map . get ( data1 ) ) ;
assertFalse ( "no b" , map . contains ( b ) ) ;
assertFalse ( "no data2" , map . contains ( data2 ) ) ;
assertEquals ( b , TreeWalk
. forPath ( reader , "zoo-animals.txt" , n . getTree ( ) ) . getObjectId ( 0 ) ) ;
}
}
public void testEditFanout2_38 ( ) throws Exception {
public void testEditFanout2_38 ( ) throws Exception {
@ -261,6 +330,8 @@ public class NoteMapTest extends RepositoryTestCase {
RevCommit r = tr . commit ( ) //
RevCommit r = tr . commit ( ) //
. add ( fanout ( 2 , a . name ( ) ) , data1 ) //
. add ( fanout ( 2 , a . name ( ) ) , data1 ) //
. add ( fanout ( 2 , b . name ( ) ) , data2 ) //
. add ( fanout ( 2 , b . name ( ) ) , data2 ) //
. add ( ".gitignore" , "" ) //
. add ( "zoo-animals.txt" , b ) //
. create ( ) ;
. create ( ) ;
tr . parseBody ( r ) ;
tr . parseBody ( r ) ;
@ -274,11 +345,46 @@ public class NoteMapTest extends RepositoryTestCase {
assertEquals ( b , map . get ( data1 ) ) ;
assertEquals ( b , map . get ( data1 ) ) ;
assertFalse ( "no b" , map . contains ( b ) ) ;
assertFalse ( "no b" , map . contains ( b ) ) ;
assertFalse ( "no data2" , map . contains ( data2 ) ) ;
assertFalse ( "no data2" , map . contains ( data2 ) ) ;
RevCommit n = commitNoteMap ( map ) ;
map . set ( a , null ) ;
map . set ( a , null ) ;
map . set ( data1 , null ) ;
map . set ( data1 , null ) ;
assertFalse ( "no a" , map . contains ( a ) ) ;
assertFalse ( "no a" , map . contains ( a ) ) ;
assertFalse ( "no data1" , map . contains ( data1 ) ) ;
assertFalse ( "no data1" , map . contains ( data1 ) ) ;
map = NoteMap . read ( reader , n ) ;
assertEquals ( data2 , map . get ( a ) ) ;
assertEquals ( b , map . get ( data1 ) ) ;
assertFalse ( "no b" , map . contains ( b ) ) ;
assertFalse ( "no data2" , map . contains ( data2 ) ) ;
assertEquals ( b , TreeWalk
. forPath ( reader , "zoo-animals.txt" , n . getTree ( ) ) . getObjectId ( 0 ) ) ;
}
public void testRemoveDeletesTreeFanout2_38 ( ) throws Exception {
RevBlob a = tr . blob ( "a" ) ;
RevBlob data1 = tr . blob ( "data1" ) ;
RevTree empty = tr . tree ( ) ;
RevCommit r = tr . commit ( ) //
. add ( fanout ( 2 , a . name ( ) ) , data1 ) //
. create ( ) ;
tr . parseBody ( r ) ;
NoteMap map = NoteMap . read ( reader , r ) ;
map . set ( a , null ) ;
RevCommit n = commitNoteMap ( map ) ;
assertEquals ( "empty tree" , empty , n . getTree ( ) ) ;
}
private RevCommit commitNoteMap ( NoteMap map ) throws IOException {
tr . tick ( 600 ) ;
CommitBuilder builder = new CommitBuilder ( ) ;
builder . setTreeId ( map . writeTree ( inserter ) ) ;
tr . setAuthorAndCommitter ( builder ) ;
return tr . getRevWalk ( ) . parseCommit ( inserter . insert ( builder ) ) ;
}
}
private static String fanout ( int prefix , String name ) {
private static String fanout ( int prefix , String name ) {