85
88
self.branch = branch
86
89
self.repository = branch.repository
91
def _iter_tag_refs(self, refs):
92
raise NotImplementedError(self._iter_tag_refs)
94
def _merge_to_git(self, to_tags, refs, overwrite=False):
95
target_repo = to_tags.repository
97
for k, v in refs.iteritems():
100
if overwrite or not k in self.target.repository.refs:
101
target_repo.refs[k] = v
102
elif target_repo.repository.refs[k] == v:
105
conflicts.append((ref_to_tag_name(k), v, target_repo.refs[k]))
108
def _merge_to_non_git(self, to_tags, refs, overwrite=False):
109
unpeeled_map = defaultdict(set)
111
result = dict(to_tags.get_tag_dict())
112
for n, peeled, unpeeled, bzr_revid in self._iter_tag_refs(refs):
113
if unpeeled is not None:
114
unpeeled_map[peeled].add(unpeeled)
115
if n not in result or overwrite:
116
result[n] = bzr_revid
117
elif result[n] == bzr_revid:
120
conflicts.append((n, result[n], bzr_revid))
121
to_tags._set_tag_dict(result)
122
if len(unpeeled_map) > 0:
123
map_file = UnpeelMap.from_repository(to_tags.branch.repository)
124
map_file.update(unpeeled_map)
125
map_file.save_in_repository(to_tags.branch.repository)
128
def merge_to(self, to_tags, overwrite=False, ignore_master=False,
130
if source_refs is None:
131
source_refs = self.repository.get_refs()
134
if isinstance(to_tags, GitTags):
135
return self._merge_to_git(to_tags, source_refs,
141
master = to_tags.branch.get_master_branch()
142
conflicts = self._merge_to_non_git(to_tags, source_refs,
144
if master is not None:
145
conflicts += self.merge_to(to_tags, overwrite=overwrite,
146
source_refs=source_refs,
147
ignore_master=ignore_master)
150
def get_tag_dict(self):
152
refs = self.repository.get_refs()
153
for (name, peeled, unpeeled, bzr_revid) in self._iter_tag_refs(refs):
154
ret[name] = bzr_revid
89
158
class LocalGitTagDict(GitTags):
90
159
"""Dictionary with tags in a local repository."""
93
162
super(LocalGitTagDict, self).__init__(branch)
94
163
self.refs = self.repository._git.refs
96
def get_tag_dict(self):
98
refs = self.repository._git.get_refs()
165
def _iter_tag_refs(self, refs):
166
"""Iterate over the tag refs.
168
:param refs: Refs dictionary (name -> git sha1)
169
:return: iterator over (name, peeled_sha1, unpeeled_sha1, bzr_revid)
99
171
for k, (peeled, unpeeled) in extract_tags(refs).iteritems():
101
173
obj = self.repository._git[peeled]
112
184
mutter("Tag %s points at object %r that is not a commit, "
113
185
"ignoring", k, obj)
115
ret[k] = self.branch.lookup_foreign_revision_id(peeled)
187
yield (k, peeled, unpeeled,
188
self.branch.lookup_foreign_revision_id(peeled))
118
191
def _set_tag_dict(self, to_dict):
119
192
extra = set(self.repository._git.get_refs().keys())
625
698
result.old_revid = self.target.last_revision()
626
699
refs, stop_revision = self.update_refs(stop_revision)
627
700
self.target.generate_revision_history(stop_revision, result.old_revid)
628
result.tag_conflicts = self.update_tags(refs, overwrite=overwrite)
701
result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
702
source_refs=refs, overwrite=overwrite)
629
703
result.new_revid = self.target.last_revision()
632
def update_tags(self, refs, overwrite=False):
634
for k, v in refs.iteritems():
637
if overwrite or not k in self.target.repository.refs:
638
self.target.repository.refs[k] = v
639
elif self.target.repository.refs[k] == v:
642
conflicts.append((ref_to_tag_name(k), v, self.target.repository.refs[k]))
645
706
def update_refs(self, stop_revision=None):
646
707
interrepo = repository.InterRepository.get(self.source.repository,
647
708
self.target.repository)
663
724
result.old_revid = self.target.last_revision()
664
725
refs, stop_revision = self.update_refs(stop_revision)
665
726
self.target.generate_revision_history(stop_revision, result.old_revid)
666
result.tag_conflicts = self.update_tags(refs)
727
result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
728
overwrite=overwrite, source_refs=refs)
667
729
result.new_revid = self.target.last_revision()