[merge] tags in repository

Martin Pool mbp at canonical.com
Tue Jan 23 00:50:21 GMT 2007


This adds tags stored in the repository, and visible across branches in
that repository.  Adding a tag doesn't require a commit.  Tags are
'global' across projects so people should use them appropriately - eg
putting the project name at the start of the tag like 'bzr-0.14'.  

Tags are copied by commands like push, pull, merge, branch.  This is
done in the command line level rather than from eg fetch (but I'm open
to changing it) because commands might want 'pull --no-tags' or 'pull
--overwrite-tags' in the future.

This incidentally adds a -d option to override the default directory for
some commands, for ease of testing and because it's previously been
requested.

Implementation notes:

 * This adds them into the KnitRepository2 format.  I would like them to
   be in the default format for the next release, but I'm not sure if 
   all the changes in KnitRepository2 are in that class.
 
 * The implementation of tags is in a strategy object used by the
   repository, partly so that we can keep it common between related
   formats, or switch it from one release into another.

 * There should be some scope for different repositories (eg svn or
   future formats) to have different approaches.

Future things (in this release):
 
 * Give a warning when there are diverging values for a tag.  By 
   default don't overwrite them, but have a way to accept the other 
   person's value.

 * Use tag names as a fallback for revisionspecs if there's no
   namespace.

 * List tags

 * Delete tags

 * Show tags in log




# Bazaar revision bundle v0.8
#
# message:
#   Add -d option to push, pull, merge commands.
#   
#   Tags now propagate between repositories by commands that move history around:
#   branch, push, pull, merge.
#   
#   Add Repository.supports_tags method.
#   
#   All Repository tag methods now raise TagsNotSupported if they're not.
#   
#   
# committer: Martin Pool <mbp at sourcefrog.net>
# date: Sun 2007-01-21 23:42:13.753000021 +1100

=== added file bzrlib/tests/blackbox/test_tags.py // file-id:test_tags.py-20070
... 116132048-5h4qak2cm22jlb9e-1
--- /dev/null
+++ bzrlib/tests/blackbox/test_tags.py
@@ -0,0 +1,88 @@
+# Copyright (C) 2007 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+"""Tests for commands related to tags"""
+
+from bzrlib.branch import Branch
+from bzrlib.bzrdir import BzrDir
+from bzrlib.tests import TestCaseWithTransport
+from bzrlib.repository import (
+    Repository,
+    RepositoryFormatKnit2,
+    )
+from bzrlib.workingtree import WorkingTree
+
+
+class TestTagging(TestCaseWithTransport):
+
+    # as of 0.14, the default format doesn't do tags so we need to use a
+    # specific format
+    
+    def make_branch_and_tree(self, relpath):
+        control = BzrDir.create(relpath)
+        repo = RepositoryFormatKnit2().initialize(control)
+        control.create_branch()
+        return control.create_workingtree()
+
+    def test_tag_command_help(self):
+        out, err = self.run_bzr_captured(['help', 'tag'])
+        self.assertContainsRe(out, 'Create a tag')
+
+    def test_cannot_tag_range(self):
+        out, err = self.run_bzr('tag', '-r1..10', 'name', retcode=3)
+        self.assertContainsRe(err,
+            "Tags can only be placed on a single revision")
+
+    def test_tag_current_rev(self):
+        t = self.make_branch_and_tree('branch')
+        t.commit(allow_pointless=True, message='initial commit',
+            rev_id='first-revid')
+        # make a tag through the command line
+        out, err = self.run_bzr('tag', '-d', 'branch', 'NEWTAG')
+        self.assertContainsRe(out, 'created tag NEWTAG')
+        # tag should be observable through the api
+        repo = t.branch.repository
+        self.assertEquals(repo.get_tag_dict(), dict(NEWTAG='first-revid'))
+        # can also create tags using -r
+        self.run_bzr('tag', '-d', 'branch', 'tag2', '-r1')
+        self.assertEquals(repo.lookup_tag('tag2'), 'first-revid')
+
+    def test_branch_push_pull_merge_copies_tags(self):
+        t = self.make_branch_and_tree('branch1')
+        t.commit(allow_pointless=True, message='initial commit',
+            rev_id='first-revid')
+        repo1 = t.branch.repository
+        repo1.set_tag('tag1', 'first-revid')
+        # branching copies the tag across
+        self.run_bzr('branch', 'branch1', 'branch2')
+        repo2 = Repository.open('branch2')
+        self.assertEquals(repo2.lookup_tag('tag1'), 'first-revid')
+        # make a new tag and pull it
+        repo1.set_tag('tag2', 'twa')
+        self.run_bzr('pull', '-d', 'branch2', 'branch1')
+        self.assertEquals(repo2.lookup_tag('tag2'), 'twa')
+        # make a new tag and push it
+        repo1.set_tag('tag3', 'san')
+        self.run_bzr('push', '-d', 'branch1', 'branch2')
+        self.assertEquals(repo2.lookup_tag('tag3'), 'san')
+        # make a new tag and merge it
+        t.commit(allow_pointless=True, message='second commit',
+            rev_id='second-revid')
+        t2 = WorkingTree.open('branch2')
+        t2.commit(allow_pointless=True, message='commit in second')
+        repo1.set_tag('tag4', 'second-revid')
+        self.run_bzr('merge', '-d', 'branch2', 'branch1')
+        self.assertEquals(repo2.lookup_tag('tag4'), 'second-revid')

=== added file bzrlib/tests/repository_implementations/test_tags.py // file-id:
... test_tags.py-20070114073919-azsbo9l26ph1rr09-1 // last-changed:mbp at sourcefr
... og.net-20070121085653-ptonrp6w7ini27un
--- /dev/null
+++ bzrlib/tests/repository_implementations/test_tags.py
@@ -0,0 +1,112 @@
+# Copyright (C) 2007 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+"""Tags stored within a repository"""
+
+import os
+import re
+import sys
+
+import bzrlib
+from bzrlib import bzrdir, errors, repository
+from bzrlib.branch import Branch, needs_read_lock, needs_write_lock
+from bzrlib.repository import Repository
+from bzrlib.tests import TestCase, TestCaseWithTransport, TestSkipped
+from bzrlib.trace import mutter
+from bzrlib.workingtree import WorkingTree
+
+from bzrlib.tests.repository_implementations.test_repository \
+        import TestCaseWithRepository
+
+
+class TestRepositoryTags(TestCaseWithRepository):
+
+    def setUp(self):
+        # formats that don't support tags can skip the rest of these 
+        # tests...
+        fmt = self.repository_format
+        f = getattr(fmt, 'supports_tags')
+        if f is None:
+            raise TestSkipped("format %s doesn't declare whether it "
+                "supports tags, assuming not" % fmt)
+        if not f():
+            raise TestSkipped("format %s doesn't support tags" % fmt)
+        TestCaseWithRepository.setUp(self)
+
+    def test_tags_initially_empty(self):
+        repo = self.make_repository('repo')
+        tags = repo.get_tag_dict()
+        self.assertEqual(tags, {})
+
+    def test_make_and_lookup_tag(self):
+        repo = self.make_repository('repo')
+        repo.set_tag('tag-name', 'target-revid-1')
+        repo.set_tag('other-name', 'target-revid-2')
+        # then reopen the repo and see they're still there
+        repo = Repository.open('repo')
+        self.assertEqual(repo.get_tag_dict(), 
+            {'tag-name': 'target-revid-1',
+             'other-name': 'target-revid-2',
+            })
+        # read one at a time
+        result = repo.lookup_tag('tag-name')
+        self.assertEqual(result, 'target-revid-1')
+
+    def test_no_such_tag(self):
+        repo = self.make_repository('repo')
+        try:
+            repo.lookup_tag('bosko')
+        except errors.NoSuchTag, e:
+            self.assertEquals(e.tag_name, 'bosko')
+            self.assertEquals(str(e), 'No such tag: bosko')
+        else:
+            self.fail("didn't get expected exception")
+
+    def test_copy_tags(self):
+        repo1 = self.make_repository('repo1')
+        repo2 = self.make_repository('repo2')
+        repo1.set_tag('tagname', 'revid')
+        repo1.copy_tags_to(repo2)
+        self.assertEquals(repo2.lookup_tag('tagname'), 'revid')
+
+
+
+class TestUnsupportedTags(TestCaseWithRepository):
+    """Formats that don't support tags should give reasonable errors."""
+
+    def setUp(self):
+        fmt = self.repository_format
+        supported = getattr(fmt, 'supports_tags')
+        if supported is None:
+            warn("Format %s doesn't declare whether it supports tags or not"
+                 % fmt)
+            raise TestSkipped('No tag support at all')
+        if supported():
+            raise TestSkipped("Format %s declares that tags are supported"
+                              % fmt)
+            # it's covered by TestRepositoryTags
+        TestCaseWithRepository.setUp(self)
+    
+    def test_tag_methods_raise(self):
+        repo = self.make_repository('repo')
+        self.assertRaises(errors.TagsNotSupported,
+            repo.set_tag, 'foo', 'bar')
+        self.assertRaises(errors.TagsNotSupported,
+            repo.lookup_tag, 'foo')
+        self.assertRaises(errors.TagsNotSupported,
+            repo.set_tag, 'foo', 'bar')
+
+

=== modified file NEWS
--- NEWS
+++ NEWS
@@ -1,3 +1,12 @@
+  IMPROVEMENTS:
+
+    * New option ``-d`` for pull and other commands, specifying the
+      branch or tree to operate on rather than the working directory.
+      (Martin Pool)
+
+    * Builtin tags support, created by the ``tag`` command and stored 
+      in the repository.  (Martin Pool)
+
 IN DEVELOPMENT
 
   IMPROVEMENTS:

=== modified file bzrlib/branch.py // last-changed:mbp at sourcefrog.net-200701190
... 24650-o12ekgnjski2v3ed
--- bzrlib/branch.py
+++ bzrlib/branch.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2005, 2006 Canonical Ltd
+# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by

=== modified file bzrlib/builtins.py
--- bzrlib/builtins.py
+++ bzrlib/builtins.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2005, 2006 Canonical Ltd
+# Copyright (C) 2004, 2005, 2006, 2007 Canonical Ltd
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -499,18 +499,29 @@
     location can be accessed.
     """
 
-    takes_options = ['remember', 'overwrite', 'revision', 'verbose']
+    takes_options = ['remember', 'overwrite', 'revision', 'verbose',
+        Option('directory',
+            help='branch to pull into, '
+                 'rather than the one containing the working directory',
+            short_name='d',
+            type=unicode,
+            ),
+        ]
     takes_args = ['location?']
     encoding_type = 'replace'
 
-    def run(self, location=None, remember=False, overwrite=False, revision=None, verbose=False):
+    def run(self, location=None, remember=False, overwrite=False,
+            revision=None, verbose=False,
+            directory=None):
         # FIXME: too much stuff is in the command class
+        if directory is None:
+            directory = u'.'
         try:
-            tree_to = WorkingTree.open_containing(u'.')[0]
+            tree_to = WorkingTree.open_containing(directory)[0]
             branch_to = tree_to.branch
         except errors.NoWorkingTree:
             tree_to = None
-            branch_to = Branch.open_containing(u'.')[0]
+            branch_to = Branch.open_containing(directory)[0]
 
         reader = None
         if location is not None:
@@ -530,7 +541,6 @@
                 self.outf.write("Using saved location: %s\n" % display_url)
                 location = stored_loc
 
-
         if reader is not None:
             install_bundle(branch_to.repository, reader)
             branch_from = branch_to
@@ -554,6 +564,7 @@
             count = tree_to.pull(branch_from, overwrite, rev_id)
         else:
             count = branch_to.pull(branch_from, overwrite, rev_id)
+        _copy_tags_maybe(branch_from, branch_to)
         note('%d revision(s) pulled.' % (count,))
 
         if verbose:
@@ -592,18 +603,27 @@
     """
 
     takes_options = ['remember', 'overwrite', 'verbose',
-                     Option('create-prefix', 
-                            help='Create the path leading up to the branch '
-                                 'if it does not already exist')]
+        Option('create-prefix', 
+               help='Create the path leading up to the branch '
+                    'if it does not already exist'),
+        Option('directory',
+            help='branch to push from, '
+                 'rather than the one containing the working directory',
+            short_name='d',
+            type=unicode,
+            ),
+        ]
     takes_args = ['location?']
     encoding_type = 'replace'
 
     def run(self, location=None, remember=False, overwrite=False,
-            create_prefix=False, verbose=False):
+            create_prefix=False, verbose=False,
+            directory=None):
         # FIXME: Way too big!  Put this into a function called from the
         # command.
-        
-        br_from = Branch.open_containing('.')[0]
+        if directory is None:
+            directory = '.'
+        br_from = Branch.open_containing(directory)[0]
         stored_loc = br_from.get_push_location()
         if location is None:
             if stored_loc is None:
@@ -674,6 +694,7 @@
             except errors.DivergedBranches:
                 raise errors.BzrCommandError('These branches have diverged.'
                                         '  Try using "merge" and then "push".')
+        _copy_tags_maybe(br_from, br_to)
         note('%d revision(s) pushed.' % (count,))
 
         if verbose:
@@ -759,11 +780,28 @@
                 raise errors.BzrCommandError(msg)
             if name:
                 branch.control_files.put_utf8('branch-name', name)
+            _copy_tags_maybe(br_from, branch)
             note('Branched %d revision(s).' % branch.revno())
         finally:
             br_from.unlock()
 
 
+def _copy_tags_maybe(from_branch, to_branch):
+    """Copy tags between repositories if necessary and possible.
+    
+    This method has common command-line behaviour about handling 
+    error cases.
+    """
+    from_repo = from_branch.repository
+    to_repo = to_branch.repository
+    if not from_repo.supports_tags():
+        # obviously nothing to copy
+        return
+    # TODO: give a warning if the source format supports tags and actually has
+    # tags, but the destination doesn't accept them.
+    from_repo.copy_tags_to(to_repo)
+
+
 class cmd_checkout(Command):
     """Create a new checkout of an existing branch.
 
@@ -2235,6 +2273,10 @@
     default, use --remember. The value will only be saved if the remote
     location can be accessed.
 
+    The results of the merge are placed into the destination working
+    directory, where they can be reviewed (with bzr diff), tested, and then
+    committed to record the result of the merge.
+
     Examples:
 
     To merge the latest revision from bzr.dev
@@ -2253,15 +2295,21 @@
     """
     takes_args = ['branch?']
     takes_options = ['revision', 'force', 'merge-type', 'reprocess', 'remember',
-                     Option('show-base', help="Show base revision text in "
-                            "conflicts"),
-                     Option('uncommitted', help='Apply uncommitted changes'
-                            ' from a working copy, instead of branch changes'),
-                     Option('pull', help='If the destination is already'
-                             ' completely merged into the source, pull from the'
-                             ' source rather than merging. When this happens,'
-                             ' you do not need to commit the result.'),
-                     ]
+        Option('show-base', help="Show base revision text in "
+               "conflicts"),
+        Option('uncommitted', help='Apply uncommitted changes'
+               ' from a working copy, instead of branch changes'),
+        Option('pull', help='If the destination is already'
+                ' completely merged into the source, pull from the'
+                ' source rather than merging. When this happens,'
+                ' you do not need to commit the result.'),
+        Option('directory',
+            help='branch to push from, '
+                 'rather than the one containing the working directory',
+            short_name='d',
+            type=unicode,
+            ),
+    ]
 
     def help(self):
         from inspect import getdoc
@@ -2269,11 +2317,13 @@
 
     def run(self, branch=None, revision=None, force=False, merge_type=None,
             show_base=False, reprocess=False, remember=False, 
-            uncommitted=False, pull=False):
+            uncommitted=False, pull=False,
+            directory=None,
+            ):
         if merge_type is None:
             merge_type = _mod_merge.Merge3Merger
-
-        tree = WorkingTree.open_containing(u'.')[0]
+        if directory is None: directory = u'.'
+        tree = WorkingTree.open_containing(directory)[0]
 
         if branch is not None:
             try:
@@ -2328,6 +2378,10 @@
         if tree.branch.get_parent() is None or remember:
             tree.branch.set_parent(other_branch.base)
 
+        # pull tags now... it's a bit inconsistent to do it ahead of copying
+        # the history but that's done inside the merge code
+        _copy_tags_maybe(other_branch, tree.branch)
+
         if path != "":
             interesting_files = [path]
         else:
@@ -2341,6 +2395,7 @@
                     reprocess=reprocess,
                     show_base=show_base,
                     pull=pull,
+                    this_dir=directory,
                     pb=pb, file_list=interesting_files)
             finally:
                 pb.finished()
@@ -2994,6 +3049,42 @@
         server.serve()
 
 
+class cmd_tag(Command):
+    """Create a tag naming a revision.
+    
+    Tags give human-meaningful names to revisions.  Commands that take a -r
+    (--revision) option can be given -rtag:X, where X is any previously
+    created tag.
+
+    Tags are stored in the repository, and apply to all branches stored
+    in the repository.  Tags are copied from one branch to another along
+    when you branch, push, pull or merge.
+    """
+
+    takes_args = ['tag_name']
+    takes_options = [
+        Option('directory',
+            help='branch or repository to tag',
+            short_name='d',
+            type=unicode,
+            ),
+        'revision',
+        ]
+
+    def run(self, tag_name, directory='.', revision=None):
+        branch, relpath = Branch.open_containing(directory)
+        if revision:
+            if len(revision) != 1:
+                raise errors.BzrCommandError(
+                    "Tags can only be placed on a single revision, "
+                    "not on a range")
+            revision_id = revision[0].in_history(branch).rev_id
+        else:
+            revision_id = branch.last_revision()
+        branch.repository.set_tag(tag_name, revision_id)
+        self.outf.write('created tag %s' % tag_name)
+
+
 # command-line interpretation helper for merge-related commands
 def _merge_helper(other_revision, base_revision,
                   check_clean=True, ignore_zero=False,

=== modified file bzrlib/errors.py // last-changed:mbp at sourcefrog.net-200701190
... 83251-tr6zsf024kckx3lb
--- bzrlib/errors.py
+++ bzrlib/errors.py
@@ -1602,3 +1602,19 @@
     def __init__(self, name):
         BzrError.__init__(self)
         self.name = name
+
+
+class NoSuchTag(BzrError):
+
+    _fmt = "No such tag: %(tag_name)s"
+
+    def __init__(self, tag_name):
+        self.tag_name = tag_name
+
+
+class TagsNotSupported(BzrError):
+
+    _fmt = "Tags not supported by repository %(repository)s"
+
+    def __init__(self, repository):
+        self.repository = repository

=== modified file bzrlib/repository.py
--- bzrlib/repository.py
+++ bzrlib/repository.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2005, 2006 Canonical Ltd
+# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -71,6 +71,100 @@
 _deprecation_warning_done = False
 
 
+######################################################################
+# tag storage
+
+
+class _TagStore(object):
+    def __init__(self, repository):
+        self.repository = repository
+
+class _DisabledTagStore(_TagStore):
+    """Tag storage that refuses to store anything.
+
+    This is used by older formats that can't store tags.
+    """
+
+    def _not_supported(self, *a, **k):
+        raise errors.TagsNotSupported(self.repository)
+
+    def supports_tags(self):
+        return False
+
+    set_tag = _not_supported
+    get_tag_dict = _not_supported
+    _set_tag_dict = _not_supported
+    lookup_tag = _not_supported
+
+
+class _BasicTagStore(_TagStore):
+    """Tag storage in an unversioned repository control file.
+    """
+
+    def supports_tags(self):
+        return True
+
+    def set_tag(self, tag_name, tag_target):
+        """Add a tag definition to the repository.
+
+        Behaviour if the tag is already present is not defined (yet).
+        """
+        # all done with a write lock held, so this looks atomic
+        self.repository.lock_write()
+        try:
+            td = self.get_tag_dict()
+            td[tag_name] = tag_target
+            self._set_tag_dict(td)
+        finally:
+            self.repository.unlock()
+
+    def lookup_tag(self, tag_name):
+        """Return the referent string of a tag"""
+        td = self.get_tag_dict()
+        try:
+            return td[tag_name]
+        except KeyError:
+            raise errors.NoSuchTag(tag_name)
+
+    def get_tag_dict(self):
+        self.repository.lock_read()
+        try:
+            tag_content = self.repository.control_files.get_utf8('tags').read()
+            return self._deserialize_tag_dict(tag_content)
+        finally:
+            self.repository.unlock()
+
+    def _set_tag_dict(self, new_dict):
+        """Replace all tag definitions
+
+        :param new_dict: Dictionary from tag name to target.
+        """
+        self.repository.lock_read()
+        try:
+            self.repository.control_files.put_utf8('tags',
+                self._serialize_tag_dict(new_dict))
+        finally:
+            self.repository.unlock()
+
+    def _serialize_tag_dict(self, tag_dict):
+        s = []
+        for tag, target in sorted(tag_dict.items()):
+            # TODO: check that tag names and targets are acceptable
+            s.append(tag + '\t' + target + '\n')
+        return ''.join(s)
+
+    def _deserialize_tag_dict(self, tag_content):
+        """Convert the tag file into a dictionary of tags"""
+        d = {}
+        for l in tag_content.splitlines():
+            tag, target = l.split('\t', 1)
+            d[tag] = target
+        return d
+
+
+######################################################################
+# Repositories
+
 class Repository(object):
     """Repository holding history for one or more branches.
 
@@ -83,6 +177,9 @@
     remote) disk.
     """
 
+    # override this to set the strategy for storing tags
+    _tag_store_class = _DisabledTagStore
+
     _file_ids_altered_regex = lazy_regex.lazy_compile(
         r'file_id="(?P<file_id>[^"]+)"'
         r'.*revision="(?P<revision_id>[^"]+)"'
@@ -222,6 +319,7 @@
         # on whether escaping is required.
         self._warn_if_deprecated()
         self._serializer = xml5.serializer_v5
+        self._tag_store = self._tag_store_class(self)
 
     def __repr__(self):
         return '%s(%r)' % (self.__class__.__name__, 
@@ -775,6 +873,29 @@
                 except UnicodeEncodeError:
                     raise errors.NonAsciiRevisionId(method, self)
 
+    def set_tag(self, tag_name, tag_target):
+        self._tag_store.set_tag(tag_name, tag_target)
+
+    def lookup_tag(self, tag_name):
+        return self._tag_store.lookup_tag(tag_name)
+
+    def get_tag_dict(self):
+        return self._tag_store.get_tag_dict()
+
+    def _set_tag_dict(self, new_dict):
+        return self._tag_store._set_tag_dict(new_dict)
+
+    def supports_tags(self):
+        return self._tag_store.supports_tags()
+
+    def copy_tags_to(self, to_repository):
+        """Copy tags to another repository.
+
+        Subclasses should not override this, but rather customize copying 
+        through the InterRepository mechanism.
+        """
+        return InterRepository.get(self, to_repository).copy_tags()
+
 
 class AllInOneRepository(Repository):
     """Legacy support - the repository behaviour for all-in-one branches."""
@@ -1088,11 +1209,19 @@
 
 
 class KnitRepository2(KnitRepository):
-    """"""
+    """Experimental enhanced knit format"""
+
+    # corresponds to RepositoryFormatKnit2
+    
+    # TODO: within a lock scope, we could keep the tags in memory...
+    
+    _tag_store_class = _BasicTagStore
+
     def __init__(self, _format, a_bzrdir, control_files, _revision_store,
                  control_store, text_store):
         KnitRepository.__init__(self, _format, a_bzrdir, control_files,
                               _revision_store, control_store, text_store)
+        self._transport = control_files._transport
         self._serializer = xml6.serializer_v6
 
     def deserialise_inventory(self, revision_id, xml):
@@ -1133,6 +1262,9 @@
                                  committer, revprops, revision_id)
 
 
+#####################################################################
+# Repository Formats
+
 class RepositoryFormat(object):
     """A repository format.
 
@@ -1218,7 +1350,7 @@
         from bzrlib.store.revision.text import TextRevisionStore
         dir_mode = control_files._dir_mode
         file_mode = control_files._file_mode
-        text_store =TextStore(transport.clone(name),
+        text_store = TextStore(transport.clone(name),
                               prefixed=prefixed,
                               compressed=compressed,
                               dir_mode=dir_mode,
@@ -1286,6 +1418,10 @@
         assert klass._formats[format.get_format_string()] is format
         del klass._formats[format.get_format_string()]
 
+    def supports_tags(self):
+        """True if this format supports tags stored in the repository"""
+        return False  # by default
+
 
 class PreSplitOutRepositoryFormat(RepositoryFormat):
     """Base class for the pre split out repository formats."""
@@ -1751,7 +1887,7 @@
      - an optional 'no-working-trees' flag
      - a LockDir lock
      - Support for recording full info about the tree root
-
+     - A tag dictionary stored in the repository, pointing to revisions
     """
     
     rich_root_data = True
@@ -1793,7 +1929,15 @@
                                control_files=control_files,
                                _revision_store=_revision_store,
                                control_store=control_store,
-                               text_store=text_store)
+                                text_store=text_store)
+
+    def initialize(self, a_bzrdir, shared=False):
+        repo = super(RepositoryFormatKnit2, self).initialize(a_bzrdir, shared)
+        repo._transport.put_bytes_non_atomic('tags', '')
+        return repo
+
+    def supports_tags(self):
+        return True
 
 
 
@@ -1866,6 +2010,19 @@
         # that we've decided we need.
         return [rev_id for rev_id in source_ids if rev_id in result_set]
 
+    def copy_tags(self):
+        """Copy all tags from source to the target."""
+        # A default implementation is provided even though not all
+        # Repositories will support tags... we'll just get an error back from
+        # the underlying method.
+        if self.target == self.source:
+            return
+        self.target.lock_write()
+        try:
+            self.target._set_tag_dict(self.source.get_tag_dict())
+        finally:
+            self.target.unlock()
+
 
 class InterSameDataRepository(InterRepository):
     """Code for converting between repositories that represent the same data.

=== modified file bzrlib/revisionspec.py // last-changed:mbp at sourcefrog.net-200
... 70119024650-o12ekgnjski2v3ed
--- bzrlib/revisionspec.py
+++ bzrlib/revisionspec.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2005 Canonical Ltd
+# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -93,6 +93,18 @@
         return '<bzrlib.revisionspec.RevisionInfo object %s, %s for %r>' % (
             self.revno, self.rev_id, self.branch)
 
+    @staticmethod
+    def from_revision_id(branch, revision_id, revs):
+        """Construct a RevisionInfo given just the id.
+
+        Use this if you don't know or care what the revno is.
+        """
+        try:
+            revno = revs.index(revision_id) + 1
+        except ValueError:
+            revno = None
+        return RevisionInfo(branch, revno, revision_id)
+
 
 # classes in this list should have a "prefix" attribute, against which
 # string specs are matched
@@ -365,11 +377,7 @@
     prefix = 'revid:'
 
     def _match_on(self, branch, revs):
-        try:
-            revno = revs.index(self.spec) + 1
-        except ValueError:
-            revno = None
-        return RevisionInfo(branch, revno, self.spec)
+        return RevisionInfo.from_revision_id(branch, self.spec, revs)
 
 SPEC_TYPES.append(RevisionSpec_revid)
 
@@ -463,16 +471,21 @@
 
 
 class RevisionSpec_tag(RevisionSpec):
-    """To be implemented."""
-
-    help_txt = """To be implemented."""
+    """Select a revision identified by tag name"""
+
+    help_txt = """Selects a revision identified by a tag name.
+
+    Tags are stored in the repository and created by the 'tag'
+    command.
+    """
 
     prefix = 'tag:'
 
     def _match_on(self, branch, revs):
-        raise errors.InvalidRevisionSpec(self.user_spec, branch,
-                                         'tag: namespace registered,'
-                                         ' but not implemented')
+        # Can raise tags not supported, NoSuchTag, etc
+        return RevisionInfo.from_revision_id(branch,
+            branch.repository.lookup_tag(self.spec),
+            revs)
 
 SPEC_TYPES.append(RevisionSpec_tag)
 

=== modified file bzrlib/tests/blackbox/__init__.py // last-changed:mbp at sourcef
... rog.net-20070116132138-vhziz9hpfc8za0uj
--- bzrlib/tests/blackbox/__init__.py
+++ bzrlib/tests/blackbox/__init__.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2005, 2006 Canonical Ltd
+# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -87,6 +87,7 @@
                      'bzrlib.tests.blackbox.test_shared_repository',
                      'bzrlib.tests.blackbox.test_sign_my_commits',
                      'bzrlib.tests.blackbox.test_status',
+                     'bzrlib.tests.blackbox.test_tags',
                      'bzrlib.tests.blackbox.test_testament',
                      'bzrlib.tests.blackbox.test_too_much',
                      'bzrlib.tests.blackbox.test_uncommit',

=== modified file bzrlib/tests/repository_implementations/__init__.py // last-c
... hanged:mbp at sourcefrog.net-20070114085612-q90lx2g0firzu7z9
--- bzrlib/tests/repository_implementations/__init__.py
+++ bzrlib/tests/repository_implementations/__init__.py
@@ -46,6 +46,7 @@
         'bzrlib.tests.repository_implementations.test_reconcile',
         'bzrlib.tests.repository_implementations.test_repository',
         'bzrlib.tests.repository_implementations.test_revision',
+        'bzrlib.tests.repository_implementations.test_tags',
         ]
     adapter = RepositoryTestProviderAdapter(
         default_transport,

=== modified file bzrlib/tests/repository_implementations/test_repository.py //
...  last-changed:mbp at sourcefrog.net-20070114085612-q90lx2g0firzu7z9
--- bzrlib/tests/repository_implementations/test_repository.py
+++ bzrlib/tests/repository_implementations/test_repository.py
@@ -43,9 +43,6 @@
 
 class TestCaseWithRepository(TestCaseWithBzrDir):
 
-    def setUp(self):
-        super(TestCaseWithRepository, self).setUp()
-
     def make_branch(self, relpath, format=None):
         repo = self.make_repository(relpath, format=None)
         return repo.bzrdir.create_branch()

=== modified file bzrlib/tests/test_repository.py // last-changed:mbp at sourcefro
... g.net-20070119024650-o12ekgnjski2v3ed
--- bzrlib/tests/test_repository.py
+++ bzrlib/tests/test_repository.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2006 Canonical Ltd
+# Copyright (C) 2006, 2007 Canonical Ltd
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -321,7 +321,6 @@
         self.assertTrue(S_ISDIR(t.stat('knits').st_mode))
         self.check_knits(t)
 
-
 class InterString(repository.InterRepository):
     """An inter-repository optimised code path for strings.
 
@@ -458,3 +457,15 @@
         tree.commit("Another dull commit", rev_id='dull2')
         revision_tree = tree.branch.repository.revision_tree('dull2')
         self.assertEqual('dull', revision_tree.inventory.root.revision)
+
+    def test_tag_serialization(self):
+        """Test the precise representation of tag dicts."""
+        # Don't change this after we commit to this format, as it checks 
+        # that the format is stable and compatible across releases
+        store = repository._BasicTagStore(repository=None)
+        td = dict(stable='stable-revid', boring='boring-revid')
+        packed = store._serialize_tag_dict(td)
+        expected = 'boring\tboring-revid\nstable\tstable-revid\n'
+        self.assertEqualDiff(packed, expected)
+        self.assertEqual(store._deserialize_tag_dict(packed), td)
+

=== modified file bzrlib/tests/test_revisionnamespaces.py // last-changed:mbp at s
... ourcefrog.net-20070119024650-o12ekgnjski2v3ed
--- bzrlib/tests/test_revisionnamespaces.py
+++ bzrlib/tests/test_revisionnamespaces.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2005, 2006 Canonical Ltd
+# Copyright (C) 2004, 2005, 2006, 2007 Canonical Ltd
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,11 +19,17 @@
 import time
 
 from bzrlib import (
+    bzrdir,
     errors,
+    repository,
     )
 from bzrlib.builtins import merge
 from bzrlib.tests import TestCase, TestCaseWithTransport
-from bzrlib.revisionspec import RevisionSpec, RevisionSpec_revno
+from bzrlib.revisionspec import (
+    RevisionSpec,
+    RevisionSpec_revno,
+    RevisionSpec_tag,
+    )
 
 
 def spec_in_history(spec, branch):
@@ -335,9 +341,28 @@
 
 class TestRevisionSpec_tag(TestRevisionSpec):
     
-    def test_invalid(self):
-        self.assertInvalid('tag:foo', extra='\ntag: namespace registered,'
-                                            ' but not implemented')
+    def make_branch_and_tree(self, relpath):
+        # override format as the default one may not support tags
+        control = bzrdir.BzrDir.create(relpath)
+        repo = repository.RepositoryFormatKnit2().initialize(control)
+        control.create_branch()
+        return control.create_workingtree()
+
+    def test_from_string_tag(self):
+        spec = RevisionSpec.from_string('tag:bzr-0.14')
+        self.assertIsInstance(spec, RevisionSpec_tag)
+        self.assertEqual(spec.spec, 'bzr-0.14')
+
+    def test_lookup_tag(self):
+        self.tree.branch.repository.set_tag('bzr-0.14', 'r1')
+        self.assertInHistoryIs(1, 'r1', 'tag:bzr-0.14')
+
+    def test_failed_lookup(self):
+        # tags that don't exist give a specific message: arguably we should
+        # just give InvalidRevisionSpec but I think this is more helpful
+        self.assertRaises(errors.NoSuchTag,
+            self.get_in_history,
+            'tag:some-random-tag')
 
 
 class TestRevisionSpec_date(TestRevisionSpec):

=== modified directory  // last-changed:mbp at sourcefrog.net-20070121124213-8ksq9
... 2nrm3tzn6s9
# revision id: mbp at sourcefrog.net-20070121124213-8ksq92nrm3tzn6s9
# sha1: 59b3806f8d9e560ac1ff0a90b81d05e4f7ce942e
# inventory sha1: 0baceb0134e421d5bda775fcf44ba04f4c2d5313
# parent ids:
#   mbp at sourcefrog.net-20070121085653-ptonrp6w7ini27un
# base id: pqm at pqm.ubuntu.com-20070103022432-334b367262bc7407
# properties:
#   branch-nick: tags

# message:
#   Add Repository.copy_tags_to
# committer: Martin Pool <mbp at sourcefrog.net>
# date: Sun 2007-01-21 19:56:53.016000032 +1100

=== modified file bzrlib/repository.py // encoding:base64
LS0tIGJ6cmxpYi9yZXBvc2l0b3J5LnB5CisrKyBienJsaWIvcmVwb3NpdG9yeS5weQpAQCAtODcz
LDYgKzg3MywxNyBAQAogICAgIGRlZiBnZXRfdGFnX2RpY3Qoc2VsZik6CiAgICAgICAgIHJldHVy
biBzZWxmLl90YWdfc3RvcmUuZ2V0X3RhZ19kaWN0KCkKIAorICAgIGRlZiBfc2V0X3RhZ19kaWN0
KHNlbGYsIG5ld19kaWN0KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RhZ19zdG9yZS5fc2V0X3Rh
Z19kaWN0KG5ld19kaWN0KQorCisgICAgZGVmIGNvcHlfdGFnc190byhzZWxmLCB0b19yZXBvc2l0
b3J5KToKKyAgICAgICAgIiIiQ29weSB0YWdzIHRvIGFub3RoZXIgcmVwb3NpdG9yeS4KKworICAg
ICAgICBTdWJjbGFzc2VzIHNob3VsZCBub3Qgb3ZlcnJpZGUgdGhpcywgYnV0IHJhdGhlciBjdXN0
b21pemUgY29weWluZyAKKyAgICAgICAgdGhyb3VnaCB0aGUgSW50ZXJSZXBvc2l0b3J5IG1lY2hh
bmlzbS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBJbnRlclJlcG9zaXRvcnkuZ2V0KHNl
bGYsIHRvX3JlcG9zaXRvcnkpLmNvcHlfdGFncygpCisKIAogY2xhc3MgQWxsSW5PbmVSZXBvc2l0
b3J5KFJlcG9zaXRvcnkpOgogICAgICIiIkxlZ2FjeSBzdXBwb3J0IC0gdGhlIHJlcG9zaXRvcnkg
YmVoYXZpb3VyIGZvciBhbGwtaW4tb25lIGJyYW5jaGVzLiIiIgpAQCAtMTk4Nyw2ICsxOTk4LDE3
IEBACiAgICAgICAgICMgdGhhdCB3ZSd2ZSBkZWNpZGVkIHdlIG5lZWQuCiAgICAgICAgIHJldHVy
biBbcmV2X2lkIGZvciByZXZfaWQgaW4gc291cmNlX2lkcyBpZiByZXZfaWQgaW4gcmVzdWx0X3Nl
dF0KIAorICAgIGRlZiBjb3B5X3RhZ3Moc2VsZik6CisgICAgICAgICIiIkNvcHkgYWxsIHRhZ3Mg
ZnJvbSBzb3VyY2UgdG8gdGhlIHRhcmdldC4iIiIKKyAgICAgICAgIyBBIGRlZmF1bHQgaW1wbGVt
ZW50YXRpb24gaXMgcHJvdmlkZWQgZXZlbiB0aG91Z2ggbm90IGFsbAorICAgICAgICAjIFJlcG9z
aXRvcmllcyB3aWxsIHN1cHBvcnQgdGFncy4uLiB3ZSdsbCBqdXN0IGdldCBhbiBlcnJvciBiYWNr
IGZyb20KKyAgICAgICAgIyB0aGUgdW5kZXJseWluZyBtZXRob2QuCisgICAgICAgIHNlbGYudGFy
Z2V0LmxvY2tfd3JpdGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRhcmdldC5f
c2V0X3RhZ19kaWN0KHNlbGYuc291cmNlLmdldF90YWdfZGljdCgpKQorICAgICAgICBmaW5hbGx5
OgorICAgICAgICAgICAgc2VsZi50YXJnZXQudW5sb2NrKCkKKwogCiBjbGFzcyBJbnRlclNhbWVE
YXRhUmVwb3NpdG9yeShJbnRlclJlcG9zaXRvcnkpOgogICAgICIiIkNvZGUgZm9yIGNvbnZlcnRp
bmcgYmV0d2VlbiByZXBvc2l0b3JpZXMgdGhhdCByZXByZXNlbnQgdGhlIHNhbWUgZGF0YS4KCg==

=== modified file bzrlib/tests/repository_implementations/test_tags.py // encod
... ing:base64
LS0tIGJ6cmxpYi90ZXN0cy9yZXBvc2l0b3J5X2ltcGxlbWVudGF0aW9ucy90ZXN0X3RhZ3MucHkK
KysrIGJ6cmxpYi90ZXN0cy9yZXBvc2l0b3J5X2ltcGxlbWVudGF0aW9ucy90ZXN0X3RhZ3MucHkK
QEAgLTc1LDYgKzc1LDE0IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwo
ImRpZG4ndCBnZXQgZXhwZWN0ZWQgZXhjZXB0aW9uIikKIAorICAgIGRlZiB0ZXN0X2NvcHlfdGFn
cyhzZWxmKToKKyAgICAgICAgcmVwbzEgPSBzZWxmLm1ha2VfcmVwb3NpdG9yeSgncmVwbzEnKQor
ICAgICAgICByZXBvMiA9IHNlbGYubWFrZV9yZXBvc2l0b3J5KCdyZXBvMicpCisgICAgICAgIHJl
cG8xLnNldF90YWcoJ3RhZ25hbWUnLCAncmV2aWQnKQorICAgICAgICByZXBvMS5jb3B5X3RhZ3Nf
dG8ocmVwbzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlcG8yLmxvb2t1cF90YWcoJ3Rh
Z25hbWUnKSwgJ3JldmlkJykKKworCiAKIGNsYXNzIFRlc3RVbnN1cHBvcnRlZFRhZ3MoVGVzdENh
c2VXaXRoUmVwb3NpdG9yeSk6CiAgICAgIiIiRm9ybWF0cyB0aGF0IGRvbid0IHN1cHBvcnQgdGFn
cyBzaG91bGQgZ2l2ZSByZWFzb25hYmxlIGVycm9ycy4iIiIKCg==

=== modified directory  // last-changed:mbp at sourcefrog.net-20070121085653-ptonr
... p6w7ini27un
# revision id: mbp at sourcefrog.net-20070121085653-ptonrp6w7ini27un
# sha1: f04c5877c1dbe998543bc88b466847d5a123c8e5
# inventory sha1: 81ebcdf028ec728b88c51af363ef4fa12d6ac089
# parent ids:
#   mbp at sourcefrog.net-20070119084751-zcoq7c4t7yockec1
# properties:
#   branch-nick: tags

# message:
#   Add tag -r option
# committer: Martin Pool <mbp at sourcefrog.net>
# date: Fri 2007-01-19 19:47:51.206000090 +1100

=== modified file bzrlib/builtins.py // encoding:base64
LS0tIGJ6cmxpYi9idWlsdGlucy5weQorKysgYnpybGliL2J1aWx0aW5zLnB5CkBAIC0zMDA0LDE3
ICszMDA0LDIzIEBACiAgICAgICAgICAgICBzaG9ydF9uYW1lPSdkJywKICAgICAgICAgICAgIHR5
cGU9dW5pY29kZSwKICAgICAgICAgICAgICksCisgICAgICAgICdyZXZpc2lvbicsCiAgICAgICAg
IF0KIAotICAgIGRlZiBydW4oc2VsZiwgdGFnX25hbWUsIGRpcmVjdG9yeT0nLicpOgorICAgIGRl
ZiBydW4oc2VsZiwgdGFnX25hbWUsIGRpcmVjdG9yeT0nLicsIHJldmlzaW9uPU5vbmUpOgogICAg
ICAgICBicmFuY2gsIHJlbHBhdGggPSBCcmFuY2gub3Blbl9jb250YWluaW5nKGRpcmVjdG9yeSkK
LSAgICAgICAgcmV2aXNpb25faWQgPSBicmFuY2gubGFzdF9yZXZpc2lvbigpCisgICAgICAgIGlm
IHJldmlzaW9uOgorICAgICAgICAgICAgaWYgbGVuKHJldmlzaW9uKSAhPSAxOgorICAgICAgICAg
ICAgICAgIHJhaXNlIGVycm9ycy5CenJDb21tYW5kRXJyb3IoCisgICAgICAgICAgICAgICAgICAg
ICJUYWdzIGNhbiBvbmx5IGJlIHBsYWNlZCBvbiBhIHNpbmdsZSByZXZpc2lvbiwgIgorICAgICAg
ICAgICAgICAgICAgICAibm90IG9uIGEgcmFuZ2UiKQorICAgICAgICAgICAgcmV2aXNpb25faWQg
PSByZXZpc2lvblswXS5pbl9oaXN0b3J5KGJyYW5jaCkucmV2X2lkCisgICAgICAgIGVsc2U6Cisg
ICAgICAgICAgICByZXZpc2lvbl9pZCA9IGJyYW5jaC5sYXN0X3JldmlzaW9uKCkKICAgICAgICAg
YnJhbmNoLnJlcG9zaXRvcnkuc2V0X3RhZyh0YWdfbmFtZSwgcmV2aXNpb25faWQpCiAgICAgICAg
IHNlbGYub3V0Zi53cml0ZSgnY3JlYXRlZCB0YWcgJXMnICUgdGFnX25hbWUpCiAKIAotCi0KICMg
Y29tbWFuZC1saW5lIGludGVycHJldGF0aW9uIGhlbHBlciBmb3IgbWVyZ2UtcmVsYXRlZCBjb21t
YW5kcwogZGVmIF9tZXJnZV9oZWxwZXIob3RoZXJfcmV2aXNpb24sIGJhc2VfcmV2aXNpb24sCiAg
ICAgICAgICAgICAgICAgICBjaGVja19jbGVhbj1UcnVlLCBpZ25vcmVfemVybz1GYWxzZSwKCg==

=== modified file bzrlib/tests/blackbox/test_tags.py // encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy9ibGFja2JveC90ZXN0X3RhZ3MucHkKKysrIGJ6cmxpYi90ZXN0cy9i
bGFja2JveC90ZXN0X3RhZ3MucHkKQEAgLTM3LDkgKzM3LDEyIEBACiAgICAgICAgIG91dCwgZXJy
ID0gc2VsZi5ydW5fYnpyX2NhcHR1cmVkKFsnaGVscCcsICd0YWcnXSkKICAgICAgICAgc2VsZi5h
c3NlcnRDb250YWluc1JlKG91dCwgJ0NyZWF0ZSBhIHRhZycpCiAKKyAgICBkZWYgdGVzdF9jYW5u
b3RfdGFnX3JhbmdlKHNlbGYpOgorICAgICAgICBvdXQsIGVyciA9IHNlbGYucnVuX2J6cigndGFn
JywgJy1yMS4uMTAnLCAnbmFtZScsIHJldGNvZGU9MykKKyAgICAgICAgc2VsZi5hc3NlcnRDb250
YWluc1JlKGVyciwKKyAgICAgICAgICAgICJUYWdzIGNhbiBvbmx5IGJlIHBsYWNlZCBvbiBhIHNp
bmdsZSByZXZpc2lvbiIpCisKICAgICBkZWYgdGVzdF90YWdfY3VycmVudF9yZXYoc2VsZik6Ci0g
ICAgICAgICMjIGIgPSBzZWxmLm1ha2VfYnJhbmNoKCdicmFuY2gnKQotICAgICAgICAjIyBiLnJl
cG9zaXRvcnkudGFnCiAgICAgICAgIHQgPSBzZWxmLm1ha2VfYnJhbmNoX2FuZF90cmVlKCdicmFu
Y2gnKQogICAgICAgICB0LmNvbW1pdChhbGxvd19wb2ludGxlc3M9VHJ1ZSwgbWVzc2FnZT0naW5p
dGlhbCBjb21taXQnLAogICAgICAgICAgICAgcmV2X2lkPSdmaXJzdC1yZXZpZCcpCkBAIC00OSwz
ICs1Miw2IEBACiAgICAgICAgICMgdGFnIHNob3VsZCBiZSBvYnNlcnZhYmxlIHRocm91Z2ggdGhl
IGFwaQogICAgICAgICByZXBvID0gdC5icmFuY2gucmVwb3NpdG9yeQogICAgICAgICBzZWxmLmFz
c2VydEVxdWFscyhyZXBvLmdldF90YWdfZGljdCgpLCBkaWN0KE5FV1RBRz0nZmlyc3QtcmV2aWQn
KSkKKyAgICAgICAgIyBjYW4gYWxzbyBjcmVhdGUgdGFncyB1c2luZyAtcgorICAgICAgICBzZWxm
LnJ1bl9ienIoJ3RhZycsICctZCcsICdicmFuY2gnLCAndGFnMicsICctcjEnKQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFscyhyZXBvLmxvb2t1cF90YWcoJ3RhZzInKSwgJ2ZpcnN0LXJldmlkJykK
Cg==

=== modified directory  // last-changed:mbp at sourcefrog.net-20070119084751-zcoq7
... c4t7yockec1
# revision id: mbp at sourcefrog.net-20070119084751-zcoq7c4t7yockec1
# sha1: ddaf451b74ab740b630c6802947e20e5a60987e1
# inventory sha1: d466919a947e740fba7ffaa0c92fc29e5094d4f4
# parent ids:
#   mbp at sourcefrog.net-20070119083251-tr6zsf024kckx3lb
# properties:
#   branch-nick: tags

# message:
#   Better TagsNotSupported message
# committer: Martin Pool <mbp at sourcefrog.net>
# date: Fri 2007-01-19 19:32:51.721999884 +1100

=== modified file bzrlib/errors.py // encoding:base64
LS0tIGJ6cmxpYi9lcnJvcnMucHkKKysrIGJ6cmxpYi9lcnJvcnMucHkKQEAgLTE2MTQsOCArMTYx
NCw3IEBACiAKIGNsYXNzIFRhZ3NOb3RTdXBwb3J0ZWQoQnpyRXJyb3IpOgogCi0gICAgX2ZtdCA9
ICJUYWdzIG5vdCBzdXBwb3J0ZWQgYnkgcmVwb3NpdG9yeSBmb3JtYXQgJShyZXBvc2l0b3J5X2Zv
cm1hdClzIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcG9zaXRvcnlfZm9ybWF0KToKLSAg
ICAgICAgc2VsZi5yZXBvc2l0b3J5X2Zvcm1hdCA9IHJlcG9zaXRvcnlfZm9ybWF0Ci0KKyAgICBf
Zm10ID0gIlRhZ3Mgbm90IHN1cHBvcnRlZCBieSByZXBvc2l0b3J5ICUocmVwb3NpdG9yeSlzIgor
CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcG9zaXRvcnkpOgorICAgICAgICBzZWxmLnJlcG9z
aXRvcnkgPSByZXBvc2l0b3J5Cgo=

=== modified directory  // last-changed:mbp at sourcefrog.net-20070119083251-tr6zs
... f024kckx3lb
# revision id: mbp at sourcefrog.net-20070119083251-tr6zsf024kckx3lb
# sha1: 1802dc7a67b6526332a0208da830d9bd93aa8043
# inventory sha1: d246e24ab229e2157f2ebf5a144dfa87e9f59c85
# parent ids:
#   mbp at sourcefrog.net-20070119083142-s0ukxl1znp363xfr
# properties:
#   branch-nick: tags

# message:
#   Repositories which don't support tags now give a better message
# committer: Martin Pool <mbp at sourcefrog.net>
# date: Fri 2007-01-19 19:31:42.723000050 +1100

=== modified file bzrlib/errors.py // encoding:base64
LS0tIGJ6cmxpYi9lcnJvcnMucHkKKysrIGJ6cmxpYi9lcnJvcnMucHkKQEAgLTE2MTAsMyArMTYx
MCwxMiBAQAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhZ19uYW1lKToKICAgICAgICAgc2Vs
Zi50YWdfbmFtZSA9IHRhZ19uYW1lCisKKworY2xhc3MgVGFnc05vdFN1cHBvcnRlZChCenJFcnJv
cik6CisKKyAgICBfZm10ID0gIlRhZ3Mgbm90IHN1cHBvcnRlZCBieSByZXBvc2l0b3J5IGZvcm1h
dCAlKHJlcG9zaXRvcnlfZm9ybWF0KXMiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVwb3Np
dG9yeV9mb3JtYXQpOgorICAgICAgICBzZWxmLnJlcG9zaXRvcnlfZm9ybWF0ID0gcmVwb3NpdG9y
eV9mb3JtYXQKKwoK

=== modified file bzrlib/tests/repository_implementations/test_tags.py // encod
... ing:base64
LS0tIGJ6cmxpYi90ZXN0cy9yZXBvc2l0b3J5X2ltcGxlbWVudGF0aW9ucy90ZXN0X3RhZ3MucHkK
KysrIGJ6cmxpYi90ZXN0cy9yZXBvc2l0b3J5X2ltcGxlbWVudGF0aW9ucy90ZXN0X3RhZ3MucHkK
QEAgLTc1LDMgKzc1LDMwIEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwo
ImRpZG4ndCBnZXQgZXhwZWN0ZWQgZXhjZXB0aW9uIikKIAorCitjbGFzcyBUZXN0VW5zdXBwb3J0
ZWRUYWdzKFRlc3RDYXNlV2l0aFJlcG9zaXRvcnkpOgorICAgICIiIkZvcm1hdHMgdGhhdCBkb24n
dCBzdXBwb3J0IHRhZ3Mgc2hvdWxkIGdpdmUgcmVhc29uYWJsZSBlcnJvcnMuIiIiCisKKyAgICBk
ZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZtdCA9IHNlbGYucmVwb3NpdG9yeV9mb3JtYXQKKyAg
ICAgICAgc3VwcG9ydGVkID0gZ2V0YXR0cihmbXQsICdzdXBwb3J0c190YWdzJykKKyAgICAgICAg
aWYgc3VwcG9ydGVkIGlzIE5vbmU6CisgICAgICAgICAgICB3YXJuKCJGb3JtYXQgJXMgZG9lc24n
dCBkZWNsYXJlIHdoZXRoZXIgaXQgc3VwcG9ydHMgdGFncyBvciBub3QiCisgICAgICAgICAgICAg
ICAgICUgZm10KQorICAgICAgICAgICAgcmFpc2UgVGVzdFNraXBwZWQoJ05vIHRhZyBzdXBwb3J0
IGF0IGFsbCcpCisgICAgICAgIGlmIHN1cHBvcnRlZCgpOgorICAgICAgICAgICAgcmFpc2UgVGVz
dFNraXBwZWQoIkZvcm1hdCAlcyBkZWNsYXJlcyB0aGF0IHRhZ3MgYXJlIHN1cHBvcnRlZCIKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgZm10KQorICAgICAgICAgICAgIyBpdCdzIGNv
dmVyZWQgYnkgVGVzdFJlcG9zaXRvcnlUYWdzCisgICAgICAgIFRlc3RDYXNlV2l0aFJlcG9zaXRv
cnkuc2V0VXAoc2VsZikKKyAgICAKKyAgICBkZWYgdGVzdF90YWdfbWV0aG9kc19yYWlzZShzZWxm
KToKKyAgICAgICAgcmVwbyA9IHNlbGYubWFrZV9yZXBvc2l0b3J5KCdyZXBvJykKKyAgICAgICAg
c2VsZi5hc3NlcnRSYWlzZXMoZXJyb3JzLlRhZ3NOb3RTdXBwb3J0ZWQsCisgICAgICAgICAgICBy
ZXBvLnNldF90YWcsICdmb28nLCAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJy
b3JzLlRhZ3NOb3RTdXBwb3J0ZWQsCisgICAgICAgICAgICByZXBvLmxvb2t1cF90YWcsICdmb28n
KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhlcnJvcnMuVGFnc05vdFN1cHBvcnRlZCwKKyAg
ICAgICAgICAgIHJlcG8uc2V0X3RhZywgJ2ZvbycsICdiYXInKQorCisKCg==

=== modified directory  // last-changed:mbp at sourcefrog.net-20070119083142-s0ukx
... l1znp363xfr
# revision id: mbp at sourcefrog.net-20070119083142-s0ukxl1znp363xfr
# sha1: 0494ae8f5671edfa0d949735fc1b716e36ed2960
# inventory sha1: 81a5c173827f9f95e79d9f5e02b34a1a859c2695
# parent ids:
#   mbp at sourcefrog.net-20070119024650-o12ekgnjski2v3ed
# properties:
#   branch-nick: tags

# message:
#   Add tag: revision namespace.
#   
#   Change make_tag to set_tag
#   
#   Add Branch.lookup_tag (defers to Branch.lookup_tag) for simplicity of callers,
#   and possibly to help formats where it's better to look up by branch.
#   
#   Factor out RevisionInfo.from_revision_id
#   
#   Separate tag storage into a _TagStore strategy within the Repository, 
#   so they can be reused across formats.
#   
# committer: Martin Pool <mbp at sourcefrog.net>
# date: Fri 2007-01-19 13:46:50.631999969 +1100

=== modified file bzrlib/branch.py // encoding:base64
LS0tIGJ6cmxpYi9icmFuY2gucHkKKysrIGJ6cmxpYi9icmFuY2gucHkKQEAgLTEsNCArMSw0IEBA
Ci0jIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBDYW5vbmljYWwgTHRkCisjIENvcHlyaWdodCAo
QykgMjAwNSwgMjAwNiwgMjAwNyBDYW5vbmljYWwgTHRkCiAjCiAjIFRoaXMgcHJvZ3JhbSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAjIGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5Cgo=

=== modified file bzrlib/builtins.py // encoding:base64
LS0tIGJ6cmxpYi9idWlsdGlucy5weQorKysgYnpybGliL2J1aWx0aW5zLnB5CkBAIC0zMDA5LDcg
KzMwMDksNyBAQAogICAgIGRlZiBydW4oc2VsZiwgdGFnX25hbWUsIGRpcmVjdG9yeT0nLicpOgog
ICAgICAgICBicmFuY2gsIHJlbHBhdGggPSBCcmFuY2gub3Blbl9jb250YWluaW5nKGRpcmVjdG9y
eSkKICAgICAgICAgcmV2aXNpb25faWQgPSBicmFuY2gubGFzdF9yZXZpc2lvbigpCi0gICAgICAg
IGJyYW5jaC5yZXBvc2l0b3J5Lm1ha2VfdGFnKHRhZ19uYW1lLCByZXZpc2lvbl9pZCkKKyAgICAg
ICAgYnJhbmNoLnJlcG9zaXRvcnkuc2V0X3RhZyh0YWdfbmFtZSwgcmV2aXNpb25faWQpCiAgICAg
ICAgIHNlbGYub3V0Zi53cml0ZSgnY3JlYXRlZCB0YWcgJXMnICUgdGFnX25hbWUpCiAKIAoK

=== modified file bzrlib/repository.py // encoding:base64
LS0tIGJ6cmxpYi9yZXBvc2l0b3J5LnB5CisrKyBienJsaWIvcmVwb3NpdG9yeS5weQpAQCAtNzEs
NiArNzEsOTEgQEAKIF9kZXByZWNhdGlvbl93YXJuaW5nX2RvbmUgPSBGYWxzZQogCiAKKyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMKKyMgdGFnIHN0b3JhZ2UKKworCitjbGFzcyBfVGFnU3RvcmUob2JqZWN0KToKKyAg
ICBkZWYgX19pbml0X18oc2VsZiwgcmVwb3NpdG9yeSk6CisgICAgICAgIHNlbGYucmVwb3NpdG9y
eSA9IHJlcG9zaXRvcnkKKworY2xhc3MgX0Rpc2FibGVkVGFnU3RvcmUoX1RhZ1N0b3JlKToKKyAg
ICAiIiJUYWcgc3RvcmFnZSB0aGF0IHJlZnVzZXMgdG8gc3RvcmUgYW55dGhpbmcuCisKKyAgICBU
aGlzIGlzIHVzZWQgYnkgb2xkZXIgZm9ybWF0cyB0aGF0IGNhbid0IHN0b3JlIHRhZ3MuCisgICAg
IiIiCisKKyAgICBkZWYgX25vdF9zdXBwb3J0ZWQoc2VsZiwgKmEsICoqayk6CisgICAgICAgIHJh
aXNlIGVycm9ycy5UYWdzTm90U3VwcG9ydGVkKHNlbGYucmVwb3NpdG9yeSkKKworICAgIHNldF90
YWcgPSBfbm90X3N1cHBvcnRlZAorCisKK2NsYXNzIF9CYXNpY1RhZ1N0b3JlKF9UYWdTdG9yZSk6
CisgICAgIiIiVGFnIHN0b3JhZ2UgaW4gYW4gdW52ZXJzaW9uZWQgcmVwb3NpdG9yeSBjb250cm9s
IGZpbGUuCisgICAgIiIiCisKKyAgICBkZWYgc2V0X3RhZyhzZWxmLCB0YWdfbmFtZSwgdGFnX3Rh
cmdldCk6CisgICAgICAgICIiIkFkZCBhIHRhZyBkZWZpbml0aW9uIHRvIHRoZSByZXBvc2l0b3J5
LgorCisgICAgICAgIEJlaGF2aW91ciBpZiB0aGUgdGFnIGlzIGFscmVhZHkgcHJlc2VudCBpcyBu
b3QgZGVmaW5lZCAoeWV0KS4KKyAgICAgICAgIiIiCisgICAgICAgICMgYWxsIGRvbmUgd2l0aCBh
IHdyaXRlIGxvY2sgaGVsZCwgc28gdGhpcyBsb29rcyBhdG9taWMKKyAgICAgICAgc2VsZi5yZXBv
c2l0b3J5LmxvY2tfd3JpdGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZCA9IHNlbGYu
Z2V0X3RhZ19kaWN0KCkKKyAgICAgICAgICAgIHRkW3RhZ19uYW1lXSA9IHRhZ190YXJnZXQKKyAg
ICAgICAgICAgIHNlbGYuX3NldF90YWdfZGljdCh0ZCkKKyAgICAgICAgZmluYWxseToKKyAgICAg
ICAgICAgIHNlbGYucmVwb3NpdG9yeS51bmxvY2soKQorCisgICAgZGVmIGxvb2t1cF90YWcoc2Vs
ZiwgdGFnX25hbWUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHJlZmVyZW50IHN0cmluZyBvZiBh
IHRhZyIiIgorICAgICAgICB0ZCA9IHNlbGYuZ2V0X3RhZ19kaWN0KCkKKyAgICAgICAgdHJ5Ogor
ICAgICAgICAgICAgcmV0dXJuIHRkW3RhZ19uYW1lXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6
CisgICAgICAgICAgICByYWlzZSBlcnJvcnMuTm9TdWNoVGFnKHRhZ19uYW1lKQorCisgICAgZGVm
IGdldF90YWdfZGljdChzZWxmKToKKyAgICAgICAgc2VsZi5yZXBvc2l0b3J5LmxvY2tfcmVhZCgp
CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhZ19jb250ZW50ID0gc2VsZi5yZXBvc2l0b3J5
LmNvbnRyb2xfZmlsZXMuZ2V0X3V0ZjgoJ3RhZ3MnKS5yZWFkKCkKKyAgICAgICAgICAgIHJldHVy
biBzZWxmLl9kZXNlcmlhbGl6ZV90YWdfZGljdCh0YWdfY29udGVudCkKKyAgICAgICAgZmluYWxs
eToKKyAgICAgICAgICAgIHNlbGYucmVwb3NpdG9yeS51bmxvY2soKQorCisgICAgZGVmIF9zZXRf
dGFnX2RpY3Qoc2VsZiwgbmV3X2RpY3QpOgorICAgICAgICAiIiJSZXBsYWNlIGFsbCB0YWcgZGVm
aW5pdGlvbnMKKworICAgICAgICA6cGFyYW0gbmV3X2RpY3Q6IERpY3Rpb25hcnkgZnJvbSB0YWcg
bmFtZSB0byB0YXJnZXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJlcG9zaXRvcnkubG9j
a19yZWFkKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5yZXBvc2l0b3J5LmNvbnRy
b2xfZmlsZXMucHV0X3V0ZjgoJ3RhZ3MnLAorICAgICAgICAgICAgICAgIHNlbGYuX3NlcmlhbGl6
ZV90YWdfZGljdChuZXdfZGljdCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxm
LnJlcG9zaXRvcnkudW5sb2NrKCkKKworICAgIGRlZiBfc2VyaWFsaXplX3RhZ19kaWN0KHNlbGYs
IHRhZ19kaWN0KToKKyAgICAgICAgcyA9IFtdCisgICAgICAgIGZvciB0YWcsIHRhcmdldCBpbiBz
b3J0ZWQodGFnX2RpY3QuaXRlbXMoKSk6CisgICAgICAgICAgICAjIFRPRE86IGNoZWNrIHRoYXQg
dGFnIG5hbWVzIGFuZCB0YXJnZXRzIGFyZSBhY2NlcHRhYmxlCisgICAgICAgICAgICBzLmFwcGVu
ZCh0YWcgKyAnXHQnICsgdGFyZ2V0ICsgJ1xuJykKKyAgICAgICAgcmV0dXJuICcnLmpvaW4ocykK
KworICAgIGRlZiBfZGVzZXJpYWxpemVfdGFnX2RpY3Qoc2VsZiwgdGFnX2NvbnRlbnQpOgorICAg
ICAgICAiIiJDb252ZXJ0IHRoZSB0YWcgZmlsZSBpbnRvIGEgZGljdGlvbmFyeSBvZiB0YWdzIiIi
CisgICAgICAgIGQgPSB7fQorICAgICAgICBmb3IgbCBpbiB0YWdfY29udGVudC5zcGxpdGxpbmVz
KCk6CisgICAgICAgICAgICB0YWcsIHRhcmdldCA9IGwuc3BsaXQoJ1x0JywgMSkKKyAgICAgICAg
ICAgIGRbdGFnXSA9IHRhcmdldAorICAgICAgICByZXR1cm4gZAorCisKKyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMK
KyMgUmVwb3NpdG9yaWVzCisKIGNsYXNzIFJlcG9zaXRvcnkob2JqZWN0KToKICAgICAiIiJSZXBv
c2l0b3J5IGhvbGRpbmcgaGlzdG9yeSBmb3Igb25lIG9yIG1vcmUgYnJhbmNoZXMuCiAKQEAgLTgz
LDYgKzE2OCw5IEBACiAgICAgcmVtb3RlKSBkaXNrLgogICAgICIiIgogCisgICAgIyBvdmVycmlk
ZSB0aGlzIHRvIHNldCB0aGUgc3RyYXRlZ3kgZm9yIHN0b3JpbmcgdGFncworICAgIF90YWdfc3Rv
cmVfY2xhc3MgPSBfRGlzYWJsZWRUYWdTdG9yZQorCiAgICAgX2ZpbGVfaWRzX2FsdGVyZWRfcmVn
ZXggPSBsYXp5X3JlZ2V4LmxhenlfY29tcGlsZSgKICAgICAgICAgcidmaWxlX2lkPSIoP1A8Zmls
ZV9pZD5bXiJdKykiJwogICAgICAgICByJy4qcmV2aXNpb249Iig/UDxyZXZpc2lvbl9pZD5bXiJd
KykiJwpAQCAtMjIyLDYgKzMxMCw3IEBACiAgICAgICAgICMgb24gd2hldGhlciBlc2NhcGluZyBp
cyByZXF1aXJlZC4KICAgICAgICAgc2VsZi5fd2Fybl9pZl9kZXByZWNhdGVkKCkKICAgICAgICAg
c2VsZi5fc2VyaWFsaXplciA9IHhtbDUuc2VyaWFsaXplcl92NQorICAgICAgICBzZWxmLl90YWdf
c3RvcmUgPSBzZWxmLl90YWdfc3RvcmVfY2xhc3Moc2VsZikKIAogICAgIGRlZiBfX3JlcHJfXyhz
ZWxmKToKICAgICAgICAgcmV0dXJuICclcyglciknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9f
LCAKQEAgLTc3NSw2ICs4NjQsMTUgQEAKICAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVu
Y29kZUVycm9yOgogICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvcnMuTm9uQXNjaWlSZXZp
c2lvbklkKG1ldGhvZCwgc2VsZikKIAorICAgIGRlZiBzZXRfdGFnKHNlbGYsIHRhZ19uYW1lLCB0
YWdfdGFyZ2V0KToKKyAgICAgICAgc2VsZi5fdGFnX3N0b3JlLnNldF90YWcodGFnX25hbWUsIHRh
Z190YXJnZXQpCisKKyAgICBkZWYgbG9va3VwX3RhZyhzZWxmLCB0YWdfbmFtZSk6CisgICAgICAg
IHJldHVybiBzZWxmLl90YWdfc3RvcmUubG9va3VwX3RhZyh0YWdfbmFtZSkKKworICAgIGRlZiBn
ZXRfdGFnX2RpY3Qoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90YWdfc3RvcmUuZ2V0X3Rh
Z19kaWN0KCkKKwogCiBjbGFzcyBBbGxJbk9uZVJlcG9zaXRvcnkoUmVwb3NpdG9yeSk6CiAgICAg
IiIiTGVnYWN5IHN1cHBvcnQgLSB0aGUgcmVwb3NpdG9yeSBiZWhhdmlvdXIgZm9yIGFsbC1pbi1v
bmUgYnJhbmNoZXMuIiIiCkBAIC0xMDkzLDYgKzExOTEsOCBAQAogICAgICMgY29ycmVzcG9uZHMg
dG8gUmVwb3NpdG9yeUZvcm1hdEtuaXQyCiAgICAgCiAgICAgIyBUT0RPOiB3aXRoaW4gYSBsb2Nr
IHNjb3BlLCB3ZSBjb3VsZCBrZWVwIHRoZSB0YWdzIGluIG1lbW9yeS4uLgorICAgIAorICAgIF90
YWdfc3RvcmVfY2xhc3MgPSBfQmFzaWNUYWdTdG9yZQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYs
IF9mb3JtYXQsIGFfYnpyZGlyLCBjb250cm9sX2ZpbGVzLCBfcmV2aXNpb25fc3RvcmUsCiAgICAg
ICAgICAgICAgICAgIGNvbnRyb2xfc3RvcmUsIHRleHRfc3RvcmUpOgpAQCAtMTEzOCwzOCArMTIz
OCw5IEBACiAgICAgICAgIHJldHVybiBSb290Q29tbWl0QnVpbGRlcihzZWxmLCBwYXJlbnRzLCBj
b25maWcsIHRpbWVzdGFtcCwgdGltZXpvbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb21taXR0ZXIsIHJldnByb3BzLCByZXZpc2lvbl9pZCkKIAotICAgIEBuZWVkc19yZWFk
X2xvY2sKLSAgICBkZWYgZ2V0X3RhZ19kaWN0KHNlbGYpOgotICAgICAgICB0YWdfY29udGVudCA9
IHNlbGYuY29udHJvbF9maWxlcy5nZXRfdXRmOCgndGFncycpLnJlYWQoKQotICAgICAgICByZXR1
cm4gc2VsZi5fZm9ybWF0Ll9kZXNlcmlhbGl6ZV90YWdfZGljdCh0YWdfY29udGVudCkKLQotICAg
IEBuZWVkc193cml0ZV9sb2NrCi0gICAgZGVmIF9zZXRfdGFnX2RpY3Qoc2VsZiwgbmV3X2RpY3Qp
OgotICAgICAgICAiIiJSZXBsYWNlIGFsbCB0YWcgZGVmaW5pdGlvbnMKLQotICAgICAgICA6cGFy
YW0gbmV3X2RpY3Q6IERpY3Rpb25hcnkgZnJvbSB0YWcgbmFtZSB0byB0YXJnZXQuCi0gICAgICAg
ICIiIgotICAgICAgICBzZWxmLmNvbnRyb2xfZmlsZXMucHV0X3V0ZjgoJ3RhZ3MnLCBzZWxmLl9m
b3JtYXQuX3NlcmlhbGl6ZV90YWdfZGljdChuZXdfZGljdCkpCi0KLSAgICBAbmVlZHNfd3JpdGVf
bG9jawotICAgIGRlZiBtYWtlX3RhZyhzZWxmLCB0YWdfbmFtZSwgdGFnX3RhcmdldCk6Ci0gICAg
ICAgICIiIkFkZCBhIHRhZyBkZWZpbml0aW9uIHRvIHRoZSByZXBvc2l0b3J5LgotCi0gICAgICAg
IEJlaGF2aW91ciBpZiB0aGUgdGFnIGlzIGFscmVhZHkgcHJlc2VudCBpcyBub3QgZGVmaW5lZCAo
eWV0KS4KLSAgICAgICAgIiIiCi0gICAgICAgICMgYWxsIGRvbmUgd2l0aCBhIHdyaXRlIGxvY2sg
aGVsZCwgc28gdGhpcyBsb29rcyBhdG9taWMKLSAgICAgICAgdGQgPSBzZWxmLmdldF90YWdfZGlj
dCgpCi0gICAgICAgIHRkW3RhZ19uYW1lXSA9IHRhZ190YXJnZXQKLSAgICAgICAgc2VsZi5fc2V0
X3RhZ19kaWN0KHRkKQotCi0gICAgZGVmIGxvb2t1cF90YWcoc2VsZiwgdGFnX25hbWUpOgotICAg
ICAgICAiIiJSZXR1cm4gdGhlIHJlZmVyZW50IHN0cmluZyBvZiBhIHRhZyIiIgotICAgICAgICB0
ZCA9IHNlbGYuZ2V0X3RhZ19kaWN0KCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJu
IHRkW3RhZ19uYW1lXQotICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICByYWlz
ZSBlcnJvcnMuTm9TdWNoVGFnKHRhZ19uYW1lKQotCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZXBvc2l0
b3J5IEZvcm1hdHMKIAogY2xhc3MgUmVwb3NpdG9yeUZvcm1hdChvYmplY3QpOgogICAgICIiIkEg
cmVwb3NpdG9yeSBmb3JtYXQuCkBAIC0xODQ1LDIxICsxOTE2LDYgQEAKICAgICBkZWYgc3VwcG9y
dHNfdGFncyhzZWxmKToKICAgICAgICAgcmV0dXJuIFRydWUKIAotICAgIGRlZiBfc2VyaWFsaXpl
X3RhZ19kaWN0KHNlbGYsIHRhZ19kaWN0KToKLSAgICAgICAgcyA9IFtdCi0gICAgICAgIGZvciB0
YWcsIHRhcmdldCBpbiBzb3J0ZWQodGFnX2RpY3QuaXRlbXMoKSk6Ci0gICAgICAgICAgICAjIFRP
RE86IGNoZWNrIHRoYXQgdGFnIG5hbWVzIGFuZCB0YXJnZXRzIGFyZSBhY2NlcHRhYmxlCi0gICAg
ICAgICAgICBzLmFwcGVuZCh0YWcgKyAnXHQnICsgdGFyZ2V0ICsgJ1xuJykKLSAgICAgICAgcmV0
dXJuICcnLmpvaW4ocykKLQotICAgIGRlZiBfZGVzZXJpYWxpemVfdGFnX2RpY3Qoc2VsZiwgdGFn
X2NvbnRlbnQpOgotICAgICAgICAiIiJDb252ZXJ0IHRoZSB0YWcgZmlsZSBpbnRvIGEgZGljdGlv
bmFyeSBvZiB0YWdzIiIiCi0gICAgICAgIGQgPSB7fQotICAgICAgICBmb3IgbCBpbiB0YWdfY29u
dGVudC5zcGxpdGxpbmVzKCk6Ci0gICAgICAgICAgICB0YWcsIHRhcmdldCA9IGwuc3BsaXQoJ1x0
JywgMSkKLSAgICAgICAgICAgIGRbdGFnXSA9IHRhcmdldAotICAgICAgICByZXR1cm4gZAotCiAK
IAogIyBmb3JtYXRzIHdoaWNoIGhhdmUgbm8gZm9ybWF0IHN0cmluZyBhcmUgbm90IGRpc2NvdmVy
YWJsZQoK

=== modified file bzrlib/revisionspec.py // encoding:base64
LS0tIGJ6cmxpYi9yZXZpc2lvbnNwZWMucHkKKysrIGJ6cmxpYi9yZXZpc2lvbnNwZWMucHkKQEAg
LTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAoQykgMjAwNSBDYW5vbmljYWwgTHRkCisjIENvcHly
aWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNyBDYW5vbmljYWwgTHRkCiAjCiAjIFRoaXMgcHJvZ3Jh
bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5
CiAjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5CkBAIC05Myw2ICs5MywxOCBAQAogICAgICAgICByZXR1cm4gJzxienJs
aWIucmV2aXNpb25zcGVjLlJldmlzaW9uSW5mbyBvYmplY3QgJXMsICVzIGZvciAlcj4nICUgKAog
ICAgICAgICAgICAgc2VsZi5yZXZubywgc2VsZi5yZXZfaWQsIHNlbGYuYnJhbmNoKQogCisgICAg
QHN0YXRpY21ldGhvZAorICAgIGRlZiBmcm9tX3JldmlzaW9uX2lkKGJyYW5jaCwgcmV2aXNpb25f
aWQsIHJldnMpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBSZXZpc2lvbkluZm8gZ2l2ZW4ganVz
dCB0aGUgaWQuCisKKyAgICAgICAgVXNlIHRoaXMgaWYgeW91IGRvbid0IGtub3cgb3IgY2FyZSB3
aGF0IHRoZSByZXZubyBpcy4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAg
IHJldm5vID0gcmV2cy5pbmRleChyZXZpc2lvbl9pZCkgKyAxCisgICAgICAgIGV4Y2VwdCBWYWx1
ZUVycm9yOgorICAgICAgICAgICAgcmV2bm8gPSBOb25lCisgICAgICAgIHJldHVybiBSZXZpc2lv
bkluZm8oYnJhbmNoLCByZXZubywgcmV2aXNpb25faWQpCisKIAogIyBjbGFzc2VzIGluIHRoaXMg
bGlzdCBzaG91bGQgaGF2ZSBhICJwcmVmaXgiIGF0dHJpYnV0ZSwgYWdhaW5zdCB3aGljaAogIyBz
dHJpbmcgc3BlY3MgYXJlIG1hdGNoZWQKQEAgLTM2NSwxMSArMzc3LDcgQEAKICAgICBwcmVmaXgg
PSAncmV2aWQ6JwogCiAgICAgZGVmIF9tYXRjaF9vbihzZWxmLCBicmFuY2gsIHJldnMpOgotICAg
ICAgICB0cnk6Ci0gICAgICAgICAgICByZXZubyA9IHJldnMuaW5kZXgoc2VsZi5zcGVjKSArIDEK
LSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICByZXZubyA9IE5vbmUKLSAg
ICAgICAgcmV0dXJuIFJldmlzaW9uSW5mbyhicmFuY2gsIHJldm5vLCBzZWxmLnNwZWMpCisgICAg
ICAgIHJldHVybiBSZXZpc2lvbkluZm8uZnJvbV9yZXZpc2lvbl9pZChicmFuY2gsIHNlbGYuc3Bl
YywgcmV2cykKIAogU1BFQ19UWVBFUy5hcHBlbmQoUmV2aXNpb25TcGVjX3JldmlkKQogCkBAIC00
NjMsMTYgKzQ3MSwyMSBAQAogCiAKIGNsYXNzIFJldmlzaW9uU3BlY190YWcoUmV2aXNpb25TcGVj
KToKLSAgICAiIiJUbyBiZSBpbXBsZW1lbnRlZC4iIiIKLQotICAgIGhlbHBfdHh0ID0gIiIiVG8g
YmUgaW1wbGVtZW50ZWQuIiIiCisgICAgIiIiU2VsZWN0IGEgcmV2aXNpb24gaWRlbnRpZmllZCBi
eSB0YWcgbmFtZSIiIgorCisgICAgaGVscF90eHQgPSAiIiJTZWxlY3RzIGEgcmV2aXNpb24gaWRl
bnRpZmllZCBieSBhIHRhZyBuYW1lLgorCisgICAgVGFncyBhcmUgc3RvcmVkIGluIHRoZSByZXBv
c2l0b3J5IGFuZCBjcmVhdGVkIGJ5IHRoZSAndGFnJworICAgIGNvbW1hbmQuCisgICAgIiIiCiAK
ICAgICBwcmVmaXggPSAndGFnOicKIAogICAgIGRlZiBfbWF0Y2hfb24oc2VsZiwgYnJhbmNoLCBy
ZXZzKToKLSAgICAgICAgcmFpc2UgZXJyb3JzLkludmFsaWRSZXZpc2lvblNwZWMoc2VsZi51c2Vy
X3NwZWMsIGJyYW5jaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
J3RhZzogbmFtZXNwYWNlIHJlZ2lzdGVyZWQsJwotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAnIGJ1dCBub3QgaW1wbGVtZW50ZWQnKQorICAgICAgICAjIENhbiByYWlz
ZSB0YWdzIG5vdCBzdXBwb3J0ZWQsIE5vU3VjaFRhZywgZXRjCisgICAgICAgIHJldHVybiBSZXZp
c2lvbkluZm8uZnJvbV9yZXZpc2lvbl9pZChicmFuY2gsCisgICAgICAgICAgICBicmFuY2gucmVw
b3NpdG9yeS5sb29rdXBfdGFnKHNlbGYuc3BlYyksCisgICAgICAgICAgICByZXZzKQogCiBTUEVD
X1RZUEVTLmFwcGVuZChSZXZpc2lvblNwZWNfdGFnKQogCgo=

=== modified file bzrlib/tests/repository_implementations/test_tags.py // encod
... ing:base64
LS0tIGJ6cmxpYi90ZXN0cy9yZXBvc2l0b3J5X2ltcGxlbWVudGF0aW9ucy90ZXN0X3RhZ3MucHkK
KysrIGJ6cmxpYi90ZXN0cy9yZXBvc2l0b3J5X2ltcGxlbWVudGF0aW9ucy90ZXN0X3RhZ3MucHkK
QEAgLTUxLDE4ICs1MSwxNyBAQAogICAgICAgICB0YWdzID0gcmVwby5nZXRfdGFnX2RpY3QoKQog
ICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhZ3MsIHt9KQogCi0gICAgZGVmIHRlc3Rfc2V0X2dl
dF90YWdzKHNlbGYpOgotICAgICAgICAjIGFkZCB0d28gdGFncywgCisgICAgZGVmIHRlc3RfbWFr
ZV9hbmRfbG9va3VwX3RhZyhzZWxmKToKICAgICAgICAgcmVwbyA9IHNlbGYubWFrZV9yZXBvc2l0
b3J5KCdyZXBvJykKLSAgICAgICAgdGQgPSBkaWN0KHN0YWJsZT0nc3RhYmxlLXJldmlkJywgYm9y
aW5nPSdib3JpbmctcmV2aWQnKQotICAgICAgICByZXBvLl9zZXRfdGFnX2RpY3QodGQpCisgICAg
ICAgIHJlcG8uc2V0X3RhZygndGFnLW5hbWUnLCAndGFyZ2V0LXJldmlkLTEnKQorICAgICAgICBy
ZXBvLnNldF90YWcoJ290aGVyLW5hbWUnLCAndGFyZ2V0LXJldmlkLTInKQogICAgICAgICAjIHRo
ZW4gcmVvcGVuIHRoZSByZXBvIGFuZCBzZWUgdGhleSdyZSBzdGlsbCB0aGVyZQogICAgICAgICBy
ZXBvID0gUmVwb3NpdG9yeS5vcGVuKCdyZXBvJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChy
ZXBvLmdldF90YWdfZGljdCgpLCB0ZCkKLQotICAgIGRlZiB0ZXN0X21ha2VfYW5kX2xvb2t1cF90
YWcoc2VsZik6Ci0gICAgICAgIHJlcG8gPSBzZWxmLm1ha2VfcmVwb3NpdG9yeSgncmVwbycpCi0g
ICAgICAgIHJlcG8ubWFrZV90YWcoJ3RhZy1uYW1lJywgJ3RhcmdldC1yZXZpZC0xJykKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbChyZXBvLmdldF90YWdfZGljdCgpLCAKKyAgICAgICAgICAgIHsn
dGFnLW5hbWUnOiAndGFyZ2V0LXJldmlkLTEnLAorICAgICAgICAgICAgICdvdGhlci1uYW1lJzog
J3RhcmdldC1yZXZpZC0yJywKKyAgICAgICAgICAgIH0pCisgICAgICAgICMgcmVhZCBvbmUgYXQg
YSB0aW1lCiAgICAgICAgIHJlc3VsdCA9IHJlcG8ubG9va3VwX3RhZygndGFnLW5hbWUnKQogICAg
ICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgJ3RhcmdldC1yZXZpZC0xJykKIAoK

=== modified file bzrlib/tests/test_repository.py // encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy90ZXN0X3JlcG9zaXRvcnkucHkKKysrIGJ6cmxpYi90ZXN0cy90ZXN0
X3JlcG9zaXRvcnkucHkKQEAgLTQ2MiwxMCArNDYyLDEwIEBACiAgICAgICAgICIiIlRlc3QgdGhl
IHByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGFnIGRpY3RzLiIiIgogICAgICAgICAjIERvbid0
IGNoYW5nZSB0aGlzIGFmdGVyIHdlIGNvbW1pdCB0byB0aGlzIGZvcm1hdCwgYXMgaXQgY2hlY2tz
IAogICAgICAgICAjIHRoYXQgdGhlIGZvcm1hdCBpcyBzdGFibGUgYW5kIGNvbXBhdGlibGUgYWNy
b3NzIHJlbGVhc2VzCi0gICAgICAgIGZvcm1hdCA9IHJlcG9zaXRvcnkuUmVwb3NpdG9yeUZvcm1h
dEtuaXQyKCkKKyAgICAgICAgc3RvcmUgPSByZXBvc2l0b3J5Ll9CYXNpY1RhZ1N0b3JlKHJlcG9z
aXRvcnk9Tm9uZSkKICAgICAgICAgdGQgPSBkaWN0KHN0YWJsZT0nc3RhYmxlLXJldmlkJywgYm9y
aW5nPSdib3JpbmctcmV2aWQnKQotICAgICAgICBwYWNrZWQgPSBmb3JtYXQuX3NlcmlhbGl6ZV90
YWdfZGljdCh0ZCkKKyAgICAgICAgcGFja2VkID0gc3RvcmUuX3NlcmlhbGl6ZV90YWdfZGljdCh0
ZCkKICAgICAgICAgZXhwZWN0ZWQgPSAnYm9yaW5nXHRib3JpbmctcmV2aWRcbnN0YWJsZVx0c3Rh
YmxlLXJldmlkXG4nCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxEaWZmKHBhY2tlZCwgZXhwZWN0
ZWQpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0Ll9kZXNlcmlhbGl6ZV90YWdfZGlj
dChwYWNrZWQpLCB0ZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdG9yZS5fZGVzZXJpYWxp
emVfdGFnX2RpY3QocGFja2VkKSwgdGQpCiAKCg==

=== modified file bzrlib/tests/test_revisionnamespaces.py // encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy90ZXN0X3JldmlzaW9ubmFtZXNwYWNlcy5weQorKysgYnpybGliL3Rl
c3RzL3Rlc3RfcmV2aXNpb25uYW1lc3BhY2VzLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmln
aHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgQ2Fub25pY2FsIEx0ZAorIyBDb3B5cmlnaHQgKEMpIDIw
MDQsIDIwMDUsIDIwMDYsIDIwMDcgQ2Fub25pY2FsIEx0ZAogIwogIyBUaGlzIHByb2dyYW0gaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogIyBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieQpAQCAtMTksMTEgKzE5LDE3IEBACiBpbXBvcnQgdGltZQogCiBmcm9tIGJ6cmxp
YiBpbXBvcnQgKAorICAgIGJ6cmRpciwKICAgICBlcnJvcnMsCisgICAgcmVwb3NpdG9yeSwKICAg
ICApCiBmcm9tIGJ6cmxpYi5idWlsdGlucyBpbXBvcnQgbWVyZ2UKIGZyb20gYnpybGliLnRlc3Rz
IGltcG9ydCBUZXN0Q2FzZSwgVGVzdENhc2VXaXRoVHJhbnNwb3J0Ci1mcm9tIGJ6cmxpYi5yZXZp
c2lvbnNwZWMgaW1wb3J0IFJldmlzaW9uU3BlYywgUmV2aXNpb25TcGVjX3Jldm5vCitmcm9tIGJ6
cmxpYi5yZXZpc2lvbnNwZWMgaW1wb3J0ICgKKyAgICBSZXZpc2lvblNwZWMsCisgICAgUmV2aXNp
b25TcGVjX3Jldm5vLAorICAgIFJldmlzaW9uU3BlY190YWcsCisgICAgKQogCiAKIGRlZiBzcGVj
X2luX2hpc3Rvcnkoc3BlYywgYnJhbmNoKToKQEAgLTMzNSw5ICszNDEsMjggQEAKIAogY2xhc3Mg
VGVzdFJldmlzaW9uU3BlY190YWcoVGVzdFJldmlzaW9uU3BlYyk6CiAgICAgCi0gICAgZGVmIHRl
c3RfaW52YWxpZChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRJbnZhbGlkKCd0YWc6Zm9vJywg
ZXh0cmE9J1xudGFnOiBuYW1lc3BhY2UgcmVnaXN0ZXJlZCwnCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICcgYnV0IG5vdCBpbXBsZW1lbnRlZCcpCisgICAgZGVm
IG1ha2VfYnJhbmNoX2FuZF90cmVlKHNlbGYsIHJlbHBhdGgpOgorICAgICAgICAjIG92ZXJyaWRl
IGZvcm1hdCBhcyB0aGUgZGVmYXVsdCBvbmUgbWF5IG5vdCBzdXBwb3J0IHRhZ3MKKyAgICAgICAg
Y29udHJvbCA9IGJ6cmRpci5CenJEaXIuY3JlYXRlKHJlbHBhdGgpCisgICAgICAgIHJlcG8gPSBy
ZXBvc2l0b3J5LlJlcG9zaXRvcnlGb3JtYXRLbml0MigpLmluaXRpYWxpemUoY29udHJvbCkKKyAg
ICAgICAgY29udHJvbC5jcmVhdGVfYnJhbmNoKCkKKyAgICAgICAgcmV0dXJuIGNvbnRyb2wuY3Jl
YXRlX3dvcmtpbmd0cmVlKCkKKworICAgIGRlZiB0ZXN0X2Zyb21fc3RyaW5nX3RhZyhzZWxmKToK
KyAgICAgICAgc3BlYyA9IFJldmlzaW9uU3BlYy5mcm9tX3N0cmluZygndGFnOmJ6ci0wLjE0JykK
KyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNwZWMsIFJldmlzaW9uU3BlY190YWcpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BlYy5zcGVjLCAnYnpyLTAuMTQnKQorCisgICAgZGVm
IHRlc3RfbG9va3VwX3RhZyhzZWxmKToKKyAgICAgICAgc2VsZi50cmVlLmJyYW5jaC5yZXBvc2l0
b3J5LnNldF90YWcoJ2J6ci0wLjE0JywgJ3IxJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbkhpc3Rv
cnlJcygxLCAncjEnLCAndGFnOmJ6ci0wLjE0JykKKworICAgIGRlZiB0ZXN0X2ZhaWxlZF9sb29r
dXAoc2VsZik6CisgICAgICAgICMgdGFncyB0aGF0IGRvbid0IGV4aXN0IGdpdmUgYSBzcGVjaWZp
YyBtZXNzYWdlOiBhcmd1YWJseSB3ZSBzaG91bGQKKyAgICAgICAgIyBqdXN0IGdpdmUgSW52YWxp
ZFJldmlzaW9uU3BlYyBidXQgSSB0aGluayB0aGlzIGlzIG1vcmUgaGVscGZ1bAorICAgICAgICBz
ZWxmLmFzc2VydFJhaXNlcyhlcnJvcnMuTm9TdWNoVGFnLAorICAgICAgICAgICAgc2VsZi5nZXRf
aW5faGlzdG9yeSwKKyAgICAgICAgICAgICd0YWc6c29tZS1yYW5kb20tdGFnJykKIAogCiBjbGFz
cyBUZXN0UmV2aXNpb25TcGVjX2RhdGUoVGVzdFJldmlzaW9uU3BlYyk6Cgo=

=== modified directory  // last-changed:mbp at sourcefrog.net-20070119024650-o12ek
... gnjski2v3ed
# revision id: mbp at sourcefrog.net-20070119024650-o12ekgnjski2v3ed
# sha1: 88c784b46d946c288f1206a6395314dc5e5e739c
# inventory sha1: 4470dec0c51b0783bd17721af5a4e3899415dd9d
# parent ids:
#   mbp at sourcefrog.net-20070116132138-vhziz9hpfc8za0uj
# properties:
#   branch-nick: tags

# message:
#   Add tag command and basic implementation
# committer: Martin Pool <mbp at sourcefrog.net>
# date: Wed 2007-01-17 00:21:38.532000065 +1100

=== added file bzrlib/tests/blackbox/test_tags.py // file-id:test_tags.py-20070
... 116132048-5h4qak2cm22jlb9e-1 // encoding:base64
LS0tIC9kZXYvbnVsbAorKysgYnpybGliL3Rlc3RzL2JsYWNrYm94L3Rlc3RfdGFncy5weQpAQCAt
MCwwICsxLDUxIEBACisjIENvcHlyaWdodCAoQykgMjAwNyBDYW5vbmljYWwgTHRkCisjCisjIFRo
aXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisj
IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3
YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0
b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworIiIiVGVzdHMgZm9yIGNvbW1hbmRzIHJlbGF0ZWQg
dG8gdGFncyIiIgorCitmcm9tIGJ6cmxpYi5icmFuY2ggaW1wb3J0IEJyYW5jaAorZnJvbSBienJs
aWIuYnpyZGlyIGltcG9ydCBCenJEaXIKK2Zyb20gYnpybGliLnRlc3RzIGltcG9ydCBUZXN0Q2Fz
ZVdpdGhUcmFuc3BvcnQKK2Zyb20gYnpybGliLnJlcG9zaXRvcnkgaW1wb3J0IFJlcG9zaXRvcnlG
b3JtYXRLbml0MgorCisKK2NsYXNzIFRlc3RUYWdnaW5nKFRlc3RDYXNlV2l0aFRyYW5zcG9ydCk6
CisKKyAgICAjIGFzIG9mIDAuMTQsIHRoZSBkZWZhdWx0IGZvcm1hdCBkb2Vzbid0IGRvIHRhZ3Mg
c28gd2UgbmVlZCB0byB1c2UgYQorICAgICMgc3BlY2lmaWMgZm9ybWF0CisgICAgCisgICAgZGVm
IG1ha2VfYnJhbmNoX2FuZF90cmVlKHNlbGYsIHJlbHBhdGgpOgorICAgICAgICBjb250cm9sID0g
QnpyRGlyLmNyZWF0ZShyZWxwYXRoKQorICAgICAgICByZXBvID0gUmVwb3NpdG9yeUZvcm1hdEtu
aXQyKCkuaW5pdGlhbGl6ZShjb250cm9sKQorICAgICAgICBjb250cm9sLmNyZWF0ZV9icmFuY2go
KQorICAgICAgICByZXR1cm4gY29udHJvbC5jcmVhdGVfd29ya2luZ3RyZWUoKQorCisgICAgZGVm
IHRlc3RfdGFnX2NvbW1hbmRfaGVscChzZWxmKToKKyAgICAgICAgb3V0LCBlcnIgPSBzZWxmLnJ1
bl9ienJfY2FwdHVyZWQoWydoZWxwJywgJ3RhZyddKQorICAgICAgICBzZWxmLmFzc2VydENvbnRh
aW5zUmUob3V0LCAnQ3JlYXRlIGEgdGFnJykKKworICAgIGRlZiB0ZXN0X3RhZ19jdXJyZW50X3Jl
dihzZWxmKToKKyAgICAgICAgIyMgYiA9IHNlbGYubWFrZV9icmFuY2goJ2JyYW5jaCcpCisgICAg
ICAgICMjIGIucmVwb3NpdG9yeS50YWcKKyAgICAgICAgdCA9IHNlbGYubWFrZV9icmFuY2hfYW5k
X3RyZWUoJ2JyYW5jaCcpCisgICAgICAgIHQuY29tbWl0KGFsbG93X3BvaW50bGVzcz1UcnVlLCBt
ZXNzYWdlPSdpbml0aWFsIGNvbW1pdCcsCisgICAgICAgICAgICByZXZfaWQ9J2ZpcnN0LXJldmlk
JykKKyAgICAgICAgIyBtYWtlIGEgdGFnIHRocm91Z2ggdGhlIGNvbW1hbmQgbGluZQorICAgICAg
ICBvdXQsIGVyciA9IHNlbGYucnVuX2J6cigndGFnJywgJy1kJywgJ2JyYW5jaCcsICdORVdUQUcn
KQorICAgICAgICBzZWxmLmFzc2VydENvbnRhaW5zUmUob3V0LCAnY3JlYXRlZCB0YWcgTkVXVEFH
JykKKyAgICAgICAgIyB0YWcgc2hvdWxkIGJlIG9ic2VydmFibGUgdGhyb3VnaCB0aGUgYXBpCisg
ICAgICAgIHJlcG8gPSB0LmJyYW5jaC5yZXBvc2l0b3J5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWxzKHJlcG8uZ2V0X3RhZ19kaWN0KCksIGRpY3QoTkVXVEFHPSdmaXJzdC1yZXZpZCcpKQoK

=== modified file bzrlib/builtins.py // encoding:base64
LS0tIGJ6cmxpYi9idWlsdGlucy5weQorKysgYnpybGliL2J1aWx0aW5zLnB5CkBAIC0xLDQgKzEs
NCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgQ2Fub25pY2FsIEx0ZAorIyBD
b3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgQ2Fub25pY2FsIEx0ZAogIwogIyBU
aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yIG1vZGlmeQogIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjk5NCw2ICsyOTk0LDI3IEBACiAgICAgICAg
IHNlcnZlci5zZXJ2ZSgpCiAKIAorY2xhc3MgY21kX3RhZyhDb21tYW5kKToKKyAgICAiIiJDcmVh
dGUgYSB0YWcgbmFtaW5nIGEgcmV2aXNpb24iIiIKKworICAgIHRha2VzX2FyZ3MgPSBbJ3RhZ19u
YW1lJ10KKyAgICB0YWtlc19vcHRpb25zID0gWworICAgICAgICBPcHRpb24oJ2RpcmVjdG9yeScs
CisgICAgICAgICAgICBoZWxwPSdicmFuY2ggb3IgcmVwb3NpdG9yeSB0byB0YWcnLAorICAgICAg
ICAgICAgc2hvcnRfbmFtZT0nZCcsCisgICAgICAgICAgICB0eXBlPXVuaWNvZGUsCisgICAgICAg
ICAgICApLAorICAgICAgICBdCisKKyAgICBkZWYgcnVuKHNlbGYsIHRhZ19uYW1lLCBkaXJlY3Rv
cnk9Jy4nKToKKyAgICAgICAgYnJhbmNoLCByZWxwYXRoID0gQnJhbmNoLm9wZW5fY29udGFpbmlu
ZyhkaXJlY3RvcnkpCisgICAgICAgIHJldmlzaW9uX2lkID0gYnJhbmNoLmxhc3RfcmV2aXNpb24o
KQorICAgICAgICBicmFuY2gucmVwb3NpdG9yeS5tYWtlX3RhZyh0YWdfbmFtZSwgcmV2aXNpb25f
aWQpCisgICAgICAgIHNlbGYub3V0Zi53cml0ZSgnY3JlYXRlZCB0YWcgJXMnICUgdGFnX25hbWUp
CisKKworCisKICMgY29tbWFuZC1saW5lIGludGVycHJldGF0aW9uIGhlbHBlciBmb3IgbWVyZ2Ut
cmVsYXRlZCBjb21tYW5kcwogZGVmIF9tZXJnZV9oZWxwZXIob3RoZXJfcmV2aXNpb24sIGJhc2Vf
cmV2aXNpb24sCiAgICAgICAgICAgICAgICAgICBjaGVja19jbGVhbj1UcnVlLCBpZ25vcmVfemVy
bz1GYWxzZSwKCg==

=== modified file bzrlib/errors.py // encoding:base64
LS0tIGJ6cmxpYi9lcnJvcnMucHkKKysrIGJ6cmxpYi9lcnJvcnMucHkKQEAgLTE2MDIsMyArMTYw
MiwxMSBAQAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICAgQnpyRXJyb3Iu
X19pbml0X18oc2VsZikKICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorCisKK2NsYXNzIE5vU3Vj
aFRhZyhCenJFcnJvcik6CisKKyAgICBfZm10ID0gIk5vIHN1Y2ggdGFnOiAlKHRhZ19uYW1lKXMi
CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFnX25hbWUpOgorICAgICAgICBzZWxmLnRhZ19u
YW1lID0gdGFnX25hbWUKCg==

=== modified file bzrlib/repository.py // encoding:base64
LS0tIGJ6cmxpYi9yZXBvc2l0b3J5LnB5CisrKyBienJsaWIvcmVwb3NpdG9yeS5weQpAQCAtMTA5
MCwxMCArMTA5MCwxNSBAQAogY2xhc3MgS25pdFJlcG9zaXRvcnkyKEtuaXRSZXBvc2l0b3J5KToK
ICAgICAiIiJFeHBlcmltZW50YWwgZW5oYW5jZWQga25pdCBmb3JtYXQiIiIKIAorICAgICMgY29y
cmVzcG9uZHMgdG8gUmVwb3NpdG9yeUZvcm1hdEtuaXQyCisgICAgCisgICAgIyBUT0RPOiB3aXRo
aW4gYSBsb2NrIHNjb3BlLCB3ZSBjb3VsZCBrZWVwIHRoZSB0YWdzIGluIG1lbW9yeS4uLgorCiAg
ICAgZGVmIF9faW5pdF9fKHNlbGYsIF9mb3JtYXQsIGFfYnpyZGlyLCBjb250cm9sX2ZpbGVzLCBf
cmV2aXNpb25fc3RvcmUsCiAgICAgICAgICAgICAgICAgIGNvbnRyb2xfc3RvcmUsIHRleHRfc3Rv
cmUpOgogICAgICAgICBLbml0UmVwb3NpdG9yeS5fX2luaXRfXyhzZWxmLCBfZm9ybWF0LCBhX2J6
cmRpciwgY29udHJvbF9maWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXZp
c2lvbl9zdG9yZSwgY29udHJvbF9zdG9yZSwgdGV4dF9zdG9yZSkKKyAgICAgICAgc2VsZi5fdHJh
bnNwb3J0ID0gY29udHJvbF9maWxlcy5fdHJhbnNwb3J0CiAgICAgICAgIHNlbGYuX3NlcmlhbGl6
ZXIgPSB4bWw2LnNlcmlhbGl6ZXJfdjYKIAogICAgIGRlZiBkZXNlcmlhbGlzZV9pbnZlbnRvcnko
c2VsZiwgcmV2aXNpb25faWQsIHhtbCk6CkBAIC0xMTMzLDggKzExMzgsMzcgQEAKICAgICAgICAg
cmV0dXJuIFJvb3RDb21taXRCdWlsZGVyKHNlbGYsIHBhcmVudHMsIGNvbmZpZywgdGltZXN0YW1w
LCB0aW1lem9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlciwg
cmV2cHJvcHMsIHJldmlzaW9uX2lkKQogCi0gICAgZGVmIGdldF90YWdzKHNlbGYpOgotICAgICAg
ICByZXR1cm4gTm9uZQorICAgIEBuZWVkc19yZWFkX2xvY2sKKyAgICBkZWYgZ2V0X3RhZ19kaWN0
KHNlbGYpOgorICAgICAgICB0YWdfY29udGVudCA9IHNlbGYuY29udHJvbF9maWxlcy5nZXRfdXRm
OCgndGFncycpLnJlYWQoKQorICAgICAgICByZXR1cm4gc2VsZi5fZm9ybWF0Ll9kZXNlcmlhbGl6
ZV90YWdfZGljdCh0YWdfY29udGVudCkKKworICAgIEBuZWVkc193cml0ZV9sb2NrCisgICAgZGVm
IF9zZXRfdGFnX2RpY3Qoc2VsZiwgbmV3X2RpY3QpOgorICAgICAgICAiIiJSZXBsYWNlIGFsbCB0
YWcgZGVmaW5pdGlvbnMKKworICAgICAgICA6cGFyYW0gbmV3X2RpY3Q6IERpY3Rpb25hcnkgZnJv
bSB0YWcgbmFtZSB0byB0YXJnZXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNvbnRyb2xf
ZmlsZXMucHV0X3V0ZjgoJ3RhZ3MnLCBzZWxmLl9mb3JtYXQuX3NlcmlhbGl6ZV90YWdfZGljdChu
ZXdfZGljdCkpCisKKyAgICBAbmVlZHNfd3JpdGVfbG9jaworICAgIGRlZiBtYWtlX3RhZyhzZWxm
LCB0YWdfbmFtZSwgdGFnX3RhcmdldCk6CisgICAgICAgICIiIkFkZCBhIHRhZyBkZWZpbml0aW9u
IHRvIHRoZSByZXBvc2l0b3J5LgorCisgICAgICAgIEJlaGF2aW91ciBpZiB0aGUgdGFnIGlzIGFs
cmVhZHkgcHJlc2VudCBpcyBub3QgZGVmaW5lZCAoeWV0KS4KKyAgICAgICAgIiIiCisgICAgICAg
ICMgYWxsIGRvbmUgd2l0aCBhIHdyaXRlIGxvY2sgaGVsZCwgc28gdGhpcyBsb29rcyBhdG9taWMK
KyAgICAgICAgdGQgPSBzZWxmLmdldF90YWdfZGljdCgpCisgICAgICAgIHRkW3RhZ19uYW1lXSA9
IHRhZ190YXJnZXQKKyAgICAgICAgc2VsZi5fc2V0X3RhZ19kaWN0KHRkKQorCisgICAgZGVmIGxv
b2t1cF90YWcoc2VsZiwgdGFnX25hbWUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHJlZmVyZW50
IHN0cmluZyBvZiBhIHRhZyIiIgorICAgICAgICB0ZCA9IHNlbGYuZ2V0X3RhZ19kaWN0KCkKKyAg
ICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHRkW3RhZ19uYW1lXQorICAgICAgICBleGNl
cHQgS2V5RXJyb3I6CisgICAgICAgICAgICByYWlzZSBlcnJvcnMuTm9TdWNoVGFnKHRhZ19uYW1l
KQogCiAKIGNsYXNzIFJlcG9zaXRvcnlGb3JtYXQob2JqZWN0KToKQEAgLTEyMjIsNyArMTI1Niw3
IEBACiAgICAgICAgIGZyb20gYnpybGliLnN0b3JlLnJldmlzaW9uLnRleHQgaW1wb3J0IFRleHRS
ZXZpc2lvblN0b3JlCiAgICAgICAgIGRpcl9tb2RlID0gY29udHJvbF9maWxlcy5fZGlyX21vZGUK
ICAgICAgICAgZmlsZV9tb2RlID0gY29udHJvbF9maWxlcy5fZmlsZV9tb2RlCi0gICAgICAgIHRl
eHRfc3RvcmUgPVRleHRTdG9yZSh0cmFuc3BvcnQuY2xvbmUobmFtZSksCisgICAgICAgIHRleHRf
c3RvcmUgPSBUZXh0U3RvcmUodHJhbnNwb3J0LmNsb25lKG5hbWUpLAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcHJlZml4ZWQ9cHJlZml4ZWQsCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb21wcmVzc2VkPWNvbXByZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBkaXJfbW9kZT1kaXJfbW9kZSwKQEAgLTE4MDEsMTEgKzE4MzUsMzEgQEAKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sX2ZpbGVzPWNvbnRyb2xfZmlsZXMsCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldmlzaW9uX3N0b3JlPV9yZXZpc2lvbl9zdG9y
ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sX3N0b3JlPWNvbnRyb2xf
c3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9zdG9yZT10ZXh0X3N0
b3JlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3N0b3JlPXRleHRfc3Rv
cmUpCisKKyAgICBkZWYgaW5pdGlhbGl6ZShzZWxmLCBhX2J6cmRpciwgc2hhcmVkPUZhbHNlKToK
KyAgICAgICAgcmVwbyA9IHN1cGVyKFJlcG9zaXRvcnlGb3JtYXRLbml0Miwgc2VsZikuaW5pdGlh
bGl6ZShhX2J6cmRpciwgc2hhcmVkKQorICAgICAgICByZXBvLl90cmFuc3BvcnQucHV0X2J5dGVz
X25vbl9hdG9taWMoJ3RhZ3MnLCAnJykKKyAgICAgICAgcmV0dXJuIHJlcG8KIAogICAgIGRlZiBz
dXBwb3J0c190YWdzKHNlbGYpOgogICAgICAgICByZXR1cm4gVHJ1ZQogCisgICAgZGVmIF9zZXJp
YWxpemVfdGFnX2RpY3Qoc2VsZiwgdGFnX2RpY3QpOgorICAgICAgICBzID0gW10KKyAgICAgICAg
Zm9yIHRhZywgdGFyZ2V0IGluIHNvcnRlZCh0YWdfZGljdC5pdGVtcygpKToKKyAgICAgICAgICAg
ICMgVE9ETzogY2hlY2sgdGhhdCB0YWcgbmFtZXMgYW5kIHRhcmdldHMgYXJlIGFjY2VwdGFibGUK
KyAgICAgICAgICAgIHMuYXBwZW5kKHRhZyArICdcdCcgKyB0YXJnZXQgKyAnXG4nKQorICAgICAg
ICByZXR1cm4gJycuam9pbihzKQorCisgICAgZGVmIF9kZXNlcmlhbGl6ZV90YWdfZGljdChzZWxm
LCB0YWdfY29udGVudCk6CisgICAgICAgICIiIkNvbnZlcnQgdGhlIHRhZyBmaWxlIGludG8gYSBk
aWN0aW9uYXJ5IG9mIHRhZ3MiIiIKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGZvciBsIGluIHRh
Z19jb250ZW50LnNwbGl0bGluZXMoKToKKyAgICAgICAgICAgIHRhZywgdGFyZ2V0ID0gbC5zcGxp
dCgnXHQnLCAxKQorICAgICAgICAgICAgZFt0YWddID0gdGFyZ2V0CisgICAgICAgIHJldHVybiBk
CisKIAogCiAjIGZvcm1hdHMgd2hpY2ggaGF2ZSBubyBmb3JtYXQgc3RyaW5nIGFyZSBub3QgZGlz
Y292ZXJhYmxlCgo=

=== modified file bzrlib/tests/blackbox/__init__.py // encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy9ibGFja2JveC9fX2luaXRfXy5weQorKysgYnpybGliL3Rlc3RzL2Js
YWNrYm94L19faW5pdF9fLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDUs
IDIwMDYgQ2Fub25pY2FsIEx0ZAorIyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcgQ2Fu
b25pY2FsIEx0ZAogIwogIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtODcsNiArODcs
NyBAQAogICAgICAgICAgICAgICAgICAgICAgJ2J6cmxpYi50ZXN0cy5ibGFja2JveC50ZXN0X3No
YXJlZF9yZXBvc2l0b3J5JywKICAgICAgICAgICAgICAgICAgICAgICdienJsaWIudGVzdHMuYmxh
Y2tib3gudGVzdF9zaWduX215X2NvbW1pdHMnLAogICAgICAgICAgICAgICAgICAgICAgJ2J6cmxp
Yi50ZXN0cy5ibGFja2JveC50ZXN0X3N0YXR1cycsCisgICAgICAgICAgICAgICAgICAgICAnYnpy
bGliLnRlc3RzLmJsYWNrYm94LnRlc3RfdGFncycsCiAgICAgICAgICAgICAgICAgICAgICAnYnpy
bGliLnRlc3RzLmJsYWNrYm94LnRlc3RfdGVzdGFtZW50JywKICAgICAgICAgICAgICAgICAgICAg
ICdienJsaWIudGVzdHMuYmxhY2tib3gudGVzdF90b29fbXVjaCcsCiAgICAgICAgICAgICAgICAg
ICAgICAnYnpybGliLnRlc3RzLmJsYWNrYm94LnRlc3RfdW5jb21taXQnLAoK

=== modified file bzrlib/tests/repository_implementations/test_tags.py // encod
... ing:base64
LS0tIGJ6cmxpYi90ZXN0cy9yZXBvc2l0b3J5X2ltcGxlbWVudGF0aW9ucy90ZXN0X3RhZ3MucHkK
KysrIGJ6cmxpYi90ZXN0cy9yZXBvc2l0b3J5X2ltcGxlbWVudGF0aW9ucy90ZXN0X3RhZ3MucHkK
QEAgLTIzLDkgKzIzLDExIEBACiBpbXBvcnQgYnpybGliCiBmcm9tIGJ6cmxpYiBpbXBvcnQgYnpy
ZGlyLCBlcnJvcnMsIHJlcG9zaXRvcnkKIGZyb20gYnpybGliLmJyYW5jaCBpbXBvcnQgQnJhbmNo
LCBuZWVkc19yZWFkX2xvY2ssIG5lZWRzX3dyaXRlX2xvY2sKK2Zyb20gYnpybGliLnJlcG9zaXRv
cnkgaW1wb3J0IFJlcG9zaXRvcnkKIGZyb20gYnpybGliLnRlc3RzIGltcG9ydCBUZXN0Q2FzZSwg
VGVzdENhc2VXaXRoVHJhbnNwb3J0LCBUZXN0U2tpcHBlZAogZnJvbSBienJsaWIudHJhY2UgaW1w
b3J0IG11dHRlcgogZnJvbSBienJsaWIud29ya2luZ3RyZWUgaW1wb3J0IFdvcmtpbmdUcmVlCisK
IGZyb20gYnpybGliLnRlc3RzLnJlcG9zaXRvcnlfaW1wbGVtZW50YXRpb25zLnRlc3RfcmVwb3Np
dG9yeSBcCiAgICAgICAgIGltcG9ydCBUZXN0Q2FzZVdpdGhSZXBvc2l0b3J5CiAKQEAgLTQ0LDYg
KzQ2LDMzIEBACiAgICAgICAgICAgICByYWlzZSBUZXN0U2tpcHBlZCgiZm9ybWF0ICVzIGRvZXNu
J3Qgc3VwcG9ydCB0YWdzIiAlIGZtdCkKICAgICAgICAgVGVzdENhc2VXaXRoUmVwb3NpdG9yeS5z
ZXRVcChzZWxmKQogCi0gICAgZGVmIHRlc3RfZm9vX3RhZ3Moc2VsZik6Ci0gICAgICAgIHJlcG8g
PSBzZWxmLm1ha2VfcmVwb3NpdG9yeSgncmVwbycpCi0gICAgICAgIHRhZ3MgPSByZXBvLmdldF90
YWdzKCkKKyAgICBkZWYgdGVzdF90YWdzX2luaXRpYWxseV9lbXB0eShzZWxmKToKKyAgICAgICAg
cmVwbyA9IHNlbGYubWFrZV9yZXBvc2l0b3J5KCdyZXBvJykKKyAgICAgICAgdGFncyA9IHJlcG8u
Z2V0X3RhZ19kaWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWdzLCB7fSkKKworICAg
IGRlZiB0ZXN0X3NldF9nZXRfdGFncyhzZWxmKToKKyAgICAgICAgIyBhZGQgdHdvIHRhZ3MsIAor
ICAgICAgICByZXBvID0gc2VsZi5tYWtlX3JlcG9zaXRvcnkoJ3JlcG8nKQorICAgICAgICB0ZCA9
IGRpY3Qoc3RhYmxlPSdzdGFibGUtcmV2aWQnLCBib3Jpbmc9J2JvcmluZy1yZXZpZCcpCisgICAg
ICAgIHJlcG8uX3NldF90YWdfZGljdCh0ZCkKKyAgICAgICAgIyB0aGVuIHJlb3BlbiB0aGUgcmVw
byBhbmQgc2VlIHRoZXkncmUgc3RpbGwgdGhlcmUKKyAgICAgICAgcmVwbyA9IFJlcG9zaXRvcnku
b3BlbigncmVwbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwby5nZXRfdGFnX2RpY3Qo
KSwgdGQpCisKKyAgICBkZWYgdGVzdF9tYWtlX2FuZF9sb29rdXBfdGFnKHNlbGYpOgorICAgICAg
ICByZXBvID0gc2VsZi5tYWtlX3JlcG9zaXRvcnkoJ3JlcG8nKQorICAgICAgICByZXBvLm1ha2Vf
dGFnKCd0YWctbmFtZScsICd0YXJnZXQtcmV2aWQtMScpCisgICAgICAgIHJlc3VsdCA9IHJlcG8u
bG9va3VwX3RhZygndGFnLW5hbWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwg
J3RhcmdldC1yZXZpZC0xJykKKworICAgIGRlZiB0ZXN0X25vX3N1Y2hfdGFnKHNlbGYpOgorICAg
ICAgICByZXBvID0gc2VsZi5tYWtlX3JlcG9zaXRvcnkoJ3JlcG8nKQorICAgICAgICB0cnk6Cisg
ICAgICAgICAgICByZXBvLmxvb2t1cF90YWcoJ2Jvc2tvJykKKyAgICAgICAgZXhjZXB0IGVycm9y
cy5Ob1N1Y2hUYWcsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhlLnRhZ19uYW1l
LCAnYm9za28nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc3RyKGUpLCAnTm8gc3Vj
aCB0YWc6IGJvc2tvJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGlk
bid0IGdldCBleHBlY3RlZCBleGNlcHRpb24iKQorCgo=

=== modified file bzrlib/tests/test_repository.py // encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy90ZXN0X3JlcG9zaXRvcnkucHkKKysrIGJ6cmxpYi90ZXN0cy90ZXN0
X3JlcG9zaXRvcnkucHkKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAoQykgMjAwNiBDYW5v
bmljYWwgTHRkCisjIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBDYW5vbmljYWwgTHRkCiAjCiAj
IFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IgbW9kaWZ5CiAjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0zMjEsNyArMzIxLDYgQEAKICAgICAgICAg
c2VsZi5hc3NlcnRUcnVlKFNfSVNESVIodC5zdGF0KCdrbml0cycpLnN0X21vZGUpKQogICAgICAg
ICBzZWxmLmNoZWNrX2tuaXRzKHQpCiAKLQogY2xhc3MgSW50ZXJTdHJpbmcocmVwb3NpdG9yeS5J
bnRlclJlcG9zaXRvcnkpOgogICAgICIiIkFuIGludGVyLXJlcG9zaXRvcnkgb3B0aW1pc2VkIGNv
ZGUgcGF0aCBmb3Igc3RyaW5ncy4KIApAQCAtNDU4LDMgKzQ1NywxNSBAQAogICAgICAgICB0cmVl
LmNvbW1pdCgiQW5vdGhlciBkdWxsIGNvbW1pdCIsIHJldl9pZD0nZHVsbDInKQogICAgICAgICBy
ZXZpc2lvbl90cmVlID0gdHJlZS5icmFuY2gucmVwb3NpdG9yeS5yZXZpc2lvbl90cmVlKCdkdWxs
MicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2R1bGwnLCByZXZpc2lvbl90cmVlLmludmVu
dG9yeS5yb290LnJldmlzaW9uKQorCisgICAgZGVmIHRlc3RfdGFnX3NlcmlhbGl6YXRpb24oc2Vs
Zik6CisgICAgICAgICIiIlRlc3QgdGhlIHByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGFnIGRp
Y3RzLiIiIgorICAgICAgICAjIERvbid0IGNoYW5nZSB0aGlzIGFmdGVyIHdlIGNvbW1pdCB0byB0
aGlzIGZvcm1hdCwgYXMgaXQgY2hlY2tzIAorICAgICAgICAjIHRoYXQgdGhlIGZvcm1hdCBpcyBz
dGFibGUgYW5kIGNvbXBhdGlibGUgYWNyb3NzIHJlbGVhc2VzCisgICAgICAgIGZvcm1hdCA9IHJl
cG9zaXRvcnkuUmVwb3NpdG9yeUZvcm1hdEtuaXQyKCkKKyAgICAgICAgdGQgPSBkaWN0KHN0YWJs
ZT0nc3RhYmxlLXJldmlkJywgYm9yaW5nPSdib3JpbmctcmV2aWQnKQorICAgICAgICBwYWNrZWQg
PSBmb3JtYXQuX3NlcmlhbGl6ZV90YWdfZGljdCh0ZCkKKyAgICAgICAgZXhwZWN0ZWQgPSAnYm9y
aW5nXHRib3JpbmctcmV2aWRcbnN0YWJsZVx0c3RhYmxlLXJldmlkXG4nCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWxEaWZmKHBhY2tlZCwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWwoZm9ybWF0Ll9kZXNlcmlhbGl6ZV90YWdfZGljdChwYWNrZWQpLCB0ZCkKKwoK

=== modified directory  // last-changed:mbp at sourcefrog.net-20070116132138-vhziz
... 9hpfc8za0uj
# revision id: mbp at sourcefrog.net-20070116132138-vhziz9hpfc8za0uj
# sha1: 1256f6d9877cd54935b5d7e17376b7c71796424e
# inventory sha1: b529884bcf7fa5a1001a116a32de751b16eeca75
# parent ids:
#   mbp at sourcefrog.net-20070114085612-q90lx2g0firzu7z9
# properties:
#   branch-nick: tags

# message:
#   Start adding space for tags stored in the repository
# committer: Martin Pool <mbp at sourcefrog.net>
# date: Sun 2007-01-14 19:56:12.614000082 +1100

=== added file bzrlib/tests/repository_implementations/test_tags.py // file-id:
... test_tags.py-20070114073919-azsbo9l26ph1rr09-1 // encoding:base64
LS0tIC9kZXYvbnVsbAorKysgYnpybGliL3Rlc3RzL3JlcG9zaXRvcnlfaW1wbGVtZW50YXRpb25z
L3Rlc3RfdGFncy5weQpAQCAtMCwwICsxLDQ5IEBACisjIENvcHlyaWdodCAoQykgMjAwNyBDYW5v
bmljYWwgTHRkCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisj
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQg
V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv
ZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRl
IHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFj
ZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworIiIiVGFncyBzdG9y
ZWQgd2l0aGluIGEgcmVwb3NpdG9yeSIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0
IHN5cworCitpbXBvcnQgYnpybGliCitmcm9tIGJ6cmxpYiBpbXBvcnQgYnpyZGlyLCBlcnJvcnMs
IHJlcG9zaXRvcnkKK2Zyb20gYnpybGliLmJyYW5jaCBpbXBvcnQgQnJhbmNoLCBuZWVkc19yZWFk
X2xvY2ssIG5lZWRzX3dyaXRlX2xvY2sKK2Zyb20gYnpybGliLnRlc3RzIGltcG9ydCBUZXN0Q2Fz
ZSwgVGVzdENhc2VXaXRoVHJhbnNwb3J0LCBUZXN0U2tpcHBlZAorZnJvbSBienJsaWIudHJhY2Ug
aW1wb3J0IG11dHRlcgorZnJvbSBienJsaWIud29ya2luZ3RyZWUgaW1wb3J0IFdvcmtpbmdUcmVl
Citmcm9tIGJ6cmxpYi50ZXN0cy5yZXBvc2l0b3J5X2ltcGxlbWVudGF0aW9ucy50ZXN0X3JlcG9z
aXRvcnkgXAorICAgICAgICBpbXBvcnQgVGVzdENhc2VXaXRoUmVwb3NpdG9yeQorCisKK2NsYXNz
IFRlc3RSZXBvc2l0b3J5VGFncyhUZXN0Q2FzZVdpdGhSZXBvc2l0b3J5KToKKworICAgIGRlZiBz
ZXRVcChzZWxmKToKKyAgICAgICAgIyBmb3JtYXRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0YWdzIGNh
biBza2lwIHRoZSByZXN0IG9mIHRoZXNlIAorICAgICAgICAjIHRlc3RzLi4uCisgICAgICAgIGZt
dCA9IHNlbGYucmVwb3NpdG9yeV9mb3JtYXQKKyAgICAgICAgZiA9IGdldGF0dHIoZm10LCAnc3Vw
cG9ydHNfdGFncycpCisgICAgICAgIGlmIGYgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFRl
c3RTa2lwcGVkKCJmb3JtYXQgJXMgZG9lc24ndCBkZWNsYXJlIHdoZXRoZXIgaXQgIgorICAgICAg
ICAgICAgICAgICJzdXBwb3J0cyB0YWdzLCBhc3N1bWluZyBub3QiICUgZm10KQorICAgICAgICBp
ZiBub3QgZigpOgorICAgICAgICAgICAgcmFpc2UgVGVzdFNraXBwZWQoImZvcm1hdCAlcyBkb2Vz
bid0IHN1cHBvcnQgdGFncyIgJSBmbXQpCisgICAgICAgIFRlc3RDYXNlV2l0aFJlcG9zaXRvcnku
c2V0VXAoc2VsZikKKworICAgIGRlZiB0ZXN0X2Zvb190YWdzKHNlbGYpOgorICAgICAgICByZXBv
ID0gc2VsZi5tYWtlX3JlcG9zaXRvcnkoJ3JlcG8nKQorICAgICAgICB0YWdzID0gcmVwby5nZXRf
dGFncygpCgo=

=== modified file bzrlib/repository.py // encoding:base64
LS0tIGJ6cmxpYi9yZXBvc2l0b3J5LnB5CisrKyBienJsaWIvcmVwb3NpdG9yeS5weQpAQCAtMSw0
ICsxLDQgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IENhbm9uaWNhbCBMdGQKKyMgQ29w
eXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3IENhbm9uaWNhbCBMdGQKICMKICMgVGhpcyBwcm9n
cmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2Rp
ZnkKICMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTEwODgsNyArMTA4OCw4IEBACiAKIAogY2xhc3MgS25pdFJl
cG9zaXRvcnkyKEtuaXRSZXBvc2l0b3J5KToKLSAgICAiIiIiIiIKKyAgICAiIiJFeHBlcmltZW50
YWwgZW5oYW5jZWQga25pdCBmb3JtYXQiIiIKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfZm9y
bWF0LCBhX2J6cmRpciwgY29udHJvbF9maWxlcywgX3JldmlzaW9uX3N0b3JlLAogICAgICAgICAg
ICAgICAgICBjb250cm9sX3N0b3JlLCB0ZXh0X3N0b3JlKToKICAgICAgICAgS25pdFJlcG9zaXRv
cnkuX19pbml0X18oc2VsZiwgX2Zvcm1hdCwgYV9ienJkaXIsIGNvbnRyb2xfZmlsZXMsCkBAIC0x
MTMyLDYgKzExMzMsOSBAQAogICAgICAgICByZXR1cm4gUm9vdENvbW1pdEJ1aWxkZXIoc2VsZiwg
cGFyZW50cywgY29uZmlnLCB0aW1lc3RhbXAsIHRpbWV6b25lLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29tbWl0dGVyLCByZXZwcm9wcywgcmV2aXNpb25faWQpCiAKKyAgICBk
ZWYgZ2V0X3RhZ3Moc2VsZik6CisgICAgICAgIHJldHVybiBOb25lCisKIAogY2xhc3MgUmVwb3Np
dG9yeUZvcm1hdChvYmplY3QpOgogICAgICIiIkEgcmVwb3NpdG9yeSBmb3JtYXQuCkBAIC0xMjg2
LDYgKzEyOTAsMTAgQEAKICAgICAgICAgYXNzZXJ0IGtsYXNzLl9mb3JtYXRzW2Zvcm1hdC5nZXRf
Zm9ybWF0X3N0cmluZygpXSBpcyBmb3JtYXQKICAgICAgICAgZGVsIGtsYXNzLl9mb3JtYXRzW2Zv
cm1hdC5nZXRfZm9ybWF0X3N0cmluZygpXQogCisgICAgZGVmIHN1cHBvcnRzX3RhZ3Moc2VsZik6
CisgICAgICAgICIiIlRydWUgaWYgdGhpcyBmb3JtYXQgc3VwcG9ydHMgdGFncyBzdG9yZWQgaW4g
dGhlIHJlcG9zaXRvcnkiIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlICAjIGJ5IGRlZmF1bHQKKwog
CiBjbGFzcyBQcmVTcGxpdE91dFJlcG9zaXRvcnlGb3JtYXQoUmVwb3NpdG9yeUZvcm1hdCk6CiAg
ICAgIiIiQmFzZSBjbGFzcyBmb3IgdGhlIHByZSBzcGxpdCBvdXQgcmVwb3NpdG9yeSBmb3JtYXRz
LiIiIgpAQCAtMTc1MSw3ICsxNzU5LDcgQEAKICAgICAgLSBhbiBvcHRpb25hbCAnbm8td29ya2lu
Zy10cmVlcycgZmxhZwogICAgICAtIGEgTG9ja0RpciBsb2NrCiAgICAgIC0gU3VwcG9ydCBmb3Ig
cmVjb3JkaW5nIGZ1bGwgaW5mbyBhYm91dCB0aGUgdHJlZSByb290Ci0KKyAgICAgLSBBIHRhZyBk
aWN0aW9uYXJ5IHN0b3JlZCBpbiB0aGUgcmVwb3NpdG9yeSwgcG9pbnRpbmcgdG8gcmV2aXNpb25z
CiAgICAgIiIiCiAgICAgCiAgICAgcmljaF9yb290X2RhdGEgPSBUcnVlCkBAIC0xNzk1LDYgKzE4
MDMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfc3RvcmU9Y29u
dHJvbF9zdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3N0b3JlPXRl
eHRfc3RvcmUpCiAKKyAgICBkZWYgc3VwcG9ydHNfdGFncyhzZWxmKToKKyAgICAgICAgcmV0dXJu
IFRydWUKKwogCiAKICMgZm9ybWF0cyB3aGljaCBoYXZlIG5vIGZvcm1hdCBzdHJpbmcgYXJlIG5v
dCBkaXNjb3ZlcmFibGUKCg==

=== modified file bzrlib/tests/repository_implementations/__init__.py // encodi
... ng:base64
LS0tIGJ6cmxpYi90ZXN0cy9yZXBvc2l0b3J5X2ltcGxlbWVudGF0aW9ucy9fX2luaXRfXy5weQor
KysgYnpybGliL3Rlc3RzL3JlcG9zaXRvcnlfaW1wbGVtZW50YXRpb25zL19faW5pdF9fLnB5CkBA
IC00Niw2ICs0Niw3IEBACiAgICAgICAgICdienJsaWIudGVzdHMucmVwb3NpdG9yeV9pbXBsZW1l
bnRhdGlvbnMudGVzdF9yZWNvbmNpbGUnLAogICAgICAgICAnYnpybGliLnRlc3RzLnJlcG9zaXRv
cnlfaW1wbGVtZW50YXRpb25zLnRlc3RfcmVwb3NpdG9yeScsCiAgICAgICAgICdienJsaWIudGVz
dHMucmVwb3NpdG9yeV9pbXBsZW1lbnRhdGlvbnMudGVzdF9yZXZpc2lvbicsCisgICAgICAgICdi
enJsaWIudGVzdHMucmVwb3NpdG9yeV9pbXBsZW1lbnRhdGlvbnMudGVzdF90YWdzJywKICAgICAg
ICAgXQogICAgIGFkYXB0ZXIgPSBSZXBvc2l0b3J5VGVzdFByb3ZpZGVyQWRhcHRlcigKICAgICAg
ICAgZGVmYXVsdF90cmFuc3BvcnQsCgo=

=== modified file bzrlib/tests/repository_implementations/test_repository.py //
...  encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy9yZXBvc2l0b3J5X2ltcGxlbWVudGF0aW9ucy90ZXN0X3JlcG9zaXRv
cnkucHkKKysrIGJ6cmxpYi90ZXN0cy9yZXBvc2l0b3J5X2ltcGxlbWVudGF0aW9ucy90ZXN0X3Jl
cG9zaXRvcnkucHkKQEAgLTQzLDkgKzQzLDYgQEAKIAogY2xhc3MgVGVzdENhc2VXaXRoUmVwb3Np
dG9yeShUZXN0Q2FzZVdpdGhCenJEaXIpOgogCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAg
ICBzdXBlcihUZXN0Q2FzZVdpdGhSZXBvc2l0b3J5LCBzZWxmKS5zZXRVcCgpCi0KICAgICBkZWYg
bWFrZV9icmFuY2goc2VsZiwgcmVscGF0aCwgZm9ybWF0PU5vbmUpOgogICAgICAgICByZXBvID0g
c2VsZi5tYWtlX3JlcG9zaXRvcnkocmVscGF0aCwgZm9ybWF0PU5vbmUpCiAgICAgICAgIHJldHVy
biByZXBvLmJ6cmRpci5jcmVhdGVfYnJhbmNoKCkKCg==

=== modified directory  // last-changed:mbp at sourcefrog.net-20070114085612-q90lx
... 2g0firzu7z9
# revision id: mbp at sourcefrog.net-20070114085612-q90lx2g0firzu7z9
# sha1: 6ceaad16a8d92d187e1fc76ee215e6b5bae2795d
# inventory sha1: def3b859102da4a0d9d2c931fae80adec2196104
# parent ids:
#   pqm at pqm.ubuntu.com-20070103022432-334b367262bc7407
# properties:
#   branch-nick: tags

-- 
Martin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : https://lists.ubuntu.com/archives/bazaar/attachments/20070123/7107995b/attachment-0001.pgp 


More information about the bazaar mailing list