@@ -308,6 +308,65 @@ func (s *RemoteSuite) doTestFetchNoErrAlreadyUpToDate(c *C, url string) {
308308 c .Assert (err , Equals , NoErrAlreadyUpToDate )
309309}
310310
311+ func (s * RemoteSuite ) testFetchFastForward (c * C , sto storage.Storer ) {
312+ r := newRemote (sto , & config.RemoteConfig {
313+ URLs : []string {s .GetBasicLocalRepositoryURL ()},
314+ })
315+
316+ s .testFetch (c , r , & FetchOptions {
317+ RefSpecs : []config.RefSpec {
318+ config .RefSpec ("+refs/heads/master:refs/heads/master" ),
319+ },
320+ }, []* plumbing.Reference {
321+ plumbing .NewReferenceFromStrings ("refs/heads/master" , "6ecf0ef2c2dffb796033e5a02219af86ec6584e5" ),
322+ })
323+
324+ // First make sure that we error correctly when a force is required.
325+ err := r .Fetch (& FetchOptions {
326+ RefSpecs : []config.RefSpec {
327+ config .RefSpec ("refs/heads/branch:refs/heads/master" ),
328+ },
329+ })
330+ c .Assert (err , Equals , ErrForceNeeded )
331+
332+ // And that forcing it fixes the problem.
333+ err = r .Fetch (& FetchOptions {
334+ RefSpecs : []config.RefSpec {
335+ config .RefSpec ("+refs/heads/branch:refs/heads/master" ),
336+ },
337+ })
338+ c .Assert (err , IsNil )
339+
340+ // Now test that a fast-forward, non-force fetch works.
341+ r .s .SetReference (plumbing .NewReferenceFromStrings (
342+ "refs/heads/master" , "918c48b83bd081e863dbe1b80f8998f058cd8294" ,
343+ ))
344+ s .testFetch (c , r , & FetchOptions {
345+ RefSpecs : []config.RefSpec {
346+ config .RefSpec ("refs/heads/master:refs/heads/master" ),
347+ },
348+ }, []* plumbing.Reference {
349+ plumbing .NewReferenceFromStrings ("refs/heads/master" , "6ecf0ef2c2dffb796033e5a02219af86ec6584e5" ),
350+ })
351+ }
352+
353+ func (s * RemoteSuite ) TestFetchFastForwardMem (c * C ) {
354+ s .testFetchFastForward (c , memory .NewStorage ())
355+ }
356+
357+ func (s * RemoteSuite ) TestFetchFastForwardFS (c * C ) {
358+ dir , err := ioutil .TempDir ("" , "fetch" )
359+ c .Assert (err , IsNil )
360+
361+ defer os .RemoveAll (dir ) // clean up
362+
363+ fss , err := filesystem .NewStorage (osfs .New (dir ))
364+ c .Assert (err , IsNil )
365+
366+ // This exercises `storage.filesystem.Storage.CheckAndSetReference()`.
367+ s .testFetchFastForward (c , fss )
368+ }
369+
311370func (s * RemoteSuite ) TestString (c * C ) {
312371 r := newRemote (nil , & config.RemoteConfig {
313372 Name : "foo" ,
0 commit comments