~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tag.py

  • Committer: Samuel Bronson
  • Date: 2012-08-30 20:36:18 UTC
  • mto: (6015.57.3 2.4)
  • mto: This revision was merged to the branch mainline in revision 6558.
  • Revision ID: naesten@gmail.com-20120830203618-y2dzw91nqpvpgxvx
Update INSTALL for switch to Python 2.6 and up.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
  Branch.tags.add('name', 'value')
23
23
"""
24
24
 
25
 
from __future__ import absolute_import
26
 
 
27
25
# NOTE: I was going to call this tags.py, but vim seems to think all files
28
26
# called tags* are ctags files... mbp 20070220.
29
27
 
49
47
    def __init__(self, branch):
50
48
        self.branch = branch
51
49
 
52
 
    def get_tag_dict(self):
53
 
        """Return a dictionary mapping tags to revision ids.
54
 
        """
55
 
        raise NotImplementedError(self.get_tag_dict)
56
 
 
57
 
    def get_reverse_tag_dict(self):
58
 
        """Return a dictionary mapping revision ids to list of tags.
59
 
        """
60
 
        raise NotImplementedError(self.get_reverse_tag_dict)
61
 
 
62
 
    def merge_to(self, to_tags, overwrite=False, ignore_master=False):
63
 
        """Merge new tags from this tags container into another.
64
 
 
65
 
        :param to_tags: Tags container to merge into
66
 
        :param overwrite: Whether to overwrite existing, divergent, tags.
67
 
        :param ignore_master: Do not modify the tags in the target's master
68
 
            branch (if any).  Default is false (so the master will be updated).
69
 
            New in bzr 2.3.
70
 
        :return: Tuple with tag updates as dictionary and tag conflicts
71
 
        """
72
 
        raise NotImplementedError(self.merge_to)
73
 
 
74
 
    def set_tag(self, tag_name, revision):
75
 
        """Set a tag.
76
 
 
77
 
        :param tag_name: Tag name
78
 
        :param revision: Revision id
79
 
        :raise GhostTagsNotSupported: if revision is not present in
80
 
            the branch repository
81
 
        """
82
 
        raise NotImplementedError(self.set_tag)
83
 
 
84
 
    def lookup_tag(self, tag_name):
85
 
        """Look up a tag.
86
 
 
87
 
        :param tag_name: Tag to look up
88
 
        :raise NoSuchTag: Raised when tag does not exist
89
 
        :return: Matching revision id
90
 
        """
91
 
        raise NotImplementedError(self.lookup_tag)
92
 
 
93
 
    def delete_tag(self, tag_name):
94
 
        """Delete a tag.
95
 
 
96
 
        :param tag_name: Tag to delete
97
 
        :raise NoSuchTag: Raised when tag does not exist
98
 
        """
99
 
        raise NotImplementedError(self.delete_tag)
100
 
 
101
 
    def rename_revisions(self, rename_map):
102
 
        """Replace revision ids according to a rename map.
103
 
 
104
 
        :param rename_map: Dictionary mapping old revision ids to
105
 
            new revision ids.
106
 
        """
107
 
        raise NotImplementedError(self.rename_revisions)
108
 
 
109
50
    def has_tag(self, tag_name):
110
51
        return self.get_tag_dict().has_key(tag_name)
111
52
 
127
68
 
128
69
    def merge_to(self, to_tags, overwrite=False, ignore_master=False):
129
70
        # we never have anything to copy
130
 
        return {}, []
 
71
        pass
131
72
 
132
73
    def rename_revisions(self, rename_map):
133
74
        # No tags, so nothing to rename
260
201
            branch (if any).  Default is false (so the master will be updated).
261
202
            New in bzr 2.3.
262
203
 
263
 
        :returns: Tuple with tag_updates and tag_conflicts.
264
 
            tag_updates is a dictionary with new tags, None is used for
265
 
            removed tags
266
 
            tag_conflicts is a set of tags that conflicted, each of which is
 
204
        :returns: A set of tags that conflicted, each of which is
267
205
            (tagname, source_target, dest_target), or None if no copying was
268
206
            done.
269
207
        """
273
211
    def _merge_to_operation(self, operation, to_tags, overwrite, ignore_master):
274
212
        add_cleanup = operation.add_cleanup
275
213
        if self.branch == to_tags.branch:
276
 
            return {}, []
 
214
            return
277
215
        if not self.branch.supports_tags():
278
216
            # obviously nothing to copy
279
 
            return {}, []
 
217
            return
280
218
        source_dict = self.get_tag_dict()
281
219
        if not source_dict:
282
220
            # no tags in the source, and we don't want to clobber anything
283
221
            # that's in the destination
284
 
            return {}, []
 
222
            return
285
223
        # We merge_to both master and child individually.
286
224
        #
287
225
        # It's possible for master and child to have differing sets of
301
239
            master = to_tags.branch.get_master_branch()
302
240
        if master is not None:
303
241
            add_cleanup(master.lock_write().unlock)
304
 
        updates, conflicts = self._merge_to(to_tags, source_dict, overwrite)
 
242
        conflicts = self._merge_to(to_tags, source_dict, overwrite)
305
243
        if master is not None:
306
 
            extra_updates, extra_conflicts = self._merge_to(master.tags,
307
 
                source_dict, overwrite)
308
 
            updates.update(extra_updates)
309
 
            conflicts += extra_conflicts
 
244
            conflicts += self._merge_to(master.tags, source_dict,
 
245
                overwrite)
310
246
        # We use set() to remove any duplicate conflicts from the master
311
247
        # branch.
312
 
        return updates, set(conflicts)
 
248
        return set(conflicts)
313
249
 
314
250
    def _merge_to(self, to_tags, source_dict, overwrite):
315
251
        dest_dict = to_tags.get_tag_dict()
316
 
        result, updates, conflicts = self._reconcile_tags(source_dict,
317
 
            dest_dict, overwrite)
 
252
        result, conflicts = self._reconcile_tags(source_dict, dest_dict,
 
253
                                                 overwrite)
318
254
        if result != dest_dict:
319
255
            to_tags._set_tag_dict(result)
320
 
        return updates, conflicts
 
256
        return conflicts
321
257
 
322
258
    def rename_revisions(self, rename_map):
323
259
        """Rename revisions in this tags dictionary.
324
 
 
 
260
        
325
261
        :param rename_map: Dictionary mapping old revids to new revids
326
262
        """
327
263
        reverse_tags = self.get_reverse_tag_dict()
339
275
        * different definitions => if overwrite is False, keep destination
340
276
          value and give a warning, otherwise use the source value
341
277
 
342
 
        :returns: (result_dict, updates,
 
278
        :returns: (result_dict,
343
279
            [(conflicting_tag, source_target, dest_target)])
344
280
        """
345
281
        conflicts = []
346
 
        updates = {}
347
282
        result = dict(dest_dict) # copy
348
283
        for name, target in source_dict.items():
349
 
            if result.get(name) == target:
 
284
            if name not in result or overwrite:
 
285
                result[name] = target
 
286
            elif result[name] == target:
350
287
                pass
351
 
            elif name not in result or overwrite:
352
 
                updates[name] = target
353
 
                result[name] = target
354
288
            else:
355
289
                conflicts.append((name, target, result[name]))
356
 
        return result, updates, conflicts
 
290
        return result, conflicts
357
291
 
358
292
 
359
293
def _merge_tags_if_possible(from_branch, to_branch, ignore_master=False):