Merge lp:~jameinel/bzr/integration into lp:bzr
- integration
- Merge into bzr.dev
Proposed by
John A Meinel
Status: | Merged |
---|---|
Approved by: | John A Meinel |
Approved revision: | no longer in the source branch. |
Merged at revision: | 6575 |
Proposed branch: | lp:~jameinel/bzr/integration |
Merge into: | lp:bzr |
Diff against target: |
308 lines (+142/-16) 8 files modified
bzrlib/dirstate.py (+10/-7) bzrlib/osutils.py (+14/-1) bzrlib/tests/__init__.py (+8/-2) bzrlib/tests/test_osutils.py (+44/-0) bzrlib/tests/test_selftest.py (+40/-4) doc/en/release-notes/bzr-2.4.txt (+8/-0) doc/en/release-notes/bzr-2.5.txt (+8/-0) doc/en/release-notes/bzr-2.6.txt (+10/-2) |
To merge this branch: | bzr merge lp:~jameinel/bzr/integration |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Richard Wilbur | Needs Fixing | ||
Review via email: mp+165333@code.launchpad.net |
Commit message
Merge bzr/2.5 into trunk.
Description of the change
Merge bzr/2.5 into trunk.
To post a comment you must log in.
Revision history for this message
John A Meinel (jameinel) wrote : | # |
Revision history for this message
Richard Wilbur (richard-wilbur) wrote : | # |
I like the changes. It seems that, at least for trunk, we might consider moving the trace.mutter from
bzrlib/
66 + trace.mutter(
67 + if getattr(e, 'errno', None) not in _fdatasync_ignored:
68 + raise
into an 'else' of the test on line 67, since only in that case are we actually ignoring the error. Something like the following:
66 + if getattr(e, 'errno', None) not in _fdatasync_ignored:
67 + raise
68 + else:
69 + trace.mutter(
review:
Needs Fixing
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'bzrlib/dirstate.py' | |||
2 | --- bzrlib/dirstate.py 2012-01-24 01:35:56 +0000 | |||
3 | +++ bzrlib/dirstate.py 2013-05-23 10:07:40 +0000 | |||
4 | @@ -2566,13 +2566,6 @@ | |||
5 | 2566 | self.update_minimal(('', '', new_id), 'd', | 2566 | self.update_minimal(('', '', new_id), 'd', |
6 | 2567 | path_utf8='', packed_stat=entry[1][0][4]) | 2567 | path_utf8='', packed_stat=entry[1][0][4]) |
7 | 2568 | self._mark_modified() | 2568 | self._mark_modified() |
8 | 2569 | # XXX: This was added by Ian, we need to make sure there | ||
9 | 2570 | # are tests for it, because it isn't in bzr.dev TRUNK | ||
10 | 2571 | # It looks like the only place it is called is in setting the root | ||
11 | 2572 | # id of the tree. So probably we never had an _id_index when we | ||
12 | 2573 | # don't even have a root yet. | ||
13 | 2574 | if self._id_index is not None: | ||
14 | 2575 | self._add_to_id_index(self._id_index, entry[0]) | ||
15 | 2576 | 2569 | ||
16 | 2577 | def set_parent_trees(self, trees, ghosts): | 2570 | def set_parent_trees(self, trees, ghosts): |
17 | 2578 | """Set the parent trees for the dirstate. | 2571 | """Set the parent trees for the dirstate. |
18 | @@ -3285,10 +3278,20 @@ | |||
19 | 3285 | if self._id_index is not None: | 3278 | if self._id_index is not None: |
20 | 3286 | for file_id, entry_keys in self._id_index.iteritems(): | 3279 | for file_id, entry_keys in self._id_index.iteritems(): |
21 | 3287 | for entry_key in entry_keys: | 3280 | for entry_key in entry_keys: |
22 | 3281 | # Check that the entry in the map is pointing to the same | ||
23 | 3282 | # file_id | ||
24 | 3288 | if entry_key[2] != file_id: | 3283 | if entry_key[2] != file_id: |
25 | 3289 | raise AssertionError( | 3284 | raise AssertionError( |
26 | 3290 | 'file_id %r did not match entry key %s' | 3285 | 'file_id %r did not match entry key %s' |
27 | 3291 | % (file_id, entry_key)) | 3286 | % (file_id, entry_key)) |
28 | 3287 | # And that from this entry key, we can look up the original | ||
29 | 3288 | # record | ||
30 | 3289 | block_index, present = self._find_block_index_from_key(entry_key) | ||
31 | 3290 | if not present: | ||
32 | 3291 | raise AssertionError('missing block for entry key: %r', entry_key) | ||
33 | 3292 | entry_index, present = self._find_entry_index(entry_key, self._dirblocks[block_index][1]) | ||
34 | 3293 | if not present: | ||
35 | 3294 | raise AssertionError('missing entry for key: %r', entry_key) | ||
36 | 3292 | if len(entry_keys) != len(set(entry_keys)): | 3295 | if len(entry_keys) != len(set(entry_keys)): |
37 | 3293 | raise AssertionError( | 3296 | raise AssertionError( |
38 | 3294 | 'id_index contained non-unique data for %s' | 3297 | 'id_index contained non-unique data for %s' |
39 | 3295 | 3298 | ||
40 | === modified file 'bzrlib/osutils.py' | |||
41 | --- bzrlib/osutils.py 2012-09-19 07:58:27 +0000 | |||
42 | +++ bzrlib/osutils.py 2013-05-23 10:07:40 +0000 | |||
43 | @@ -2554,6 +2554,10 @@ | |||
44 | 2554 | else: | 2554 | else: |
45 | 2555 | is_local_pid_dead = _posix_is_local_pid_dead | 2555 | is_local_pid_dead = _posix_is_local_pid_dead |
46 | 2556 | 2556 | ||
47 | 2557 | _maybe_ignored = ['EAGAIN', 'EINTR', 'ENOTSUP', 'EOPNOTSUPP', 'EACCES'] | ||
48 | 2558 | _fdatasync_ignored = [getattr(errno, name) for name in _maybe_ignored | ||
49 | 2559 | if getattr(errno, name, None) is not None] | ||
50 | 2560 | |||
51 | 2557 | 2561 | ||
52 | 2558 | def fdatasync(fileno): | 2562 | def fdatasync(fileno): |
53 | 2559 | """Flush file contents to disk if possible. | 2563 | """Flush file contents to disk if possible. |
54 | @@ -2563,7 +2567,16 @@ | |||
55 | 2563 | """ | 2567 | """ |
56 | 2564 | fn = getattr(os, 'fdatasync', getattr(os, 'fsync', None)) | 2568 | fn = getattr(os, 'fdatasync', getattr(os, 'fsync', None)) |
57 | 2565 | if fn is not None: | 2569 | if fn is not None: |
59 | 2566 | fn(fileno) | 2570 | try: |
60 | 2571 | fn(fileno) | ||
61 | 2572 | except IOError, e: | ||
62 | 2573 | # See bug #1075108, on some platforms fdatasync exists, but can | ||
63 | 2574 | # raise ENOTSUP. However, we are calling fdatasync to be helpful | ||
64 | 2575 | # and reduce the chance of corruption-on-powerloss situations. It | ||
65 | 2576 | # is not a mandatory call, so it is ok to suppress failures. | ||
66 | 2577 | trace.mutter("ignoring error calling fdatasync: %s" % (e,)) | ||
67 | 2578 | if getattr(e, 'errno', None) not in _fdatasync_ignored: | ||
68 | 2579 | raise | ||
69 | 2567 | 2580 | ||
70 | 2568 | 2581 | ||
71 | 2569 | def ensure_empty_directory_exists(path, exception_class): | 2582 | def ensure_empty_directory_exists(path, exception_class): |
72 | 2570 | 2583 | ||
73 | === modified file 'bzrlib/tests/__init__.py' | |||
74 | --- bzrlib/tests/__init__.py 2012-08-03 14:23:05 +0000 | |||
75 | +++ bzrlib/tests/__init__.py 2013-05-23 10:07:40 +0000 | |||
76 | @@ -1780,9 +1780,15 @@ | |||
77 | 1780 | 1780 | ||
78 | 1781 | :returns: The actual attr value. | 1781 | :returns: The actual attr value. |
79 | 1782 | """ | 1782 | """ |
80 | 1783 | value = getattr(obj, attr_name) | ||
81 | 1784 | # The actual value is captured by the call below | 1783 | # The actual value is captured by the call below |
83 | 1785 | self.addCleanup(setattr, obj, attr_name, value) | 1784 | value = getattr(obj, attr_name, _unitialized_attr) |
84 | 1785 | if value is _unitialized_attr: | ||
85 | 1786 | # When the test completes, the attribute should not exist, but if | ||
86 | 1787 | # we aren't setting a value, we don't need to do anything. | ||
87 | 1788 | if new is not _unitialized_attr: | ||
88 | 1789 | self.addCleanup(delattr, obj, attr_name) | ||
89 | 1790 | else: | ||
90 | 1791 | self.addCleanup(setattr, obj, attr_name, value) | ||
91 | 1786 | if new is not _unitialized_attr: | 1792 | if new is not _unitialized_attr: |
92 | 1787 | setattr(obj, attr_name, new) | 1793 | setattr(obj, attr_name, new) |
93 | 1788 | return value | 1794 | return value |
94 | 1789 | 1795 | ||
95 | === modified file 'bzrlib/tests/test_osutils.py' | |||
96 | --- bzrlib/tests/test_osutils.py 2012-09-19 07:58:27 +0000 | |||
97 | +++ bzrlib/tests/test_osutils.py 2013-05-23 10:07:40 +0000 | |||
98 | @@ -23,6 +23,7 @@ | |||
99 | 23 | import select | 23 | import select |
100 | 24 | import socket | 24 | import socket |
101 | 25 | import sys | 25 | import sys |
102 | 26 | import tempfile | ||
103 | 26 | import time | 27 | import time |
104 | 27 | 28 | ||
105 | 28 | from bzrlib import ( | 29 | from bzrlib import ( |
106 | @@ -436,6 +437,49 @@ | |||
107 | 436 | self.assertTrue(-eighteen_hours < offset < eighteen_hours) | 437 | self.assertTrue(-eighteen_hours < offset < eighteen_hours) |
108 | 437 | 438 | ||
109 | 438 | 439 | ||
110 | 440 | class TestFdatasync(tests.TestCaseInTempDir): | ||
111 | 441 | |||
112 | 442 | def do_fdatasync(self): | ||
113 | 443 | f = tempfile.NamedTemporaryFile() | ||
114 | 444 | osutils.fdatasync(f.fileno()) | ||
115 | 445 | f.close() | ||
116 | 446 | |||
117 | 447 | @staticmethod | ||
118 | 448 | def raise_eopnotsupp(*args, **kwargs): | ||
119 | 449 | raise IOError(errno.EOPNOTSUPP, os.strerror(errno.EOPNOTSUPP)) | ||
120 | 450 | |||
121 | 451 | @staticmethod | ||
122 | 452 | def raise_enotsup(*args, **kwargs): | ||
123 | 453 | raise IOError(errno.ENOTSUP, os.strerror(errno.ENOTSUP)) | ||
124 | 454 | |||
125 | 455 | def test_fdatasync_handles_system_function(self): | ||
126 | 456 | self.overrideAttr(os, "fdatasync") | ||
127 | 457 | self.do_fdatasync() | ||
128 | 458 | |||
129 | 459 | def test_fdatasync_handles_no_fdatasync_no_fsync(self): | ||
130 | 460 | self.overrideAttr(os, "fdatasync") | ||
131 | 461 | self.overrideAttr(os, "fsync") | ||
132 | 462 | self.do_fdatasync() | ||
133 | 463 | |||
134 | 464 | def test_fdatasync_handles_no_EOPNOTSUPP(self): | ||
135 | 465 | self.overrideAttr(errno, "EOPNOTSUPP") | ||
136 | 466 | self.do_fdatasync() | ||
137 | 467 | |||
138 | 468 | def test_fdatasync_catches_ENOTSUP(self): | ||
139 | 469 | enotsup = getattr(errno, "ENOTSUP", None) | ||
140 | 470 | if enotsup is None: | ||
141 | 471 | raise tests.TestNotApplicable("No ENOTSUP on this platform") | ||
142 | 472 | self.overrideAttr(os, "fdatasync", self.raise_enotsup) | ||
143 | 473 | self.do_fdatasync() | ||
144 | 474 | |||
145 | 475 | def test_fdatasync_catches_EOPNOTSUPP(self): | ||
146 | 476 | enotsup = getattr(errno, "EOPNOTSUPP", None) | ||
147 | 477 | if enotsup is None: | ||
148 | 478 | raise tests.TestNotApplicable("No EOPNOTSUPP on this platform") | ||
149 | 479 | self.overrideAttr(os, "fdatasync", self.raise_eopnotsupp) | ||
150 | 480 | self.do_fdatasync() | ||
151 | 481 | |||
152 | 482 | |||
153 | 439 | class TestLinks(tests.TestCaseInTempDir): | 483 | class TestLinks(tests.TestCaseInTempDir): |
154 | 440 | 484 | ||
155 | 441 | def test_dereference_path(self): | 485 | def test_dereference_path(self): |
156 | 442 | 486 | ||
157 | === modified file 'bzrlib/tests/test_selftest.py' | |||
158 | --- bzrlib/tests/test_selftest.py 2012-09-19 07:58:27 +0000 | |||
159 | +++ bzrlib/tests/test_selftest.py 2013-05-23 10:07:40 +0000 | |||
160 | @@ -1654,6 +1654,12 @@ | |||
161 | 1654 | self.assertRaises(AssertionError, | 1654 | self.assertRaises(AssertionError, |
162 | 1655 | self.assertListRaises, _TestException, success_generator) | 1655 | self.assertListRaises, _TestException, success_generator) |
163 | 1656 | 1656 | ||
164 | 1657 | def _run_successful_test(self, test): | ||
165 | 1658 | result = testtools.TestResult() | ||
166 | 1659 | test.run(result) | ||
167 | 1660 | self.assertTrue(result.wasSuccessful()) | ||
168 | 1661 | return result | ||
169 | 1662 | |||
170 | 1657 | def test_overrideAttr_without_value(self): | 1663 | def test_overrideAttr_without_value(self): |
171 | 1658 | self.test_attr = 'original' # Define a test attribute | 1664 | self.test_attr = 'original' # Define a test attribute |
172 | 1659 | obj = self # Make 'obj' visible to the embedded test | 1665 | obj = self # Make 'obj' visible to the embedded test |
173 | @@ -1669,8 +1675,7 @@ | |||
174 | 1669 | obj.test_attr = 'modified' | 1675 | obj.test_attr = 'modified' |
175 | 1670 | self.assertEqual('modified', obj.test_attr) | 1676 | self.assertEqual('modified', obj.test_attr) |
176 | 1671 | 1677 | ||
179 | 1672 | test = Test('test_value') | 1678 | self._run_successful_test(Test('test_value')) |
178 | 1673 | test.run(unittest.TestResult()) | ||
180 | 1674 | self.assertEqual('original', obj.test_attr) | 1679 | self.assertEqual('original', obj.test_attr) |
181 | 1675 | 1680 | ||
182 | 1676 | def test_overrideAttr_with_value(self): | 1681 | def test_overrideAttr_with_value(self): |
183 | @@ -1686,10 +1691,41 @@ | |||
184 | 1686 | self.assertEqual('original', self.orig) | 1691 | self.assertEqual('original', self.orig) |
185 | 1687 | self.assertEqual('modified', obj.test_attr) | 1692 | self.assertEqual('modified', obj.test_attr) |
186 | 1688 | 1693 | ||
189 | 1689 | test = Test('test_value') | 1694 | self._run_successful_test(Test('test_value')) |
188 | 1690 | test.run(unittest.TestResult()) | ||
190 | 1691 | self.assertEqual('original', obj.test_attr) | 1695 | self.assertEqual('original', obj.test_attr) |
191 | 1692 | 1696 | ||
192 | 1697 | def test_overrideAttr_with_no_existing_value_and_value(self): | ||
193 | 1698 | # Do not define the test_attribute | ||
194 | 1699 | obj = self # Make 'obj' visible to the embedded test | ||
195 | 1700 | class Test(tests.TestCase): | ||
196 | 1701 | |||
197 | 1702 | def setUp(self): | ||
198 | 1703 | tests.TestCase.setUp(self) | ||
199 | 1704 | self.orig = self.overrideAttr(obj, 'test_attr', new='modified') | ||
200 | 1705 | |||
201 | 1706 | def test_value(self): | ||
202 | 1707 | self.assertEqual(tests._unitialized_attr, self.orig) | ||
203 | 1708 | self.assertEqual('modified', obj.test_attr) | ||
204 | 1709 | |||
205 | 1710 | self._run_successful_test(Test('test_value')) | ||
206 | 1711 | self.assertRaises(AttributeError, getattr, obj, 'test_attr') | ||
207 | 1712 | |||
208 | 1713 | def test_overrideAttr_with_no_existing_value_and_no_value(self): | ||
209 | 1714 | # Do not define the test_attribute | ||
210 | 1715 | obj = self # Make 'obj' visible to the embedded test | ||
211 | 1716 | class Test(tests.TestCase): | ||
212 | 1717 | |||
213 | 1718 | def setUp(self): | ||
214 | 1719 | tests.TestCase.setUp(self) | ||
215 | 1720 | self.orig = self.overrideAttr(obj, 'test_attr') | ||
216 | 1721 | |||
217 | 1722 | def test_value(self): | ||
218 | 1723 | self.assertEqual(tests._unitialized_attr, self.orig) | ||
219 | 1724 | self.assertRaises(AttributeError, getattr, obj, 'test_attr') | ||
220 | 1725 | |||
221 | 1726 | self._run_successful_test(Test('test_value')) | ||
222 | 1727 | self.assertRaises(AttributeError, getattr, obj, 'test_attr') | ||
223 | 1728 | |||
224 | 1693 | def test_recordCalls(self): | 1729 | def test_recordCalls(self): |
225 | 1694 | from bzrlib.tests import test_selftest | 1730 | from bzrlib.tests import test_selftest |
226 | 1695 | calls = self.recordCalls( | 1731 | calls = self.recordCalls( |
227 | 1696 | 1732 | ||
228 | === modified file 'doc/en/release-notes/bzr-2.4.txt' | |||
229 | --- doc/en/release-notes/bzr-2.4.txt 2012-09-05 20:22:17 +0000 | |||
230 | +++ doc/en/release-notes/bzr-2.4.txt 2013-05-23 10:07:40 +0000 | |||
231 | @@ -35,6 +35,10 @@ | |||
232 | 35 | * Cope with Unix filesystems, such as smbfs, where chmod gives 'permission | 35 | * Cope with Unix filesystems, such as smbfs, where chmod gives 'permission |
233 | 36 | denied'. (Martin Pool, #606537) | 36 | denied'. (Martin Pool, #606537) |
234 | 37 | 37 | ||
235 | 38 | * Fix a traceback when trying to checkout a tree that also has an entry | ||
236 | 39 | with file-id `TREE_ROOT` somewhere other than at the root directory. | ||
237 | 40 | (John Arbash Meinel, #830947) | ||
238 | 41 | |||
239 | 38 | * When the ``limbo`` or ``pending-deletion`` directories exist, typically | 42 | * When the ``limbo`` or ``pending-deletion`` directories exist, typically |
240 | 39 | because of an interrupted tree update, but are empty, bzr no longer | 43 | because of an interrupted tree update, but are empty, bzr no longer |
241 | 40 | errors out, because there is nothing for the user to clean up. Also, | 44 | errors out, because there is nothing for the user to clean up. Also, |
242 | @@ -55,6 +59,10 @@ | |||
243 | 55 | * Prevent a traceback being printed to stderr when logging has problems and | 59 | * Prevent a traceback being printed to stderr when logging has problems and |
244 | 56 | accept utf-8 byte string without breaking. (Martin Packman, #714449) | 60 | accept utf-8 byte string without breaking. (Martin Packman, #714449) |
245 | 57 | 61 | ||
246 | 62 | * Some filesystems give ``EOPNOTSUPP`` when trying to call ``fdatasync``. | ||
247 | 63 | This shouldn't be treated as a fatal error. | ||
248 | 64 | (John Arbash Meinel, #1075108) | ||
249 | 65 | |||
250 | 58 | * Use ``encoding_type='exact'`` for ``bzr testament`` so that on Windows | 66 | * Use ``encoding_type='exact'`` for ``bzr testament`` so that on Windows |
251 | 59 | the sha hash of the long testament matches the sha hash in the short | 67 | the sha hash of the long testament matches the sha hash in the short |
252 | 60 | form. (John Arbash Meinel, #1010339) | 68 | form. (John Arbash Meinel, #1010339) |
253 | 61 | 69 | ||
254 | === modified file 'doc/en/release-notes/bzr-2.5.txt' | |||
255 | --- doc/en/release-notes/bzr-2.5.txt 2012-09-19 07:58:27 +0000 | |||
256 | +++ doc/en/release-notes/bzr-2.5.txt 2013-05-23 10:07:40 +0000 | |||
257 | @@ -35,6 +35,10 @@ | |||
258 | 35 | * ``bzr config`` properly handles aliases and references in the | 35 | * ``bzr config`` properly handles aliases and references in the |
259 | 36 | ``--directory`` parameter (Vincent Ladeuil, Wouter van Heyst, #947049) | 36 | ``--directory`` parameter (Vincent Ladeuil, Wouter van Heyst, #947049) |
260 | 37 | 37 | ||
261 | 38 | * Fix a traceback when trying to checkout a tree that also has an entry | ||
262 | 39 | with file-id `TREE_ROOT` somewhere other than at the root directory. | ||
263 | 40 | (John Arbash Meinel, #830947) | ||
264 | 41 | |||
265 | 38 | * Lightweight checkouts of remote repositories had a bug with how they | 42 | * Lightweight checkouts of remote repositories had a bug with how they |
266 | 39 | extracted texts from the repository. (Just an ordering constraint on how | 43 | extracted texts from the repository. (Just an ordering constraint on how |
267 | 40 | they consumed the stream.) (John Arbash Meinel, #1046284) | 44 | they consumed the stream.) (John Arbash Meinel, #1046284) |
268 | @@ -48,6 +52,10 @@ | |||
269 | 48 | 52 | ||
270 | 49 | * Revert use of --no-tty when gpg signing commits. (Jelmer Vernooij, #1014570) | 53 | * Revert use of --no-tty when gpg signing commits. (Jelmer Vernooij, #1014570) |
271 | 50 | 54 | ||
272 | 55 | * Some filesystems give ``EOPNOTSUPP`` when trying to call ``fdatasync``. | ||
273 | 56 | This shouldn't be treated as a fatal error. | ||
274 | 57 | (John Arbash Meinel, #1075108) | ||
275 | 58 | |||
276 | 51 | * Some small bug fixes wrt lightweight checkouts and remote repositories. | 59 | * Some small bug fixes wrt lightweight checkouts and remote repositories. |
277 | 52 | A test permutation was added that runs all working tree tests against a | 60 | A test permutation was added that runs all working tree tests against a |
278 | 53 | lightweight checkout. (John Arbash Meinel, #1046697) | 61 | lightweight checkout. (John Arbash Meinel, #1046697) |
279 | 54 | 62 | ||
280 | === modified file 'doc/en/release-notes/bzr-2.6.txt' | |||
281 | --- doc/en/release-notes/bzr-2.6.txt 2012-12-04 16:36:55 +0000 | |||
282 | +++ doc/en/release-notes/bzr-2.6.txt 2013-05-23 10:07:40 +0000 | |||
283 | @@ -60,6 +60,13 @@ | |||
284 | 60 | ``BZR_PROGRESS_BAR``. This can be set in ``bazaar.conf`` or specified from | 60 | ``BZR_PROGRESS_BAR``. This can be set in ``bazaar.conf`` or specified from |
285 | 61 | the command line with ``-Oprogress_bar=text``. (Vincent Ladeuil, #388275) | 61 | the command line with ``-Oprogress_bar=text``. (Vincent Ladeuil, #388275) |
286 | 62 | 62 | ||
287 | 63 | * ``Authentication.Config`` now always returns unicode user names and passwords. | ||
288 | 64 | (Vincent Ladeuil, #514301) | ||
289 | 65 | |||
290 | 66 | * Fix a traceback when trying to checkout a tree that also has an entry | ||
291 | 67 | with file-id `TREE_ROOT` somewhere other than at the root directory. | ||
292 | 68 | (John Arbash Meinel, #830947) | ||
293 | 69 | |||
294 | 63 | * Fixed a bug where the entire contents of ``/etc/mailname`` is read in. | 70 | * Fixed a bug where the entire contents of ``/etc/mailname`` is read in. |
295 | 64 | We only want to read in the first line so that comments could be added | 71 | We only want to read in the first line so that comments could be added |
296 | 65 | and would be ignored. | 72 | and would be ignored. |
297 | @@ -69,8 +76,9 @@ | |||
298 | 69 | causes breakage with docutils 0.9.1. | 76 | causes breakage with docutils 0.9.1. |
299 | 70 | (Vincent Ladeuil, Jelmer Vernooij, #1066307) | 77 | (Vincent Ladeuil, Jelmer Vernooij, #1066307) |
300 | 71 | 78 | ||
303 | 72 | * ``Authentication.Config`` now always returns unicode user names and passwords. | 79 | * Some filesystems give ``EOPNOTSUPP`` when trying to call ``fdatasync``. |
304 | 73 | (Vincent Ladeuil, #514301) | 80 | This shouldn't be treated as a fatal error. |
305 | 81 | (John Arbash Meinel, #1075108) | ||
306 | 74 | 82 | ||
307 | 75 | * Warn when ``--show-base`` is used for ``pull`` in a treeless branch | 83 | * Warn when ``--show-base`` is used for ``pull`` in a treeless branch |
308 | 76 | instead of failing. It's useless but harmless. (Vincent Ladeuil, #1022160) | 84 | instead of failing. It's useless but harmless. (Vincent Ladeuil, #1022160) |
sent to pqm by email