@ -90,26 +90,27 @@ public class PushCommandTest extends RepositoryTestCase {
remoteConfig . update ( config ) ;
remoteConfig . update ( config ) ;
config . save ( ) ;
config . save ( ) ;
Git git1 = new Git ( db ) ;
try ( Git git1 = new Git ( db ) ) {
// create some refs via commits and tag
// create some refs via commits and tag
RevCommit commit = git1 . commit ( ) . setMessage ( "initial commit" ) . call ( ) ;
RevCommit commit = git1 . commit ( ) . setMessage ( "initial commit" ) . call ( ) ;
Ref tagRef = git1 . tag ( ) . setName ( "tag" ) . call ( ) ;
Ref tagRef = git1 . tag ( ) . setName ( "tag" ) . call ( ) ;
try {
try {
db2 . resolve ( commit . getId ( ) . getName ( ) + "^{commit}" ) ;
db2 . resolve ( commit . getId ( ) . getName ( ) + "^{commit}" ) ;
fail ( "id shouldn't exist yet" ) ;
fail ( "id shouldn't exist yet" ) ;
} catch ( MissingObjectException e ) {
} catch ( MissingObjectException e ) {
// we should get here
// we should get here
}
RefSpec spec = new RefSpec ( "refs/heads/master:refs/heads/x" ) ;
git1 . push ( ) . setRemote ( "test" ) . setRefSpecs ( spec )
. call ( ) ;
assertEquals ( commit . getId ( ) ,
db2 . resolve ( commit . getId ( ) . getName ( ) + "^{commit}" ) ) ;
assertEquals ( tagRef . getObjectId ( ) ,
db2 . resolve ( tagRef . getObjectId ( ) . getName ( ) ) ) ;
}
}
RefSpec spec = new RefSpec ( "refs/heads/master:refs/heads/x" ) ;
git1 . push ( ) . setRemote ( "test" ) . setRefSpecs ( spec )
. call ( ) ;
assertEquals ( commit . getId ( ) ,
db2 . resolve ( commit . getId ( ) . getName ( ) + "^{commit}" ) ) ;
assertEquals ( tagRef . getObjectId ( ) ,
db2 . resolve ( tagRef . getObjectId ( ) . getName ( ) ) ) ;
}
}
@Test
@Test
@ -132,15 +133,16 @@ public class PushCommandTest extends RepositoryTestCase {
+ hookOutput . toPath ( ) + "\"\ncat - >>\"" + hookOutput . toPath ( )
+ hookOutput . toPath ( ) + "\"\ncat - >>\"" + hookOutput . toPath ( )
+ "\"\nexit 0" ) ;
+ "\"\nexit 0" ) ;
Git git1 = new Git ( db ) ;
try ( Git git1 = new Git ( db ) ) {
// create some refs via commits and tag
// create some refs via commits and tag
RevCommit commit = git1 . commit ( ) . setMessage ( "initial commit" ) . call ( ) ;
RevCommit commit = git1 . commit ( ) . setMessage ( "initial commit" ) . call ( ) ;
RefSpec spec = new RefSpec ( "refs/heads/master:refs/heads/x" ) ;
RefSpec spec = new RefSpec ( "refs/heads/master:refs/heads/x" ) ;
git1 . push ( ) . setRemote ( "test" ) . setRefSpecs ( spec ) . call ( ) ;
git1 . push ( ) . setRemote ( "test" ) . setRefSpecs ( spec ) . call ( ) ;
assertEquals ( "1:test, 2:" + uri + ", 3:\n" + "refs/heads/master "
assertEquals ( "1:test, 2:" + uri + ", 3:\n" + "refs/heads/master "
+ commit . getName ( ) + " refs/heads/x "
+ commit . getName ( ) + " refs/heads/x "
+ ObjectId . zeroId ( ) . name ( ) , read ( hookOutput ) ) ;
+ ObjectId . zeroId ( ) . name ( ) , read ( hookOutput ) ) ;
}
}
}
private File writeHookFile ( final String name , final String data )
private File writeHookFile ( final String name , final String data )
@ -160,45 +162,45 @@ public class PushCommandTest extends RepositoryTestCase {
String branch = "refs/heads/master" ;
String branch = "refs/heads/master" ;
String trackingBranch = "refs/remotes/" + remote + "/master" ;
String trackingBranch = "refs/remotes/" + remote + "/master" ;
Git git = new Git ( db ) ;
try ( Git git = new Git ( db ) ) {
RevCommit commit1 = git . commit ( ) . setMessage ( "Initial commit" )
. call ( ) ;
RevCommit commit1 = git . commit ( ) . setMessage ( "Initial commit" )
RefUpdate branchRefUpdate = db . updateRef ( branch ) ;
. call ( ) ;
branchRefUpdate . setNewObjectId ( commit1 . getId ( ) ) ;
branchRefUpdate . update ( ) ;
RefUpdate b ranchRefUpdate = db . updateRef ( b ranch) ;
RefUpdate trackingB ranchRefUpdate = db . updateRef ( trackingB ranch) ;
b ranchRefUpdate. setNewObjectId ( commit1 . getId ( ) ) ;
trackingB ranchRefUpdate . setNewObjectId ( commit1 . getId ( ) ) ;
b ranchRefUpdate. update ( ) ;
trackingB ranchRefUpdate . update ( ) ;
RefUpdate trackingBranchRefUpdate = db . updateRef ( trackingBranch ) ;
final StoredConfig config = db . getConfig ( ) ;
trackingBranchRefUpdate . setNewObjectId ( commit1 . getId ( ) ) ;
RemoteConfig remoteConfig = new RemoteConfig ( config , remote ) ;
trackingBranchRefUpdate . update ( ) ;
URIish uri = new URIish ( db2 . getDirectory ( ) . toURI ( ) . toURL ( ) ) ;
remoteConfig . addURI ( uri ) ;
final StoredConfig config = db . getConfig ( ) ;
remoteConfig . addFetchRefSpec ( new RefSpec ( "+refs/heads/*:refs/remotes/"
RemoteConfig remoteConfig = new RemoteConfig ( config , remote ) ;
+ remote + "/*" ) ) ;
URIish uri = new URIish ( db2 . getDirectory ( ) . toURI ( ) . toURL ( ) ) ;
remoteConfig . update ( config ) ;
remoteConfig . addURI ( uri ) ;
config . save ( ) ;
remoteConfig . addFetchRefSpec ( new RefSpec ( "+refs/heads/*:refs/remotes/"
+ remote + "/*" ) ) ;
remoteConfig . update ( config ) ;
config . save ( ) ;
RevCommit commit2 = git . commit ( ) . setMessage ( "Commit to push" ) . call ( ) ;
RevCommit commit2 = git . commit ( ) . setMessage ( "Commit to push" ) . call ( ) ;
RefSpec spec = new RefSpec ( branch + ":" + branch ) ;
RefSpec spec = new RefSpec ( branch + ":" + branch ) ;
Iterable < PushResult > resultIterable = git . push ( ) . setRemote ( remote )
Iterable < PushResult > resultIterable = git . push ( ) . setRemote ( remote )
. setRefSpecs ( spec ) . call ( ) ;
. setRefSpecs ( spec ) . call ( ) ;
PushResult result = resultIterable . iterator ( ) . next ( ) ;
PushResult result = resultIterable . iterator ( ) . next ( ) ;
TrackingRefUpdate trackingRefUpdate = result
TrackingRefUpdate trackingRefUpdate = result
. getTrackingRefUpdate ( trackingBranch ) ;
. getTrackingRefUpdate ( trackingBranch ) ;
assertNotNull ( trackingRefUpdate ) ;
assertNotNull ( trackingRefUpdate ) ;
assertEquals ( trackingBranch , trackingRefUpdate . getLocalName ( ) ) ;
assertEquals ( trackingBranch , trackingRefUpdate . getLocalName ( ) ) ;
assertEquals ( branch , trackingRefUpdate . getRemoteName ( ) ) ;
assertEquals ( branch , trackingRefUpdate . getRemoteName ( ) ) ;
assertEquals ( commit2 . getId ( ) , trackingRefUpdate . getNewObjectId ( ) ) ;
assertEquals ( commit2 . getId ( ) , trackingRefUpdate . getNewObjectId ( ) ) ;
assertEquals ( commit2 . getId ( ) , db . resolve ( trackingBranch ) ) ;
assertEquals ( commit2 . getId ( ) , db . resolve ( trackingBranch ) ) ;
assertEquals ( commit2 . getId ( ) , db2 . resolve ( branch ) ) ;
assertEquals ( commit2 . getId ( ) , db2 . resolve ( branch ) ) ;
}
}
}
/ * *
/ * *
@ -208,40 +210,38 @@ public class PushCommandTest extends RepositoryTestCase {
* /
* /
@Test
@Test
public void testPushRefUpdate ( ) throws Exception {
public void testPushRefUpdate ( ) throws Exception {
Git git = new Git ( db ) ;
try ( Git git = new Git ( db ) ;
Git git2 = new Git ( createBareRepository ( ) ) ;
Git git2 = new Git ( createBareRepository ( ) ) ) {
final StoredConfig config = git . getRepository ( ) . getConfig ( ) ;
final StoredConfig config = git . getRepository ( ) . getConfig ( ) ;
RemoteConfig remoteConfig = new RemoteConfig ( config , "test" ) ;
RemoteConfig remoteConfig = new RemoteConfig ( config , "test" ) ;
URIish uri = new URIish ( git2 . getRepository ( ) . getDirectory ( ) . toURI ( )
URIish uri = new URIish ( git2 . getRepository ( ) . getDirectory ( ) . toURI ( )
. toURL ( ) ) ;
. toURL ( ) ) ;
remoteConfig . addURI ( uri ) ;
remoteConfig . addURI ( uri ) ;
remoteConfig . addPushRefSpec ( new RefSpec ( "+refs/heads/*:refs/heads/*" ) ) ;
remoteConfig . addPushRefSpec ( new RefSpec ( "+refs/heads/*:refs/heads/*" ) ) ;
remoteConfig . update ( config ) ;
remoteConfig . update ( config ) ;
config . save ( ) ;
config . save ( ) ;
writeTrashFile ( "f" , "content of f" ) ;
writeTrashFile ( "f" , "content of f" ) ;
git . add ( ) . addFilepattern ( "f" ) . call ( ) ;
git . add ( ) . addFilepattern ( "f" ) . call ( ) ;
RevCommit commit = git . commit ( ) . setMessage ( "adding f" ) . call ( ) ;
RevCommit commit = git . commit ( ) . setMessage ( "adding f" ) . call ( ) ;
assertEquals ( null , git2 . getRepository ( ) . resolve ( "refs/heads/master" ) ) ;
assertEquals ( null , git2 . getRepository ( ) . resolve ( "refs/heads/master" ) ) ;
git . push ( ) . setRemote ( "test" ) . call ( ) ;
assertEquals ( commit . getId ( ) ,
git2 . getRepository ( ) . resolve ( "refs/heads/master" ) ) ;
git . branchCreate ( ) . setName ( "refs/heads/test" ) . call ( ) ;
git . checkout ( ) . setName ( "refs/heads/test" ) . call ( ) ;
for ( int i = 0 ; i < 6 ; i + + ) {
writeTrashFile ( "f" + i , "content of f" + i ) ;
git . add ( ) . addFilepattern ( "f" + i ) . call ( ) ;
commit = git . commit ( ) . setMessage ( "adding f" + i ) . call ( ) ;
git . push ( ) . setRemote ( "test" ) . call ( ) ;
git . push ( ) . setRemote ( "test" ) . call ( ) ;
git2 . getRepository ( ) . getAllRefs ( ) ;
assertEquals ( commit . getId ( ) ,
assertEquals ( "failed to update on attempt " + i , commit . getId ( ) ,
git2 . getRepository ( ) . resolve ( "refs/heads/master" ) ) ;
git2 . getRepository ( ) . resolve ( "refs/heads/test" ) ) ;
git . branchCreate ( ) . setName ( "refs/heads/test" ) . call ( ) ;
git . checkout ( ) . setName ( "refs/heads/test" ) . call ( ) ;
for ( int i = 0 ; i < 6 ; i + + ) {
writeTrashFile ( "f" + i , "content of f" + i ) ;
git . add ( ) . addFilepattern ( "f" + i ) . call ( ) ;
commit = git . commit ( ) . setMessage ( "adding f" + i ) . call ( ) ;
git . push ( ) . setRemote ( "test" ) . call ( ) ;
git2 . getRepository ( ) . getAllRefs ( ) ;
assertEquals ( "failed to update on attempt " + i , commit . getId ( ) ,
git2 . getRepository ( ) . resolve ( "refs/heads/test" ) ) ;
}
}
}
}
}
@ -252,28 +252,26 @@ public class PushCommandTest extends RepositoryTestCase {
* /
* /
@Test
@Test
public void testPushWithRefSpecFromConfig ( ) throws Exception {
public void testPushWithRefSpecFromConfig ( ) throws Exception {
Git git = new Git ( db ) ;
try ( Git git = new Git ( db ) ;
Git git2 = new Git ( createBareRepository ( ) ) ;
Git git2 = new Git ( createBareRepository ( ) ) ) {
final StoredConfig config = git . getRepository ( ) . getConfig ( ) ;
final StoredConfig config = git . getRepository ( ) . getConfig ( ) ;
RemoteConfig remoteConfig = new RemoteConfig ( config , "test" ) ;
RemoteConfig remoteConfig = new RemoteConfig ( config , "test" ) ;
URIish uri = new URIish ( git2 . getRepository ( ) . getDirectory ( ) . toURI ( )
URIish uri = new URIish ( git2 . getRepository ( ) . getDirectory ( ) . toURI ( )
. toURL ( ) ) ;
. toURL ( ) ) ;
remoteConfig . addURI ( uri ) ;
remoteConfig . addURI ( uri ) ;
remoteConfig . addPushRefSpec ( new RefSpec ( "HEAD:refs/heads/newbranch" ) ) ;
remoteConfig . addPushRefSpec ( new RefSpec ( "HEAD:refs/heads/newbranch" ) ) ;
remoteConfig . update ( config ) ;
remoteConfig . update ( config ) ;
config . save ( ) ;
config . save ( ) ;
writeTrashFile ( "f" , "content of f" ) ;
writeTrashFile ( "f" , "content of f" ) ;
git . add ( ) . addFilepattern ( "f" ) . call ( ) ;
git . add ( ) . addFilepattern ( "f" ) . call ( ) ;
RevCommit commit = git . commit ( ) . setMessage ( "adding f" ) . call ( ) ;
RevCommit commit = git . commit ( ) . setMessage ( "adding f" ) . call ( ) ;
assertEquals ( null , git2 . getRepository ( ) . resolve ( "refs/heads/master" ) ) ;
assertEquals ( null , git2 . getRepository ( ) . resolve ( "refs/heads/master" ) ) ;
git . push ( ) . setRemote ( "test" ) . call ( ) ;
git . push ( ) . setRemote ( "test" ) . call ( ) ;
assertEquals ( commit . getId ( ) ,
assertEquals ( commit . getId ( ) ,
git2 . getRepository ( ) . resolve ( "refs/heads/newbranch" ) ) ;
git2 . getRepository ( ) . resolve ( "refs/heads/newbranch" ) ) ;
}
}
}
/ * *
/ * *
@ -283,38 +281,37 @@ public class PushCommandTest extends RepositoryTestCase {
* /
* /
@Test
@Test
public void testPushWithoutPushRefSpec ( ) throws Exception {
public void testPushWithoutPushRefSpec ( ) throws Exception {
Git git = new Git ( db ) ;
try ( Git git = new Git ( db ) ;
Git git2 = new Git ( createBareRepository ( ) ) ;
Git git2 = new Git ( createBareRepository ( ) ) ) {
final StoredConfig config = git . getRepository ( ) . getConfig ( ) ;
final StoredConfig config = git . getRepository ( ) . getConfig ( ) ;
RemoteConfig remoteConfig = new RemoteConfig ( config , "test" ) ;
RemoteConfig remoteConfig = new RemoteConfig ( config , "test" ) ;
URIish uri = new URIish ( git2 . getRepository ( ) . getDirectory ( ) . toURI ( )
URIish uri = new URIish ( git2 . getRepository ( ) . getDirectory ( ) . toURI ( )
. toURL ( ) ) ;
. toURL ( ) ) ;
remoteConfig . addURI ( uri ) ;
remoteConfig . addURI ( uri ) ;
remoteConfig . addFetchRefSpec ( new RefSpec (
remoteConfig . addFetchRefSpec ( new RefSpec (
"+refs/heads/*:refs/remotes/origin/*" ) ) ;
"+refs/heads/*:refs/remotes/origin/*" ) ) ;
remoteConfig . update ( config ) ;
remoteConfig . update ( config ) ;
config . save ( ) ;
config . save ( ) ;
writeTrashFile ( "f" , "content of f" ) ;
writeTrashFile ( "f" , "content of f" ) ;
git . add ( ) . addFilepattern ( "f" ) . call ( ) ;
git . add ( ) . addFilepattern ( "f" ) . call ( ) ;
RevCommit commit = git . commit ( ) . setMessage ( "adding f" ) . call ( ) ;
RevCommit commit = git . commit ( ) . setMessage ( "adding f" ) . call ( ) ;
git . checkout ( ) . setName ( "not-pushed" ) . setCreateBranch ( true ) . call ( ) ;
git . checkout ( ) . setName ( "not-pushed" ) . setCreateBranch ( true ) . call ( ) ;
git . checkout ( ) . setName ( "branchtopush" ) . setCreateBranch ( true ) . call ( ) ;
git . checkout ( ) . setName ( "branchtopush" ) . setCreateBranch ( true ) . call ( ) ;
assertEquals ( null ,
assertEquals ( null ,
git2 . getRepository ( ) . resolve ( "refs/heads/branchtopush" ) ) ;
git2 . getRepository ( ) . resolve ( "refs/heads/branchtopush" ) ) ;
assertEquals ( null , git2 . getRepository ( )
assertEquals ( null , git2 . getRepository ( )
. resolve ( "refs/heads/not-pushed" ) ) ;
. resolve ( "refs/heads/not-pushed" ) ) ;
assertEquals ( null , git2 . getRepository ( ) . resolve ( "refs/heads/master" ) ) ;
assertEquals ( null , git2 . getRepository ( ) . resolve ( "refs/heads/master" ) ) ;
git . push ( ) . setRemote ( "test" ) . call ( ) ;
git . push ( ) . setRemote ( "test" ) . call ( ) ;
assertEquals ( commit . getId ( ) ,
assertEquals ( commit . getId ( ) ,
git2 . getRepository ( ) . resolve ( "refs/heads/branchtopush" ) ) ;
git2 . getRepository ( ) . resolve ( "refs/heads/branchtopush" ) ) ;
assertEquals ( null , git2 . getRepository ( )
assertEquals ( null , git2 . getRepository ( )
. resolve ( "refs/heads/not-pushed" ) ) ;
. resolve ( "refs/heads/not-pushed" ) ) ;
assertEquals ( null , git2 . getRepository ( ) . resolve ( "refs/heads/master" ) ) ;
assertEquals ( null , git2 . getRepository ( ) . resolve ( "refs/heads/master" ) ) ;
}
}
}
/ * *
/ * *
@ -335,51 +332,51 @@ public class PushCommandTest extends RepositoryTestCase {
remoteConfig . update ( config ) ;
remoteConfig . update ( config ) ;
config . save ( ) ;
config . save ( ) ;
Git git1 = new Git ( db ) ;
try ( Git git1 = new Git ( db ) ;
Git git2 = new Git ( db2 ) ;
Git git2 = new Git ( db2 ) ) {
// push master (with a new commit) to the remote
// push master (with a new commit) to the remote
git1 . commit ( ) . setMessage ( "initial commit" ) . call ( ) ;
git1 . commit ( ) . setMessage ( "initial commit" ) . call ( ) ;
RefSpec spec = new RefSpec ( "refs/heads/*:refs/heads/*" ) ;
RefSpec spec = new RefSpec ( "refs/heads/*:refs/heads/*" ) ;
git1 . push ( ) . setRemote ( "test" ) . setRefSpecs ( spec ) . call ( ) ;
// create an unrelated ref and a commit on our remote
git2 . branchCreate ( ) . setName ( "refs/heads/other" ) . call ( ) ;
git2 . checkout ( ) . setName ( "refs/heads/other" ) . call ( ) ;
writeTrashFile ( "a" , "content of a" ) ;
git2 . add ( ) . addFilepattern ( "a" ) . call ( ) ;
RevCommit commit2 = git2 . commit ( ) . setMessage ( "adding a" ) . call ( ) ;
// run a gc to ensure we have a bitmap index
Properties res = git1 . gc ( ) . setExpire ( null ) . call ( ) ;
assertEquals ( 7 , res . size ( ) ) ;
// create another commit so we have something else to push
writeTrashFile ( "b" , "content of b" ) ;
git1 . add ( ) . addFilepattern ( "b" ) . call ( ) ;
RevCommit commit3 = git1 . commit ( ) . setMessage ( "adding b" ) . call ( ) ;
try {
// Re-run the push. Failure may happen here.
git1 . push ( ) . setRemote ( "test" ) . setRefSpecs ( spec ) . call ( ) ;
git1 . push ( ) . setRemote ( "test" ) . setRefSpecs ( spec ) . call ( ) ;
} catch ( TransportException e ) {
assertTrue ( "should be caused by a MissingObjectException" , e
. getCause ( ) . getCause ( ) instanceof MissingObjectException ) ;
fail ( "caught MissingObjectException for a change we don't have" ) ;
}
// Remote will have both a and b. Master will have only b
// create an unrelated ref and a commit on our remote
try {
git2 . branchCreate ( ) . setName ( "refs/heads/other" ) . call ( ) ;
db . resolve ( commit2 . getId ( ) . getName ( ) + "^{commit}" ) ;
git2 . checkout ( ) . setName ( "refs/heads/other" ) . call ( ) ;
fail ( "id shouldn't exist locally" ) ;
} catch ( MissingObjectException e ) {
writeTrashFile ( "a" , "content of a" ) ;
// we should get here
git2 . add ( ) . addFilepattern ( "a" ) . call ( ) ;
RevCommit commit2 = git2 . commit ( ) . setMessage ( "adding a" ) . call ( ) ;
// run a gc to ensure we have a bitmap index
Properties res = git1 . gc ( ) . setExpire ( null ) . call ( ) ;
assertEquals ( 7 , res . size ( ) ) ;
// create another commit so we have something else to push
writeTrashFile ( "b" , "content of b" ) ;
git1 . add ( ) . addFilepattern ( "b" ) . call ( ) ;
RevCommit commit3 = git1 . commit ( ) . setMessage ( "adding b" ) . call ( ) ;
try {
// Re-run the push. Failure may happen here.
git1 . push ( ) . setRemote ( "test" ) . setRefSpecs ( spec ) . call ( ) ;
} catch ( TransportException e ) {
assertTrue ( "should be caused by a MissingObjectException" , e
. getCause ( ) . getCause ( ) instanceof MissingObjectException ) ;
fail ( "caught MissingObjectException for a change we don't have" ) ;
}
// Remote will have both a and b. Master will have only b
try {
db . resolve ( commit2 . getId ( ) . getName ( ) + "^{commit}" ) ;
fail ( "id shouldn't exist locally" ) ;
} catch ( MissingObjectException e ) {
// we should get here
}
assertEquals ( commit2 . getId ( ) ,
db2 . resolve ( commit2 . getId ( ) . getName ( ) + "^{commit}" ) ) ;
assertEquals ( commit3 . getId ( ) ,
db2 . resolve ( commit3 . getId ( ) . getName ( ) + "^{commit}" ) ) ;
}
}
assertEquals ( commit2 . getId ( ) ,
db2 . resolve ( commit2 . getId ( ) . getName ( ) + "^{commit}" ) ) ;
assertEquals ( commit3 . getId ( ) ,
db2 . resolve ( commit3 . getId ( ) . getName ( ) + "^{commit}" ) ) ;
}
}
}
}