49
51
class RevisionSpec_git(RevisionSpec):
50
"""Selects a revision using a Git commit SHA1."""
52
help_txt = """Selects a revision using a Git commit SHA1.
54
Selects a revision using a Git commit SHA1, short or long.
56
This works for both native Git repositories and Git revisions
57
imported into Bazaar repositories.
52
"""Selects a revision using a Subversion revision number."""
54
help_txt = """Selects a revision using a Git revision sha1.
72
69
default_mapping.revision_id_foreign_to_bzr)(sha1)
74
71
if branch.repository.has_revision(bzr_revid):
72
return RevisionInfo.from_revision_id(branch, bzr_revid)
76
73
except GitSmartRemoteNotSupported:
74
return RevisionInfo(branch, None, bzr_revid)
78
75
raise InvalidRevisionSpec(self.user_spec, branch)
80
77
def __nonzero__(self):
93
90
parse_revid = getattr(branch.repository, "lookup_bzr_revision_id",
94
91
mapping_registry.parse_revision_id)
95
def matches_revid(revid):
96
if revid == NULL_REVISION:
99
foreign_revid, mapping = parse_revid(revid)
100
except InvalidRevisionId:
102
if not isinstance(mapping.vcs, ForeignGit):
104
return foreign_revid.startswith(sha1)
105
92
with branch.repository.lock_read():
106
93
graph = branch.repository.get_graph()
107
last_revid = branch.last_revision()
108
if matches_revid(last_revid):
110
for revid, _ in graph.iter_ancestry([last_revid]):
111
if matches_revid(revid):
94
for revid, _ in graph.iter_ancestry([branch.last_revision()]):
95
if revid == NULL_REVISION:
98
foreign_revid, mapping = parse_revid(revid)
99
except InvalidRevisionId:
101
if not isinstance(mapping.vcs, ForeignGit):
103
if foreign_revid.startswith(sha1):
104
return RevisionInfo.from_revision_id(branch, revid)
113
105
raise InvalidRevisionSpec(self.user_spec, branch)
115
def _as_revision_id(self, context_branch):
107
def _match_on(self, branch, revs):
116
108
loc = self.spec.find(':')
117
109
git_sha1 = self.spec[loc + 1:].encode("utf-8")
118
if (len(git_sha1) > 40 or len(git_sha1) < 4 or
119
not valid_git_sha1(git_sha1)):
120
raise InvalidRevisionSpec(self.user_spec, context_branch)
110
if len(git_sha1) > 40 or not valid_git_sha1(git_sha1):
111
raise InvalidRevisionSpec(self.user_spec, branch)
122
113
lazy_check_versions,
124
115
lazy_check_versions()
125
116
if len(git_sha1) == 40:
126
return self._lookup_git_sha1(context_branch, git_sha1)
117
return self._lookup_git_sha1(branch, git_sha1)
128
return self._find_short_git_sha1(context_branch, git_sha1)
130
def _match_on(self, branch, revs):
131
revid = self._as_revision_id(branch)
132
return RevisionInfo.from_revision_id(branch, revid)
119
return self._find_short_git_sha1(branch, git_sha1)
134
121
def needs_branch(self):