[Pkg-bazaar-commits] ./bzr-svn/unstable r299: Merge actual final 0.4.8.

Jelmer Vernooij jelmer at samba.org
Fri Mar 21 22:12:33 UTC 2008


------------------------------------------------------------
revno: 299
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: debian
timestamp: Fri 2008-03-21 23:12:33 +0100
message:
  Merge actual final 0.4.8.
modified:
  Makefile
  NEWS
  fetch.py
  mapping.py
  repository.py
  tests/test_commit.py
  tests/test_push.py
  tests/test_repos.py
  tests/test_revids.py
    ------------------------------------------------------------
    revno: 220.1.182.1.258.1.218.1.34
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: 0.4.8
    timestamp: Fri 2008-03-21 14:10:49 +0100
    message:
      Cherrypick test symlink improvement.
    modified:
      Makefile
      tests/test_push.py
    ------------------------------------------------------------
    revno: 220.1.182.1.258.1.218.1.35
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: 0.4.8
    timestamp: Fri 2008-03-21 14:56:11 +0100
    message:
      Return tuples in parent determine functions.
    modified:
      repository.py
    ------------------------------------------------------------
    revno: 220.1.182.1.258.1.218.1.36
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: 0.4.8
    timestamp: Fri 2008-03-21 21:37:07 +0100
    message:
      Merge 0.4.
    modified:
      mapping.py
      tests/test_push.py
    ------------------------------------------------------------
    revno: 220.1.182.1.258.1.218.1.37
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: 0.4.8
    timestamp: Fri 2008-03-21 21:39:43 +0100
    message:
      Merge another test fix.
    modified:
      tests/test_push.py
    ------------------------------------------------------------
    revno: 220.1.182.1.258.1.218.1.38
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: 0.4.8
    timestamp: Fri 2008-03-21 22:28:52 +0100
    message:
      Fix more tests.
    modified:
      fetch.py
      tests/test_commit.py
      tests/test_repos.py
      tests/test_revids.py
    ------------------------------------------------------------
    revno: 220.1.182.1.258.1.218.1.39
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: 0.4.8
    timestamp: Fri 2008-03-21 23:08:45 +0100
    message:
      Fix remaining tests.
    modified:
      NEWS
      tests/test_push.py
      tests/test_repos.py
-------------- next part --------------
=== modified file 'Makefile'
--- a/Makefile	2008-03-12 16:12:05 +0000
+++ b/Makefile	2008-03-21 13:10:49 +0000
@@ -22,7 +22,7 @@
 	mkdir -p $@
 
 $(TMP_PLUGINS_DIR)/svn: $(TMP_PLUGINS_DIR)
-	ln -sf `pwd` $(TMP_PLUGINS_DIR)/svn
+	ln -sf $@ `pwd`
 
 check:: $(TMP_PLUGINS_DIR)/svn
 	BZR_PLUGIN_PATH=$(TMP_PLUGINS_DIR) $(BZR) selftest $(TEST_OPTIONS) $(TESTS)

=== modified file 'NEWS'
--- a/NEWS	2008-03-12 23:25:18 +0000
+++ b/NEWS	2008-03-21 22:12:33 +0000
@@ -1,4 +1,4 @@
-bzr-svn 0.4.8	2008-03-11
+bzr-svn 0.4.8	2008-03-21
 
   BUG FIXES
 

=== modified file 'fetch.py'
--- a/fetch.py	2008-02-01 15:24:05 +0000
+++ b/fetch.py	2008-03-21 22:12:33 +0000
@@ -102,7 +102,7 @@
                               self.scheme)
         self.dir_baserev = {}
         self._revinfo = None
-        self._bzr_merges = []
+        self._bzr_merges = ()
         self._svk_merges = []
         self._premature_deletes = set()
         self.pool = Pool()

=== modified file 'mapping.py'
--- a/mapping.py	2008-02-01 15:23:10 +0000
+++ b/mapping.py	2008-03-21 22:12:33 +0000
@@ -328,7 +328,6 @@
         return osutils.safe_file_id(ret)
 
 
-
 class BzrSvnMappingRegistry(registry.Registry):
     def register(self, key, factory, help):
         """Register a mapping between Bazaar and Subversion semantics.

=== modified file 'repository.py'
--- a/repository.py	2008-03-12 23:25:18 +0000
+++ b/repository.py	2008-03-21 22:12:33 +0000
@@ -52,6 +52,153 @@
 
 SVN_PROP_SVK_MERGE = 'svk:merge'
 
+# The following two functions don't use day names (which can vary by 
+# locale) unlike the alternatives in bzrlib.timestamp
+
+def format_highres_date(t, offset=0):
+    """Format a date, such that it includes higher precision in the
+    seconds field.
+
+    :param t:   The local time in fractional seconds since the epoch
+    :type t: float
+    :param offset:  The timezone offset in integer seconds
+    :type offset: int
+    """
+    assert isinstance(t, float)
+
+    # This has to be formatted for "original" date, so that the
+    # revision XML entry will be reproduced faithfully.
+    if offset is None:
+        offset = 0
+    tt = time.gmtime(t + offset)
+
+    return (time.strftime("%Y-%m-%d %H:%M:%S", tt)
+            # Get the high-res seconds, but ignore the 0
+            + ('%.9f' % (t - int(t)))[1:]
+            + ' %+03d%02d' % (offset / 3600, (offset / 60) % 60))
+
+
+def unpack_highres_date(date):
+    """This takes the high-resolution date stamp, and
+    converts it back into the tuple (timestamp, timezone)
+    Where timestamp is in real UTC since epoch seconds, and timezone is an
+    integer number of seconds offset.
+
+    :param date: A date formated by format_highres_date
+    :type date: string
+    """
+    # skip day if applicable
+    if not date[0].isdigit():
+        space_loc = date.find(' ')
+        if space_loc == -1:
+            raise ValueError("No valid date: %r" % date)
+        date = date[space_loc+1:]
+    # Up until the first period is a datestamp that is generated
+    # as normal from time.strftime, so use time.strptime to
+    # parse it
+    dot_loc = date.find('.')
+    if dot_loc == -1:
+        raise ValueError(
+            'Date string does not contain high-precision seconds: %r' % date)
+    base_time = time.strptime(date[:dot_loc], "%Y-%m-%d %H:%M:%S")
+    fract_seconds, offset = date[dot_loc:].split()
+    fract_seconds = float(fract_seconds)
+
+    offset = int(offset)
+
+    hours = int(offset / 100)
+    minutes = (offset % 100)
+    seconds_offset = (hours * 3600) + (minutes * 60)
+
+    # time.mktime returns localtime, but calendar.timegm returns UTC time
+    timestamp = calendar.timegm(base_time)
+    timestamp -= seconds_offset
+    # Add back in the fractional seconds
+    timestamp += fract_seconds
+    return (timestamp, seconds_offset)
+
+
+def parse_merge_property(line):
+    """Parse a bzr:merge property value.
+
+    :param line: Line to parse
+    :return: List of revisions merged
+    """
+    if ' ' in line:
+        mutter('invalid revision id %r in merged property, skipping' % line)
+        return ()
+
+    return tuple(filter(lambda x: x != "", line.split("\t")))
+
+
+def parse_revid_property(line):
+    """Parse a (revnum, revid) tuple as set in revision id properties.
+    :param line: line to parse
+    :return: tuple with (bzr_revno, revid)
+    """
+    if '\n' in line:
+        raise errors.InvalidPropertyValue(SVN_PROP_BZR_REVISION_ID, 
+                "newline in revision id property line")
+    try:
+        (revno, revid) = line.split(' ', 1)
+    except ValueError:
+        raise errors.InvalidPropertyValue(SVN_PROP_BZR_REVISION_ID, 
+                "missing space")
+    if revid == "":
+        raise errors.InvalidPropertyValue(SVN_PROP_BZR_REVISION_ID,
+                "empty revision id")
+    return (int(revno), revid)
+
+
+def parse_revision_metadata(text, rev):
+    """Parse a revision info text (as set in bzr:revision-info).
+
+    :param text: text to parse
+    :param rev: Revision object to apply read parameters to
+    """
+    in_properties = False
+    for l in text.splitlines():
+        try:
+            key, value = l.split(": ", 2)
+        except ValueError:
+            raise errors.InvalidPropertyValue(SVN_PROP_BZR_REVISION_INFO, 
+                    "Missing : in revision metadata")
+        if key == "committer":
+            rev.committer = value.decode("utf-8")
+        elif key == "timestamp":
+            (rev.timestamp, rev.timezone) = unpack_highres_date(value)
+        elif key == "properties":
+            in_properties = True
+        elif key[0] == "\t" and in_properties:
+            rev.properties[str(key[1:])] = value.decode("utf-8")
+        else:
+            raise errors.InvalidPropertyValue(SVN_PROP_BZR_REVISION_INFO, 
+                    "Invalid key %r" % key)
+
+
+def generate_revision_metadata(timestamp, timezone, committer, revprops):
+    """Generate revision metadata text for the specified revision 
+    properties.
+
+    :param timestamp: timestamp of the revision, in seconds since epoch
+    :param timezone: timezone, specified by offset from GMT in seconds
+    :param committer: name/email of the committer
+    :param revprops: dictionary with custom revision properties
+    :return: text with data to set bzr:revision-info to.
+    """
+    assert timestamp is None or isinstance(timestamp, float)
+    text = ""
+    if timestamp is not None:
+        text += "timestamp: %s\n" % format_highres_date(timestamp, timezone) 
+    if committer is not None:
+        text += "committer: %s\n" % committer
+    if revprops is not None and revprops != {}:
+        text += "properties: \n"
+        for k, v in sorted(revprops.items()):
+            text += "\t%s: %s\n" % (k, v)
+    return text
+
+
 def parse_svk_feature(feature):
     """Parse a svk feature identifier.
 
@@ -416,7 +563,7 @@
         change = self.branchprop_list.get_property_diff(branch, revnum, 
                                 SVN_PROP_BZR_ANCESTRY+str(scheme)).splitlines()
         if len(change) == 0:
-            return []
+            return ()
 
         assert len(change) == 1
 
@@ -476,11 +623,11 @@
 
     def revision_parents(self, revision_id, bzr_merges=None, svk_merges=None):
         """See Repository.revision_parents()."""
-        parent_ids = []
+        parent_ids = ()
         (branch, revnum, scheme) = self.lookup_revision_id(revision_id)
         mainline_parent = self._mainline_revision_parent(branch, revnum, scheme)
         if mainline_parent is not None:
-            parent_ids.append(mainline_parent)
+            parent_ids += (mainline_parent,)
 
         # if the branch didn't change, bzr:merge or svk:merge can't have changed
         if not self._log.touches_path(branch, revnum):
@@ -491,11 +638,11 @@
         if svk_merges is None:
             svk_merges = self._svk_merged_revisions(branch, revnum, scheme)
 
-        parent_ids.extend(bzr_merges)
+        parent_ids += bzr_merges
 
-        if bzr_merges == []:
+        if bzr_merges == ():
             # Commit was doing using svk apparently
-            parent_ids.extend(svk_merges)
+            parent_ids += tuple(svk_merges)
 
         return parent_ids
 

=== modified file 'tests/test_commit.py'
--- a/tests/test_commit.py	2008-03-12 23:25:18 +0000
+++ b/tests/test_commit.py	2008-03-21 22:12:33 +0000
@@ -131,7 +131,7 @@
         wt.commit(message="data")
         self.assertEqual("some-ghost-revision\n", 
                 self.client_get_prop(repos_url, "bzr:ancestry:v3-none", 1))
-        self.assertEqual([wt.branch.generate_revision_id(0), "some-ghost-revision"],
+        self.assertEqual((wt.branch.generate_revision_id(0), "some-ghost-revision"),
                          wt.branch.repository.revision_parents(
                              wt.branch.last_revision()))
 

=== modified file 'tests/test_push.py'
--- a/tests/test_push.py	2008-03-11 19:36:59 +0000
+++ b/tests/test_push.py	2008-03-21 22:08:45 +0000
@@ -634,6 +634,9 @@
         check(copybranch)
 
     def test_push_non_lhs_parent(self):        
+        from bzrlib.debug import debug_flags
+        debug_flags.add("commit")
+        debug_flags.add("fetch")
         repos_url = self.make_client("a", "dc")
         bzrwt = BzrDir.create_standalone_workingtree("c", 
             format=format.get_rich_root_format())
@@ -731,11 +734,15 @@
         # Merge 
         self.build_tree({'c/registry/generic.c': "DE"})
         bzrwt.add_pending_merge(merge_revid)
+        self.assertEquals(bzrwt.get_parent_ids()[1], merge_revid)
         revid2 = bzrwt.commit("Merge something", rev_id="mergerevid")
-
+        bzr_parents = bzrwt.branch.repository.get_revision(revid2).parent_ids
         trunk = Branch.open(repos_url + "/trunk")
         trunk.pull(bzrwt.branch)
 
+        self.assertEquals(tuple(bzr_parents), 
+                trunk.repository.revision_parents(revid2))
+
         self.assertEquals([revid1, revid2], trunk.revision_history())
         self.client_update("dc")
         self.assertEquals(

=== modified file 'tests/test_repos.py'
--- a/tests/test_repos.py	2008-03-12 23:25:18 +0000
+++ b/tests/test_repos.py	2008-03-21 22:12:33 +0000
@@ -485,14 +485,13 @@
         self.build_tree({'dc/foo': "data2"})
         self.client_commit("dc", "Second Message")
         repository = Repository.open("svn+%s" % repos_url)
-        self.assertEqual([],
+        self.assertEqual((),
                 repository.revision_parents(
                     repository.generate_revision_id(0, "", "none")))
-        self.assertEqual([repository.generate_revision_id(0, "", "none")],
+        self.assertEqual((repository.generate_revision_id(0, "", "none"),),
                 repository.revision_parents(
                     repository.generate_revision_id(1, "", "none")))
-        self.assertEqual([
-            repository.generate_revision_id(1, "", "none")],
+        self.assertEqual((repository.generate_revision_id(1, "", "none"),),
             repository.revision_parents(
                 repository.generate_revision_id(2, "", "none")))
 
@@ -518,14 +517,14 @@
         self.client_set_prop("dc", "bzr:ancestry:v3-none", "ghostparent\n")
         self.client_commit("dc", "Second Message")
         repository = Repository.open("svn+%s" % repos_url)
-        self.assertEqual([],
+        self.assertEqual((),
                 repository.revision_parents(
                     repository.generate_revision_id(0, "", "none")))
-        self.assertEqual([repository.generate_revision_id(0, "", "none")],
+        self.assertEqual((repository.generate_revision_id(0, "", "none"),),
                 repository.revision_parents(
                     repository.generate_revision_id(1, "", "none")))
-        self.assertEqual([repository.generate_revision_id(1, "", "none"),
-            "ghostparent"], 
+        self.assertEqual((repository.generate_revision_id(1, "", "none"),
+            "ghostparent"), 
                 repository.revision_parents(
                     repository.generate_revision_id(2, "", "none")))
  
@@ -541,8 +540,8 @@
         self.client_set_prop("dc/trunk", "svk:merge", 
             "%s:/branches/foo:1\n" % repository.uuid)
         self.client_commit("dc", "Second Message")
-        self.assertEqual([repository.generate_revision_id(1, "trunk", "trunk0"),
-            repository.generate_revision_id(1, "branches/foo", "trunk0")], 
+        self.assertEqual((repository.generate_revision_id(1, "trunk", "trunk0"),
+            repository.generate_revision_id(1, "branches/foo", "trunk0")), 
                 repository.revision_parents(
                     repository.generate_revision_id(2, "trunk", "trunk0")))
  
@@ -561,7 +560,7 @@
         repository = Repository.open("svn+%s" % repos_url)
         rev = repository.get_revision(
             repository.generate_revision_id(2, "", "none"))
-        self.assertEqual([repository.generate_revision_id(1, "", "none")],
+        self.assertEqual((repository.generate_revision_id(1, "", "none"),),
                 rev.parent_ids)
         self.assertEqual(rev.revision_id, 
                 repository.generate_revision_id(2, "", "none"))
@@ -583,7 +582,7 @@
         repository = Repository.open("svn+%s" % repos_url)
         revid = default_mapping.generate_revision_id(repository.uuid, 2, "", "none")
         rev = repository.get_revision("myrevid")
-        self.assertEqual([repository.generate_revision_id(1, "", "none")],
+        self.assertEqual((repository.generate_revision_id(1, "", "none"),),
                 rev.parent_ids)
         self.assertEqual(rev.revision_id, 
                          repository.generate_revision_id(2, "", "none"))
@@ -722,7 +721,7 @@
         self.assertEqual({
             repository.generate_revision_id(0, "", "none"): [],
             repository.generate_revision_id(1, "", "none"): [
-                repository.generate_revision_id(0, "", "none")
+                repository.generate_revision_id(0, "", "none"),
                 ]},
                 repository.get_revision_graph(
                     repository.generate_revision_id(1, "", "none")))
@@ -1144,12 +1143,12 @@
         self.assertEqual(self.inventory, self.tree.inventory)
 
     def test_get_parent_ids(self):
-        self.assertEqual([self.repos.generate_revision_id(0, "", "none")], self.tree.get_parent_ids())
+        self.assertEqual((self.repos.generate_revision_id(0, "", "none"),), self.tree.get_parent_ids())
 
     def test_get_parent_ids_zero(self):
         tree = self.repos.revision_tree(
                 self.repos.generate_revision_id(0, "", "none"))
-        self.assertEqual([], tree.get_parent_ids())
+        self.assertEqual((), tree.get_parent_ids())
 
     def test_get_revision_id(self):
         self.assertEqual(self.repos.generate_revision_id(1, "", "none"),

=== modified file 'tests/test_revids.py'
--- a/tests/test_revids.py	2008-02-01 13:22:16 +0000
+++ b/tests/test_revids.py	2008-03-21 22:12:33 +0000
@@ -139,4 +139,12 @@
         self.assertEqual("auuid:/:6", 
               revision_id_to_svk_feature("svn-v%d-undefined:auuid::6" % MAPPING_VERSION))
 
+    def test_parse_merge_space(self):
+        self.assertEqual((), parse_merge_property("bla bla"))
+
+    def test_parse_merge_empty(self):
+        self.assertEqual((), parse_merge_property(""))
+
+    def test_parse_merge_simple(self):
+        self.assertEqual(("bla", "bloe"), parse_merge_property("bla\tbloe"))
 



More information about the Pkg-bazaar-commits mailing list