Эх сурвалжийг харах

sync: Try fetching a tag as a last resort before giving up

If a tagged commit is not reachable by the fetch refspec configured
for the git (usually refs/heads/*) it will not be downloaded by
'git fetch'.  The tag can however be downloaded with 'git fetch
--tags' or 'git fetch tag <tag>'.

This patch fixes the situation when a tag is not found after a
'git fetch'. Repo will issue 'git fetch tag <tag>' before giving
up completely.

Change-Id: I87796a5e1d51fcf398f346a274b7a069df37599a
Signed-off-by: Shawn O. Pearce <sop@google.com>
Julius Gustavsson 15 жил өмнө
parent
commit
0cb1b3f687
1 өөрчлөгдсөн 18 нэмэгдсэн , 3 устгасан
  1. 18 3
      project.py

+ 18 - 3
project.py

@@ -283,7 +283,7 @@ class Project(object):
     return os.path.exists(os.path.join(g, 'rebase-apply')) \
         or os.path.exists(os.path.join(g, 'rebase-merge')) \
         or os.path.exists(os.path.join(w, '.dotest'))
-    
+
   def IsDirty(self, consider_untracked=True):
     """Is the working directory modified in some way?
     """
@@ -416,7 +416,7 @@ class Project(object):
 
       try: f = df[p]
       except KeyError: f = None
- 
+
       if i: i_status = i.status.upper()
       else: i_status = '-'
 
@@ -601,6 +601,18 @@ class Project(object):
     if not self._RemoteFetch():
       return False
 
+    #Check that the requested ref was found after fetch
+    #
+    try:
+      self.GetRevisionId()
+    except ManifestInvalidRevisionError:
+      # if the ref is a tag. We can try fetching
+      # the tag manually as a last resort
+      #
+      rev = self.revisionExpr
+      if rev.startswith(R_TAGS):
+        self._RemoteFetch(None, rev[len(R_TAGS):])
+
     if self.worktree:
       self._InitMRef()
     else:
@@ -982,7 +994,7 @@ class Project(object):
 
 ## Direct Git Commands ##
 
-  def _RemoteFetch(self, name=None):
+  def _RemoteFetch(self, name=None, tag=None):
     if not name:
       name = self.remote.name
 
@@ -994,6 +1006,9 @@ class Project(object):
     if not self.worktree:
       cmd.append('--update-head-ok')
     cmd.append(name)
+    if tag is not None:
+      cmd.append('tag')
+      cmd.append(tag)
     return GitCommand(self,
                       cmd,
                       bare = True,