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>
This commit is contained in:
Julius Gustavsson 2010-06-17 17:55:02 +02:00 committed by Shawn O. Pearce
parent 9e426aa432
commit 0cb1b3f687

View File

@ -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,