[cache] Fetch updates to the local checkout from the cache.

We update refs in the cache, followed by updating them in the checkout,
this simply uses the cache as the remote for the local checkout ref
fetch.

Change-Id: Iafc0b1153eb4868a28b5d64df7c665d0d9f4d149
diff --git a/project/project.go b/project/project.go
index e73602d..79e837d 100644
--- a/project/project.go
+++ b/project/project.go
@@ -1505,15 +1505,33 @@
 	}
 	scm := gitutil.New(jirix, gitutil.RootDirOpt(project.Path))
 	remote := rewriteRemote(jirix, project.Remote)
-	if err := scm.SetRemoteUrl("origin", remote); err != nil {
+	r := remote
+	cachePath, err := project.CacheDirPath(jirix)
+	if err != nil {
+		return err
+	}
+	if cachePath != "" {
+		r = cachePath
+	}
+	defer func() {
+		if err := scm.SetRemoteUrl("origin", remote); err != nil {
+			jirix.Logger.Errorf("failed to set remote back to %v for project %+v", remote, project)
+		}
+	}()
+	if err := scm.SetRemoteUrl("origin", r); err != nil {
 		return err
 	}
 	if project.HistoryDepth > 0 {
-		return fetch(jirix, project.Path, "origin", gitutil.PruneOpt(true),
-			gitutil.DepthOpt(project.HistoryDepth), gitutil.UpdateShallowOpt(true))
+		if err := fetch(jirix, project.Path, "origin", gitutil.PruneOpt(true),
+			gitutil.DepthOpt(project.HistoryDepth), gitutil.UpdateShallowOpt(true)); err != nil {
+			return err
+		}
 	} else {
-		return fetch(jirix, project.Path, "origin", gitutil.PruneOpt(true))
+		if err := fetch(jirix, project.Path, "origin", gitutil.PruneOpt(true)); err != nil {
+			return err
+		}
 	}
+	return nil
 }
 
 func GetHeadRevision(jirix *jiri.X, project Project) (string, error) {
diff --git a/project/project_test.go b/project/project_test.go
index 12b1a97..6ee9d8f 100644
--- a/project/project_test.go
+++ b/project/project_test.go
@@ -466,24 +466,22 @@
 
 	// Commit to master branch of a project 1.
 	writeReadme(t, fake.X, fake.Projects[localProjects[1].Name], "master commit")
-	if err := fake.UpdateUniverse(false); err != nil {
-		t.Fatal(err)
-	}
-	checkReadme(t, fake.X, localProjects[1], "master commit")
-	checkJiriRevFiles(t, fake.X, localProjects[1])
 
-	gitLocal := gitutil.New(fake.X, gitutil.RootDirOpt(localProjects[1].Path))
-	localRev, err := gitLocal.CurrentRevision()
+	gitRemote := gitutil.New(fake.X, gitutil.RootDirOpt(localProjects[1].Remote))
+	remoteRev, err := gitRemote.CurrentRevision()
 	if err != nil {
 		t.Fatal(err)
 	}
 
 	// Update the manifest with our new HEAD position.
-	fake.AddProjectOverride(localProjects[1].Name, localProjects[1].Remote, localRev)
+	fake.AddProjectOverride(localProjects[1].Name, localProjects[1].Remote, remoteRev)
 	if err := fake.UpdateUniverse(false); err != nil {
 		t.Fatal(err)
 	}
 
+	checkReadme(t, fake.X, localProjects[1], "master commit")
+	checkJiriRevFiles(t, fake.X, localProjects[1])
+
 	// Check that cache was updated
 	cacheDirPath, err := localProjects[1].CacheDirPath(fake.X)
 	if err != nil {
@@ -494,8 +492,8 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	if cacheRev != localRev {
-		t.Fatalf("Cache revision(%v) not equal to local revision(%v)", cacheRev, localRev)
+	if cacheRev != remoteRev {
+		t.Fatalf("Cache revision(%v) not equal to local revision(%v)", cacheRev, remoteRev)
 	}
 }