[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