Rev 6500: Try merging 2.4 into 2.5 and resolving the conflicts. in http://bazaar.launchpad.net/~jameinel/2.5/work/2.4-into-2.5
John Arbash Meinel
john at arbash-meinel.com
Sun May 19 13:38:17 UTC 2013
At http://bazaar.launchpad.net/~jameinel/2.5/work/2.4-into-2.5
------------------------------------------------------------
revno: 6500 [merge]
revision-id: john at arbash-meinel.com-20130519133807-69kfoe85gw2va4y2
parent: pqm at pqm.ubuntu.com-20120430120355-6p7y3j6trxi9mpdv
parent: pqm at pqm.ubuntu.com-20121106185552-58jmp21g8cxqsy16
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 2.4-into-2.5
timestamp: Sun 2013-05-19 14:38:07 +0100
message:
Try merging 2.4 into 2.5 and resolving the conflicts.
modified:
INSTALL INSTALL-20051019070340-4b27f2fb240c7943
bzrlib/_walkdirs_win32.pyx _walkdirs_win32.pyx-20080716220454-kweh3tgxez5dvw2l-2
bzrlib/btree_index.py index.py-20080624222253-p0x5f92uyh5hw734-7
bzrlib/builtins.py builtins.py-20050830033751-fc01482b9ca23183
bzrlib/bzrdir.py bzrdir.py-20060131065624-156dfea39c4387cb
bzrlib/tests/__init__.py selftest.py-20050531073622-8d0e3c8845c97a64
bzrlib/tests/blackbox/test_testament.py test_testament.py-20060816161839-snq405g3jk15gpax-1
bzrlib/tests/test__walkdirs_win32.py test__walkdirs_win32-20080716220454-kweh3tgxez5dvw2l-3
bzrlib/tests/test_bzrdir.py test_bzrdir.py-20060131065654-deba40eef51cf220
bzrlib/tests/test_selftest.py test_selftest.py-20051202044319-c110a115d8c0456a
doc/developers/code-style.txt codestyle.txt-20100515105711-133ealf7ereiq2eq-1
doc/en/admin-guide/introduction.txt introduction.txt-20091205144603-lgpl0e0z6lzk2rdw-7
doc/en/release-notes/bzr-2.4.txt bzr2.4.txt-20110114053217-k7ym9jfz243fddjm-1
-------------- next part --------------
=== modified file 'INSTALL'
--- a/INSTALL 2010-06-02 05:03:31 +0000
+++ b/INSTALL 2012-08-30 20:36:18 +0000
@@ -4,9 +4,7 @@
Dependencies
------------
-bzr requires Python2.4 and cElementTree:
-
- http://effbot.org/zone/element-index.htm
+bzr requires Python 2.6 or newer.
If you wish to access branches over sftp, you will need paramiko and
pycrypto:
=== modified file 'bzrlib/_walkdirs_win32.pyx'
--- a/bzrlib/_walkdirs_win32.pyx 2011-04-05 12:15:34 +0000
+++ b/bzrlib/_walkdirs_win32.pyx 2012-03-29 08:34:13 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2008-2011 Canonical Ltd
+# Copyright (C) 2008-2012 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
@@ -95,8 +95,19 @@
return self._st_size
# os.stat always returns 0, so we hard code it here
- cdef readonly int st_dev
- cdef readonly int st_ino
+ property st_dev:
+ def __get__(self):
+ return 0
+ property st_ino:
+ def __get__(self):
+ return 0
+ # st_uid and st_gid required for some external tools like bzr-git & dulwich
+ property st_uid:
+ def __get__(self):
+ return 0
+ property st_gid:
+ def __get__(self):
+ return 0
def __repr__(self):
"""Repr is the same as a Stat object.
@@ -195,8 +206,6 @@
statvalue.st_mtime = _ftime_to_timestamp(&data.ftLastWriteTime)
statvalue.st_atime = _ftime_to_timestamp(&data.ftLastAccessTime)
statvalue._st_size = _get_size(data)
- statvalue.st_ino = 0
- statvalue.st_dev = 0
return statvalue
def read_dir(self, prefix, top):
@@ -288,6 +297,4 @@
statvalue.st_mtime = st.st_mtime
statvalue.st_atime = st.st_atime
statvalue._st_size = st.st_size
- statvalue.st_ino = 0
- statvalue.st_dev = 0
return statvalue
=== modified file 'bzrlib/btree_index.py'
--- a/bzrlib/btree_index.py 2011-12-19 13:23:58 +0000
+++ b/bzrlib/btree_index.py 2013-05-19 13:38:07 +0000
@@ -298,6 +298,7 @@
"""
new_leaf = False
if rows[-1].writer is None:
+ new_leaf = True
# opening a new leaf chunk;
new_leaf = True
for pos, internal_row in enumerate(rows[:-1]):
@@ -324,10 +325,9 @@
optimize_for_size=self._optimize_for_size)
rows[-1].writer.write(_LEAF_FLAG)
if rows[-1].writer.write(line):
- # if we failed to write, despite having an empty page to write to,
- # then line is too big. raising the error avoids infinite recursion
- # searching for a suitably large page that will not be found.
if new_leaf:
+ # We just created this leaf, and now the line doesn't fit.
+ # Clearly it will never fit, so punt.
raise errors.BadIndexKey(string_key)
# this key did not fit in the node:
rows[-1].finish_node()
=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py 2012-02-16 16:42:43 +0000
+++ b/bzrlib/builtins.py 2013-05-19 13:38:07 +0000
@@ -5096,6 +5096,7 @@
Option('strict',
help='Produce a strict-format testament.')]
takes_args = ['branch?']
+ encoding_type = 'exact'
@display_command
def run(self, branch=u'.', revision=None, long=False, strict=False):
from bzrlib.testament import Testament, StrictTestament
@@ -5114,9 +5115,9 @@
rev_id = revision[0].as_revision_id(b)
t = testament_class.from_revision(b.repository, rev_id)
if long:
- sys.stdout.writelines(t.as_text_lines())
+ self.outf.writelines(t.as_text_lines())
else:
- sys.stdout.write(t.as_short_text())
+ self.outf.write(t.as_short_text())
class cmd_annotate(Command):
=== modified file 'bzrlib/bzrdir.py'
--- a/bzrlib/bzrdir.py 2012-01-31 15:43:17 +0000
+++ b/bzrlib/bzrdir.py 2013-05-19 13:38:07 +0000
@@ -77,6 +77,39 @@
)
+# Note: jam 20130519 This function was added in 2.4 as part of
+# 6068 Patch Queue Manager 2012-03-27 [merge]
+# (jelmer) Add support for feature flags. (Jelmer Vernooij)
+#
+# However, it doesn't seem to be needed or called in 2.5, which has
+# different support for how it handles feature flags in format strings.
+# It might be prudent to remove it to avoid confusion.
+def extract_format_string(text):
+ """Read a format string from a file.
+
+ The first line is returned. The other lines can contain
+ optional features. An exception is raised when a
+ required feature is present.
+ """
+ lines = text.splitlines(True)
+ try:
+ firstline = lines.pop(0)
+ except IndexError:
+ raise errors.UnknownFormatError(format=text, kind='')
+ for lineno, line in enumerate(lines):
+ try:
+ (necessity, feature) = line.split(" ", 1)
+ except ValueError:
+ raise errors.ParseFormatError(lineno=lineno+2,
+ line=line, text=text)
+ else:
+ if necessity == "optional":
+ mutter("Ignoring optional feature %s", feature)
+ else:
+ raise errors.MissingFeature(feature)
+ return firstline
+
+
class BzrDir(controldir.ControlDir):
"""A .bzr control diretory.
=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py 2012-04-30 09:50:33 +0000
+++ b/bzrlib/tests/__init__.py 2013-05-19 13:38:07 +0000
@@ -1782,9 +1782,15 @@
:returns: The actual attr value.
"""
- value = getattr(obj, attr_name)
# The actual value is captured by the call below
- self.addCleanup(setattr, obj, attr_name, value)
+ value = getattr(obj, attr_name, _unitialized_attr)
+ if value is _unitialized_attr:
+ # When the test completes, the attribute should not exist, but if
+ # we aren't setting a value, we don't need to do anything.
+ if new is not _unitialized_attr:
+ self.addCleanup(delattr, obj, attr_name)
+ else:
+ self.addCleanup(setattr, obj, attr_name, value)
if new is not _unitialized_attr:
setattr(obj, attr_name, new)
return value
=== modified file 'bzrlib/tests/blackbox/test_testament.py'
--- a/bzrlib/tests/blackbox/test_testament.py 2009-03-23 14:59:43 +0000
+++ b/bzrlib/tests/blackbox/test_testament.py 2012-06-08 06:59:50 +0000
@@ -16,8 +16,10 @@
"""Blackbox tests for the 'bzr testament' command"""
+import re
from bzrlib.tests.test_testament import (
+ osutils,
REV_1_SHORT,
REV_1_SHORT_STRICT,
REV_2_TESTAMENT,
@@ -46,3 +48,12 @@
self.assertEqualDiff(err, '')
self.assertEqualDiff(out, REV_1_SHORT_STRICT)
+ def test_testament_non_ascii(self):
+ self.wt.commit(u"Non \xe5ssci message")
+ long_out, err = self.run_bzr('testament --long')
+ self.assertEqualDiff(err, '')
+ short_out, err = self.run_bzr('testament')
+ self.assertEqualDiff(err, '')
+ sha1_re = re.compile('sha1: (?P<sha1>[a-f0-9]+)$', re.M)
+ sha1 = sha1_re.search(short_out).group('sha1')
+ self.assertEqual(sha1, osutils.sha_string(long_out))
=== modified file 'bzrlib/tests/test__walkdirs_win32.py'
--- a/bzrlib/tests/test__walkdirs_win32.py 2011-06-14 01:26:41 +0000
+++ b/bzrlib/tests/test__walkdirs_win32.py 2013-05-19 13:38:07 +0000
@@ -96,3 +96,22 @@
self.assertEqual(errno.ENOENT, e.errno)
self.assertEqual(3, e.winerror)
self.assertEqual((3, u'no_such_dir/*'), e.args)
+
+
+class Test_Win32Stat(tests.TestCaseInTempDir):
+
+ _test_needs_features = [win32_readdir_feature]
+
+ def setUp(self):
+ super(Test_Win32Stat, self).setUp()
+ from bzrlib._walkdirs_win32 import lstat
+ self.win32_lstat = lstat
+
+ def test_zero_members_present(self):
+ self.build_tree(['foo'])
+ st = self.win32_lstat('foo')
+ # we only want to ensure that some members are present
+ self.assertEqual(0, st.st_dev)
+ self.assertEqual(0, st.st_ino)
+ self.assertEqual(0, st.st_uid)
+ self.assertEqual(0, st.st_gid)
=== modified file 'bzrlib/tests/test_bzrdir.py'
--- a/bzrlib/tests/test_bzrdir.py 2012-01-28 00:41:30 +0000
+++ b/bzrlib/tests/test_bzrdir.py 2013-05-19 13:38:07 +0000
@@ -1575,3 +1575,25 @@
# spaces are not allowed in feature names
self.assertRaises(ValueError, SampleBzrFormat.register_feature,
"nested trees")
+
+
+class ExtractFormatStringTests(TestCase):
+
+ def test_normal(self):
+ self.assertEquals("Bazaar-NG branch, format 0.0.4\n",
+ bzrdir.extract_format_string("Bazaar-NG branch, format 0.0.4\n"))
+
+ def test_with_optional_feature(self):
+ self.assertEquals("Bazaar-NG branch, format 0.0.4\n",
+ bzrdir.extract_format_string("Bazaar-NG branch, format 0.0.4\n"
+ "optional feature foo\n"))
+
+ def test_with_required_feature(self):
+ self.assertRaises(errors.MissingFeature,
+ bzrdir.extract_format_string, "Bazaar-NG branch, format 0.0.4\n"
+ "required feature foo\n")
+
+ def test_with_invalid_line(self):
+ self.assertRaises(errors.ParseFormatError,
+ bzrdir.extract_format_string, "Bazaar-NG branch, format 0.0.4\n"
+ "requiredfoo\n")
=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py 2011-11-08 17:07:23 +0000
+++ b/bzrlib/tests/test_selftest.py 2013-05-19 13:38:07 +0000
@@ -1623,6 +1623,12 @@
self.assertRaises(AssertionError,
self.assertListRaises, _TestException, success_generator)
+ def _run_successful_test(self, test):
+ result = testtools.TestResult()
+ test.run(result)
+ self.assertTrue(result.wasSuccessful())
+ return result
+
def test_overrideAttr_without_value(self):
self.test_attr = 'original' # Define a test attribute
obj = self # Make 'obj' visible to the embedded test
@@ -1638,8 +1644,7 @@
obj.test_attr = 'modified'
self.assertEqual('modified', obj.test_attr)
- test = Test('test_value')
- test.run(unittest.TestResult())
+ self._run_successful_test(Test('test_value'))
self.assertEqual('original', obj.test_attr)
def test_overrideAttr_with_value(self):
@@ -1655,10 +1660,41 @@
self.assertEqual('original', self.orig)
self.assertEqual('modified', obj.test_attr)
- test = Test('test_value')
- test.run(unittest.TestResult())
+ self._run_successful_test(Test('test_value'))
self.assertEqual('original', obj.test_attr)
+ def test_overrideAttr_with_no_existing_value_and_value(self):
+ # Do not define the test_attribute
+ obj = self # Make 'obj' visible to the embedded test
+ class Test(tests.TestCase):
+
+ def setUp(self):
+ tests.TestCase.setUp(self)
+ self.orig = self.overrideAttr(obj, 'test_attr', new='modified')
+
+ def test_value(self):
+ self.assertEqual(tests._unitialized_attr, self.orig)
+ self.assertEqual('modified', obj.test_attr)
+
+ self._run_successful_test(Test('test_value'))
+ self.assertRaises(AttributeError, getattr, obj, 'test_attr')
+
+ def test_overrideAttr_with_no_existing_value_and_no_value(self):
+ # Do not define the test_attribute
+ obj = self # Make 'obj' visible to the embedded test
+ class Test(tests.TestCase):
+
+ def setUp(self):
+ tests.TestCase.setUp(self)
+ self.orig = self.overrideAttr(obj, 'test_attr')
+
+ def test_value(self):
+ self.assertEqual(tests._unitialized_attr, self.orig)
+ self.assertRaises(AttributeError, getattr, obj, 'test_attr')
+
+ self._run_successful_test(Test('test_value'))
+ self.assertRaises(AttributeError, getattr, obj, 'test_attr')
+
def test_recordCalls(self):
from bzrlib.tests import test_selftest
calls = self.recordCalls(
=== modified file 'doc/developers/code-style.txt'
--- a/doc/developers/code-style.txt 2011-06-28 21:45:01 +0000
+++ b/doc/developers/code-style.txt 2012-08-30 21:54:35 +0000
@@ -77,20 +77,11 @@
Python versions
===============
-Bazaar supports Python from 2.4 through 2.6, and in the future we want to
-support Python 2.7 and 3.0. Avoid using language features added in 2.5,
-2.6 or 2.7, or features deprecated in Python 3.0. (You can check v3
+Bazaar supports Python from 2.6 through 2.7, and in the future we want to
+support Python 3. Avoid using language features added in
+2.7, or features deprecated in Python 3.0. (You can check v3
compatibility using the ``-3`` option of Python2.6.)
-Specifically:
-
-* Don't use the ``with`` statement.
-
-* Don't ``from . import``.
-
-* Don't use ``try/except/finally``, which is not supported in Python2.4,
- use separate nested ``try/except`` and ``try/finally`` blocks.
-
hasattr and getattr
===================
=== modified file 'doc/en/admin-guide/introduction.txt'
--- a/doc/en/admin-guide/introduction.txt 2010-06-02 05:03:31 +0000
+++ b/doc/en/admin-guide/introduction.txt 2012-08-30 21:21:38 +0000
@@ -31,13 +31,12 @@
environments. For the purposes of this document, we will consider Mac OS X as
a type of Unix.
-In general, Bazaar requires only Python_ 2.4 or greater and the cElementTree_
-package (included in Python 2.5 and later) to run. If you would *optionally*
+In general, Bazaar requires only Python_ 2.6 or greater to run.
+If you would *optionally*
like to be able to access branches using SFTP, you need `paramiko and
pycrypto`_.
.. _Python: http://www.python.org/
-.. _cElementTree: http://effbot.org/zone/element-index.htm
.. _paramiko and pycrypto: http://www.lag.net/paramiko/
For maximum performance, Bazaar can make use of compiled versions of some
=== modified file 'doc/en/release-notes/bzr-2.4.txt'
--- a/doc/en/release-notes/bzr-2.4.txt 2012-02-27 13:07:18 +0000
+++ b/doc/en/release-notes/bzr-2.4.txt 2013-05-19 13:38:07 +0000
@@ -55,6 +55,14 @@
* Prevent a traceback being printed to stderr when logging has problems and
accept utf-8 byte string without breaking. (Martin Packman, #714449)
+* Use ``encoding_type='exact'`` for ``bzr testament`` so that on Windows
+ the sha hash of the long testament matches the sha hash in the short
+ form. (John Arbash Meinel, #1010339)
+
+* _Win32Stat object provides members st_uid and st_gid, those are present
+ in Python's os.stat object. These members required for external tools like
+ bzr-git and dulwich. (Alexander Belchenko, #967060)
+
Documentation
*************
More information about the bazaar-commits
mailing list