Rev 2303: merge upstream. in http://people.samba.org/bzr/jelmer/bzr-svn/0.5

Jelmer Vernooij jelmer at samba.org
Wed Jan 14 18:32:24 GMT 2009


At http://people.samba.org/bzr/jelmer/bzr-svn/0.5

------------------------------------------------------------
revno: 2303
revision-id: jelmer at samba.org-20090114183223-ajmt87iurn1ln40l
parent: jelmer at samba.org-20090114180105-3jab2wtm7z5rm5ye
parent: jelmer at samba.org-20090114163015-whb34wkexi40y08c
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.5
timestamp: Wed 2009-01-14 19:32:23 +0100
message:
  merge upstream.
modified:
  revmeta.py                     revmeta.py-20080901215045-n8a6arqybs9ez5hl-1
  tests/test_workingtree.py      test_workingtree.py-20060622191524-0di7bc3q1ckdbybb-1
  workingtree.py                 workingtree.py-20060306120941-b083cb0fdd4a69de
    ------------------------------------------------------------
    revno: 2300.1.3
    revision-id: jelmer at samba.org-20090114163015-whb34wkexi40y08c
    parent: jelmer at samba.org-20090114162054-y2egcljye2ukf34p
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: 0.5
    timestamp: Wed 2009-01-14 17:30:15 +0100
    message:
      Better locking.
    modified:
      workingtree.py                 workingtree.py-20060306120941-b083cb0fdd4a69de
    ------------------------------------------------------------
    revno: 2300.1.2
    revision-id: jelmer at samba.org-20090114162054-y2egcljye2ukf34p
    parent: jelmer at samba.org-20090114005302-53fi1b5lpy38e847
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: 0.5
    timestamp: Wed 2009-01-14 17:20:54 +0100
    message:
      Add test for 304134, based on Wesley's test script.
    modified:
      tests/test_workingtree.py      test_workingtree.py-20060622191524-0di7bc3q1ckdbybb-1
    ------------------------------------------------------------
    revno: 2300.1.1
    revision-id: jelmer at samba.org-20090114005302-53fi1b5lpy38e847
    parent: jelmer at samba.org-20090113162520-gzv3mg8t2hgl095h
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: 0.5
    timestamp: Wed 2009-01-14 01:53:02 +0100
    message:
      keep metabranches history more sparse to avoid iterating over lots of empty entries.
    modified:
      revmeta.py                     revmeta.py-20080901215045-n8a6arqybs9ez5hl-1
=== modified file 'revmeta.py'
--- a/revmeta.py	2009-01-13 03:18:11 +0000
+++ b/revmeta.py	2009-01-14 00:53:02 +0000
@@ -1007,6 +1007,7 @@
                 for bp in metabranches_history[x].keys():
                     metabranches_history[revnum][bp].update(metabranches_history[x][bp])
                     del metabranches_history[x][bp]
+                del metabranches_history[x]
             for bp, mbs in metabranches_history[revnum].iteritems():
                 if not bp in self._metabranches:
                     self._metabranches[bp] = iter(mbs).next()

=== modified file 'tests/test_workingtree.py'
--- a/tests/test_workingtree.py	2009-01-13 00:10:39 +0000
+++ b/tests/test_workingtree.py	2009-01-14 16:20:54 +0000
@@ -465,6 +465,31 @@
         tree = WorkingTree.open("dc")
         self.assertFalse(tree.inventory.has_filename("bl"))
 
+    def test_fileid_missing(self):
+        self.make_client("repos", "svn-wc")
+        self.build_tree({"svn-wc/parent": None})
+        self.client_add("svn-wc/parent")
+        self.client_commit("svn-wc", "Added parent.")
+
+        self.build_tree({"svn-wc/peer": None})
+        self.client_add("svn-wc/peer")
+        self.client_commit("svn-wc", "Added peer")
+
+        self.build_tree({"svn-wc/peer/file": "A"})
+        self.client_add("svn-wc/peer/file")
+        self.client_commit("svn-wc", "Added file")
+        self.client_update("svn-wc")
+
+        self.build_tree({"svn-wc/peer/file": "B"})
+        self.client_copy("svn-wc/peer", "svn-wc/parent/child")
+        self.client_delete("svn-wc/peer")
+        self.client_commit("svn-wc", "Made peer a child, with mods.")
+        self.client_update("svn-wc")
+
+        WorkingTree.open("svn-wc").update()
+        self.client_update("svn-wc/parent")
+        WorkingTree.open("svn-wc").update()
+
     def test_extras(self):
         self.make_client('a', 'dc')
         self.build_tree({"dc/bl": None})

=== modified file 'workingtree.py'
--- a/workingtree.py	2009-01-13 00:10:39 +0000
+++ b/workingtree.py	2009-01-14 16:30:15 +0000
@@ -109,7 +109,6 @@
         self.bzrdir = bzrdir
         self._branch = branch
         self.base_revnum = 0
-        self._get_wc()
         max_rev = revision_status(self.basedir, None, True)[1]
         self._update_base_revnum(max_rev)
         self._detect_case_handling()
@@ -226,16 +225,16 @@
     def move(self, from_paths, to_dir=None, after=False, **kwargs):
         """Move files to a new location."""
         # FIXME: Use after argument
-        if after == True:
+        if after:
             raise NotImplementedError("move after not supported")
         for entry in from_paths:
+            to_wc = self._get_wc(to_dir, write_lock=True)
             try:
-                to_wc = self._get_wc(to_dir, write_lock=True)
                 to_wc.copy(self.abspath(entry), os.path.basename(entry))
             finally:
                 to_wc.close()
+            from_wc = self._get_wc(write_lock=True)
             try:
-                from_wc = self._get_wc(write_lock=True)
                 from_wc.delete(self.abspath(entry))
             finally:
                 from_wc.close()
@@ -247,20 +246,25 @@
 
     def rename_one(self, from_rel, to_rel, after=False):
         # FIXME: Use after
-        if after == True:
+        if after:
             raise NotImplementedError("rename_one after not supported")
+        from_wc = None
         (to_wc, to_file) = self._get_rel_wc(to_rel, write_lock=True)
-        if os.path.dirname(from_rel) == os.path.dirname(to_rel):
-            # Prevent lock contention
-            from_wc = to_wc
-        else:
-            (from_wc, _) = self._get_rel_wc(from_rel, write_lock=True)
-        from_id = self.inventory.path2id(from_rel)
         try:
-            to_wc.copy(self.abspath(from_rel), to_file)
-            from_wc.delete(self.abspath(from_rel))
+            if os.path.dirname(from_rel) == os.path.dirname(to_rel):
+                # Prevent lock contention
+                from_wc = to_wc
+            else:
+                (from_wc, _) = self._get_rel_wc(from_rel, write_lock=True)
+            try:
+                from_id = self.inventory.path2id(from_rel)
+                to_wc.copy(self.abspath(from_rel), to_file)
+                from_wc.delete(self.abspath(from_rel))
+            finally:
+                from_wc.close()
         finally:
-            to_wc.close()
+            if from_wc != to_wc:
+                to_wc.close()
         self._change_fileid_mapping(None, from_rel)
         self._change_fileid_mapping(from_id, to_rel)
         self.read_working_inventory()
@@ -325,19 +329,21 @@
             :return: Yields all copies
             """
             wc = self._get_wc(relpath)
-            entries = wc.entries_read(False)
-            for entry in entries.values():
-                subrelpath = os.path.join(relpath, entry.name)
-                if entry.name == "" or entry.kind != 'directory':
-                    if ((entry.copyfrom_url == url or entry.url == url) and 
-                        not (entry.schedule in (SCHEDULE_DELETE,
-                                                SCHEDULE_REPLACE))):
-                        yield os.path.join(
-                                self.branch.get_branch_path().strip("/"), 
-                                subrelpath)
-                else:
-                    find_copies(subrelpath)
-            wc.close()
+            try:
+                entries = wc.entries_read(False)
+                for entry in entries.values():
+                    subrelpath = os.path.join(relpath, entry.name)
+                    if entry.name == "" or entry.kind != 'directory':
+                        if ((entry.copyfrom_url == url or entry.url == url) and 
+                            not (entry.schedule in (SCHEDULE_DELETE,
+                                                    SCHEDULE_REPLACE))):
+                            yield os.path.join(
+                                    self.branch.get_branch_path().strip("/"), 
+                                    subrelpath)
+                    else:
+                        find_copies(subrelpath)
+            finally:
+                wc.close()
 
         def find_ids(entry, rootwc):
             relpath = urllib.unquote(entry.url[len(entry.repos):].strip("/"))
@@ -563,23 +569,25 @@
             subwc = self._get_wc(write_lock=True)
         else:
             subwc = wc
-        new_entries = self._get_new_file_ids(subwc)
-        if id is None:
-            if new_entries.has_key(path):
-                del new_entries[path]
-        else:
-            assert isinstance(id, str)
-            new_entries[path] = id
-        fileprops = self._get_branch_props()
-        self.branch.mapping.export_fileid_map_fileprops(new_entries, fileprops)
-        self._set_branch_props(subwc, fileprops)
-        if wc is None:
-            subwc.close()
+        try:
+            new_entries = self._get_new_file_ids(subwc)
+            if id is None:
+                if new_entries.has_key(path):
+                    del new_entries[path]
+            else:
+                assert isinstance(id, str)
+                new_entries[path] = id
+            fileprops = self._get_branch_props()
+            self.branch.mapping.export_fileid_map_fileprops(new_entries, fileprops)
+            self._set_branch_props(subwc, fileprops)
+        finally:
+            if wc is None:
+                subwc.close()
 
     def _get_changed_branch_props(self):
         wc = self._get_wc()
-        ret = {}
         try:
+            ret = {}
             (prop_changes, orig_props) = wc.get_prop_diffs(self.basedir)
             for k,v in prop_changes:
                 ret[k] = (orig_props.get(k), v)




More information about the bazaar-commits mailing list