Rev 3445: (mbp) BzrDir controls file modes, not LockableFiles in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Wed May 21 11:41:49 BST 2008


At file:///home/pqm/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 3445
revision-id:pqm at pqm.ubuntu.com-20080521104134-beoquporep2cpghs
parent: pqm at pqm.ubuntu.com-20080521081407-ohffv2bn288gd515
parent: mbp at sourcefrog.net-20080521030559-z70xlb8mpj5hk027
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Wed 2008-05-21 11:41:34 +0100
message:
  (mbp) BzrDir controls file modes, not LockableFiles
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
  bzrlib/lockable_files.py       control_files.py-20051111201905-bb88546e799d669f
  bzrlib/repofmt/pack_repo.py    pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
  bzrlib/repofmt/weaverepo.py    presplitout.py-20070125045333-wfav3tsh73oxu3zk-1
  bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
  bzrlib/tests/branch_implementations/test_permissions.py test_permissions.py-20060210110243-245c01403bf0fde6
  bzrlib/tests/test_permissions.py test_permissions.py-20051215004520-ccf475789c80e80c
  bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
    ------------------------------------------------------------
    revno: 3416.2.6
    revision-id:mbp at sourcefrog.net-20080521030559-z70xlb8mpj5hk027
    parent: mbp at sourcefrog.net-20080521030110-xcx9y72316480tvo
    committer: Martin Pool <mbp at sourcefrog.net>
    branch nick: filemodes
    timestamp: Wed 2008-05-21 13:05:59 +1000
    message:
      Remove obsolete LockableFiles._set_file_mode and _set_dir_mode
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/lockable_files.py       control_files.py-20051111201905-bb88546e799d669f
      bzrlib/tests/test_permissions.py test_permissions.py-20051215004520-ccf475789c80e80c
    ------------------------------------------------------------
    revno: 3416.2.5
    revision-id:mbp at sourcefrog.net-20080521030110-xcx9y72316480tvo
    parent: mbp at sourcefrog.net-20080521025920-90v48vtksrcdksjk
    committer: Martin Pool <mbp at sourcefrog.net>
    branch nick: filemodes
    timestamp: Wed 2008-05-21 13:01:10 +1000
    message:
      Correction to branch permissions test
    modified:
      bzrlib/tests/branch_implementations/test_permissions.py test_permissions.py-20060210110243-245c01403bf0fde6
    ------------------------------------------------------------
    revno: 3416.2.4
    revision-id:mbp at sourcefrog.net-20080521025920-90v48vtksrcdksjk
    parent: mbp at sourcefrog.net-20080512054751-qbgg72vppg2xl8qk
    parent: pqm at pqm.ubuntu.com-20080520210027-wetfxldz1ggc5u2a
    committer: Martin Pool <mbp at sourcefrog.net>
    branch nick: filemodes
    timestamp: Wed 2008-05-21 12:59:20 +1000
    message:
      merge trunk
    added:
      bzrlib/smart/message.py        message.py-20080222013625-ncqmh3nrxjkxab87-1
      bzrlib/tests/repository_implementations/test_get_parent_map.py test_get_parent_map.-20080421172708-x1z6ot341osr0jq1-1
      doc/developers/repository-stream.txt repositorystream.txt-20080410222511-nh6b9bvscvcerh48-1
      doc/en/user-guide/bzrtools_plugin.txt bzrtools_plugin.txt-20080509065016-cjc90f46407vi9a0-1
      doc/en/user-guide/svn_plugin.txt svn_plugin.txt-20080509065016-cjc90f46407vi9a0-2
      doc/en/user-guide/web_browsing.txt web_browsing.txt-20080509065016-cjc90f46407vi9a0-3
      doc/es/                        es-20080504181154-x2fm3oprvjohiz7n-1
      doc/es/guia-desarrollador/     guiadesarrollador-20080504181514-qlh50dq1mj769bic-1
      doc/es/guia-usuario/           guiausuario-20080504181514-qlh50dq1mj769bic-2
      doc/es/guia-usuario/index.txt  index.txt-20080512005856-hgdxkh9xo58n7zdp-2
      doc/es/guia-usuario/resolving_conflicts.txt conflicts.txt-20080504181626-aqnzjwfhpju5ypfe-1
      doc/es/guia-usuario/version_info.txt version_info.txt-20080504181730-u24nugzokrcrk1bf-1
      doc/es/mini-tutorial/          minitutorial-20080504181514-qlh50dq1mj769bic-3
      doc/es/mini-tutorial/index.txt index.txt-20080504182136-wmoc35u2t6kom8ca-1
      doc/es/notas-version/          notasversion-20080504181514-qlh50dq1mj769bic-4
      doc/es/referencia/             referencia-20080504181514-qlh50dq1mj769bic-5
      doc/es/referencia-rapida/      referenciarapida-20080504181514-qlh50dq1mj769bic-6
      doc/es/referencia-rapida/Makefile makefile-20080506002609-y60mr4avuqwzlf4s-1
      doc/es/referencia-rapida/referencia-rapida.svg referenciarapida.svg-20080506002609-y60mr4avuqwzlf4s-2
      doc/index.es.txt               index.es.txt-20080506002113-aunzdhptcoc0h6hm-1
    renamed:
      doc/en/user-guide/best_practice_intro.txt => doc/en/user-guide/part2_intro.txt best_practice_intro.-20071123154453-dk2mjhrg1vpjm5w2-1
    modified:
      Makefile                       Makefile-20050805140406-d96e3498bb61c5bb
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzr                            bzr.py-20050313053754-5485f144c7006fa6
      bzrlib/__init__.py             __init__.py-20050309040759-33e65acf91bbcd5d
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
      bzrlib/commands.py             bzr.py-20050309040720-d10f4714595cf8c3
      bzrlib/config.py               config.py-20051011043216-070c74f4e9e338e8
      bzrlib/doc/__init__.py         __init__.py-20051224020731-eb3eb3ef5b4570df
      bzrlib/doc/api/__init__.py     __init__.py-20051224020744-7b87d590843855bc
      bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
      bzrlib/fetch.py                fetch.py-20050818234941-26fea6105696365d
      bzrlib/help_topics/en/authentication.txt authentication_conf.-20071104135035-glfv0ri355tyg1nf-1
      bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
      bzrlib/log.py                  log.py-20050505065812-c40ce11702fe5fb1
      bzrlib/missing.py              missing.py-20050812153334-097f7097e2a8bcd1
      bzrlib/plugin.py               plugin.py-20050622060424-829b654519533d69
      bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
      bzrlib/repofmt/knitrepo.py     knitrepo.py-20070206081537-pyy4a00xdas0j4pf-1
      bzrlib/repofmt/pack_repo.py    pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
      bzrlib/repofmt/weaverepo.py    presplitout.py-20070125045333-wfav3tsh73oxu3zk-1
      bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
      bzrlib/revision.py             revision.py-20050309040759-e77802c08f3999d5
      bzrlib/smart/client.py         client.py-20061116014825-2k6ada6xgulslami-1
      bzrlib/smart/medium.py         medium.py-20061103051856-rgu2huy59fkz902q-1
      bzrlib/smart/protocol.py       protocol.py-20061108035435-ot0lstk2590yqhzr-1
      bzrlib/smart/request.py        request.py-20061108095550-gunadhxmzkdjfeek-1
      bzrlib/store/__init__.py       store.py-20050309040759-164dc5173d6406c2
      bzrlib/store/versioned/__init__.py weavestore.py-20050907094258-88262e0434babab9
      bzrlib/symbol_versioning.py    symbol_versioning.py-20060105104851-9ecf8af605d15a80
      bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
      bzrlib/tests/blackbox/__init__.py __init__.py-20051128053524-eba30d8255e08dc3
      bzrlib/tests/blackbox/test_missing.py test_missing.py-20051211212735-a2cf4c1840bb84c4
      bzrlib/tests/blackbox/test_selftest.py test_selftest.py-20060123024542-01c5f1bbcb596d78
      bzrlib/tests/blackbox/test_serve.py test_serve.py-20060913064329-8t2pvmsikl4s3xhl-1
      bzrlib/tests/branch_implementations/__init__.py __init__.py-20060123013057-b12a52c3f361daf4
      bzrlib/tests/bzrdir_implementations/__init__.py __init__.py-20060131065642-34c39b54f42dd048
      bzrlib/tests/commands/__init__.py __init__.py-20070520095518-ecfl8531fxgjeycj-1
      bzrlib/tests/http_utils.py     HTTPTestUtil.py-20050914180604-247d3aafb7a43343
      bzrlib/tests/interrepository_implementations/__init__.py __init__.py-20060220054744-baf49a1f88f17b1a
      bzrlib/tests/interrepository_implementations/test_fetch.py test_fetch.py-20080425213627-j60cjh782ufm83ry-1
      bzrlib/tests/interrepository_implementations/test_interrepository.py test_interrepository.py-20060220061411-1ec13fa99e5e3eee
      bzrlib/tests/intertree_implementations/__init__.py __init__.py-20060724101752-09ysswo1a92uqyoz-3
      bzrlib/tests/interversionedfile_implementations/__init__.py __init__.py-20060302012326-981af525594d02ed
      bzrlib/tests/interversionedfile_implementations/test_join.py test_join.py-20060302012326-9b5e9b0f0a03fedc
      bzrlib/tests/inventory_implementations/__init__.py __init__.py-20070821044532-olbadbokgv3qv1yd-1
      bzrlib/tests/per_lock/__init__.py __init__.py-20070314201444-u92yjsqrkh2m3qcb-1
      bzrlib/tests/repository_implementations/__init__.py __init__.py-20060131092037-9564957a7d4a841b
      bzrlib/tests/repository_implementations/test_repository.py test_repository.py-20060131092128-ad07f494f5c9d26c
      bzrlib/tests/revisionstore_implementations/__init__.py __init__.py-20060303020702-976c4186a0f99edb
      bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
      bzrlib/tests/test_errors.py    test_errors.py-20060210110251-41aba2deddf936a8
      bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
      bzrlib/tests/test_knit.py      test_knit.py-20051212171302-95d4c00dd5f11f2b
      bzrlib/tests/test_missing.py   test_missing.py-20051212000028-694fa4f658a81f48
      bzrlib/tests/test_read_bundle.py test_read_bundle.py-20060615211421-ud8cwr1ulgd914zf-1
      bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
      bzrlib/tests/test_revision.py  testrevision.py-20050804210559-46f5e1eb67b01289
      bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
      bzrlib/tests/test_smart_transport.py test_ssh_transport.py-20060608202016-c25gvf1ob7ypbus6-2
      bzrlib/tests/test_strace.py    test_strace.py-20070323001526-6zquhhw8leb9m6j8-2
      bzrlib/tests/test_transport_implementations.py test_transport_implementations.py-20051227111451-f97c5c7d5c49fce7
      bzrlib/tests/test_versionedfile.py test_versionedfile.py-20060222045249-db45c9ed14a1c2e5
      bzrlib/tests/test_weave.py     testknit.py-20050627023648-9833cc5562ffb785
      bzrlib/tests/tree_implementations/__init__.py __init__.py-20060717075546-420s7b0bj9hzeowi-2
      bzrlib/tests/workingtree_implementations/__init__.py __init__.py-20060203003124-b2aa5aca21a8bfad
      bzrlib/trace.py                trace.py-20050309040759-c8ed824bdcd4748a
      bzrlib/transport/__init__.py   transport.py-20050711165921-4978aa7ce1285ad5
      bzrlib/transport/ftp.py        ftp.py-20051116161804-58dc9506548c2a53
      bzrlib/transport/http/__init__.py http_transport.py-20050711212304-506c5fd1059ace96
      bzrlib/transport/http/_pycurl.py pycurlhttp.py-20060110060940-4e2a705911af77a6
      bzrlib/transport/http/_urllib.py _urlgrabber.py-20060113083826-0bbf7d992fbf090c
      bzrlib/transport/http/_urllib2_wrappers.py _urllib2_wrappers.py-20060913231729-ha9ugi48ktx481ao-1
      bzrlib/transport/http/wsgi.py  wsgi.py-20061005091552-rz8pva0olkxv0sd8-2
      bzrlib/transport/remote.py     ssh.py-20060608202016-c25gvf1ob7ypbus6-1
      bzrlib/versionedfile.py        versionedfile.py-20060222045106-5039c71ee3b65490
      bzrlib/weave.py                knit.py-20050627021749-759c29984154256b
      doc/developers/HACKING.txt     HACKING-20050805200004-2a5dc975d870f78c
      doc/developers/authentication-ring.txt authring.txt-20070718200437-q5tdik0ne6lor86d-1
      doc/developers/index.txt       index.txt-20070508041241-qznziunkg0nffhiw-1
      doc/developers/network-protocol.txt networkprotocol.txt-20070903044232-woustorrjbmg5zol-1
      doc/en/user-guide/bug_trackers.txt bug_trackers.txt-20070713223459-khxdlcudraii95uv-1
      doc/en/user-guide/configuring_bazaar.txt configuring_bazaar.t-20071128000722-ncxiua259xwbdbg7-1
      doc/en/user-guide/distributed_intro.txt distributed_intro.tx-20071123154453-dk2mjhrg1vpjm5w2-2
      doc/en/user-guide/index.txt    index.txt-20060622101119-tgwtdci8z769bjb9-2
      doc/en/user-guide/introducing_bazaar.txt introducing_bazaar.t-20071114035000-q36a9h57ps06uvnl-5
      doc/index.txt                  index.txt-20070813101924-07gd9i9d2jt124bf-1
      doc/en/user-guide/part2_intro.txt best_practice_intro.-20071123154453-dk2mjhrg1vpjm5w2-1
    ------------------------------------------------------------
    revno: 3416.2.3
    revision-id:mbp at sourcefrog.net-20080512054751-qbgg72vppg2xl8qk
    parent: mbp at sourcefrog.net-20080512054644-b203t92q8kv8x9ic
    committer: Martin Pool <mbp at sourcefrog.net>
    branch nick: filemodes
    timestamp: Mon 2008-05-12 15:47:51 +1000
    message:
      typo
    modified:
      bzrlib/repofmt/weaverepo.py    presplitout.py-20070125045333-wfav3tsh73oxu3zk-1
    ------------------------------------------------------------
    revno: 3416.2.2
    revision-id:mbp at sourcefrog.net-20080512054644-b203t92q8kv8x9ic
    parent: mbp at sourcefrog.net-20080512052343-jxvf7mlhzo3kftjq
    committer: Martin Pool <mbp at sourcefrog.net>
    branch nick: filemodes
    timestamp: Mon 2008-05-12 15:46:44 +1000
    message:
      Change some callers to get file and directory permissions from bzrdir not LockableFiles
    modified:
      bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
      bzrlib/repofmt/pack_repo.py    pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
      bzrlib/repofmt/weaverepo.py    presplitout.py-20070125045333-wfav3tsh73oxu3zk-1
      bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
      bzrlib/tests/branch_implementations/test_permissions.py test_permissions.py-20060210110243-245c01403bf0fde6
      bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
    ------------------------------------------------------------
    revno: 3416.2.1
    revision-id:mbp at sourcefrog.net-20080512052343-jxvf7mlhzo3kftjq
    parent: pqm at pqm.ubuntu.com-20080508082241-zyx68bbzrgnlhw9m
    committer: Martin Pool <mbp at sourcefrog.net>
    branch nick: filemodes
    timestamp: Mon 2008-05-12 15:23:43 +1000
    message:
      Add BzrDir._get_file_mode and _get_dir_mode
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
      bzrlib/lockable_files.py       control_files.py-20051111201905-bb88546e799d669f
      bzrlib/tests/test_permissions.py test_permissions.py-20051215004520-ccf475789c80e80c
=== modified file 'NEWS'
--- a/NEWS	2008-05-21 08:14:07 +0000
+++ b/NEWS	2008-05-21 10:41:34 +0000
@@ -78,7 +78,7 @@
 
   INTERNALS:
 
-  API BREAKS:
+  API CHANGES:
 
     * ``bzr missing --mine-only`` will return status code 0 if you have no
       new revisions, but the remote does. Similarly for ``--theirs-only``.
@@ -95,6 +95,13 @@
       ``base`` parameter.  ``SmartClientMedium`` implementations now also need
       to provide a ``remote_path_from_transport`` method.  (Andrew Bennetts)
       
+    * The default permissions for creating new files and directories 
+      should now be obtained from ``BzrDir._get_file_mode()`` and 
+      ``_get_dir_mode()``, rather than from LockableFiles.  The ``_set_file_mode``
+      and ``_set_dir_mode`` variables on LockableFiles which were advertised
+      as a way for plugins to control this are no longer consulted.
+      (Martin Pool)
+
     * ``VersionedFile.join`` is deprecated. This method required local
       instances of both versioned file objects and was thus hostile to being
       used for streaming from a smart server. The new get_record_stream and

=== modified file 'bzrlib/bzrdir.py'
--- a/bzrlib/bzrdir.py	2008-05-19 08:42:32 +0000
+++ b/bzrlib/bzrdir.py	2008-05-21 02:59:20 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2005, 2006, 2007 Canonical Ltd
+# Copyright (C) 2005, 2006, 2007, 2008 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
@@ -94,6 +94,8 @@
     root_transport
         a transport connected to the directory this bzr was opened from
         (i.e. the parent directory holding the .bzr directory).
+
+    Everything in the bzrdir should have the same file permissions.
     """
 
     def break_lock(self):
@@ -312,7 +314,6 @@
                 branches.append(branch)
         return branches
 
-
     def destroy_repository(self):
         """Destroy the repository in this BzrDir"""
         raise NotImplementedError(self.destroy_repository)
@@ -582,6 +583,45 @@
         guaranteed to point to an existing directory ready for use.
         """
         raise NotImplementedError(self.get_branch_transport)
+
+    def _find_creation_modes(self):
+        """Determine the appropriate modes for files and directories.
+        
+        They're always set to be consistent with the base directory,
+        assuming that this transport allows setting modes.
+        """
+        # TODO: Do we need or want an option (maybe a config setting) to turn
+        # this off or override it for particular locations? -- mbp 20080512
+        if self._mode_check_done:
+            return
+        self._mode_check_done = True
+        try:
+            st = self.transport.stat('.')
+        except errors.TransportNotPossible:
+            self._dir_mode = None
+            self._file_mode = None
+        else:
+            # Check the directory mode, but also make sure the created
+            # directories and files are read-write for this user. This is
+            # mostly a workaround for filesystems which lie about being able to
+            # write to a directory (cygwin & win32)
+            self._dir_mode = (st.st_mode & 07777) | 00700
+            # Remove the sticky and execute bits for files
+            self._file_mode = self._dir_mode & ~07111
+
+    def _get_file_mode(self):
+        """Return Unix mode for newly created files, or None.
+        """
+        if not self._mode_check_done:
+            self._find_creation_modes()
+        return self._file_mode
+
+    def _get_dir_mode(self):
+        """Return Unix mode for newly created directories, or None.
+        """
+        if not self._mode_check_done:
+            self._find_creation_modes()
+        return self._dir_mode
         
     def get_repository_transport(self, repository_format):
         """Get the transport for use by repository format in this BzrDir.
@@ -621,6 +661,7 @@
         self._format = _format
         self.transport = _transport.clone('.bzr')
         self.root_transport = _transport
+        self._mode_check_done = False
 
     def is_control_filename(self, filename):
         """True if filename is the name of a path which is reserved for bzrdir's.
@@ -2231,8 +2272,8 @@
             if name.startswith('basis-inventory.'):
                 self.garbage_inventories.append(name)
         # create new directories for repository, working tree and branch
-        self.dir_mode = self.bzrdir._control_files._dir_mode
-        self.file_mode = self.bzrdir._control_files._file_mode
+        self.dir_mode = self.bzrdir._get_dir_mode()
+        self.file_mode = self.bzrdir._get_file_mode()
         repository_names = [('inventory.weave', True),
                             ('revision-store', True),
                             ('weaves', True)]

=== modified file 'bzrlib/lockable_files.py'
--- a/bzrlib/lockable_files.py	2008-05-08 04:33:38 +0000
+++ b/bzrlib/lockable_files.py	2008-05-21 03:05:59 +0000
@@ -66,11 +66,6 @@
     # _lock_count: If _lock_mode is true, a positive count of the number of
     # times the lock has been taken *by this process*.   
     
-    # If set to False (by a plugin, etc) BzrBranch will not set the
-    # mode on created files or directories
-    _set_file_mode = True
-    _set_dir_mode = True
-
     def __init__(self, transport, lock_name, lock_class):
         """Create a LockableFiles group
 
@@ -126,7 +121,10 @@
         return urlutils.escape(safe_unicode(file_or_path))
 
     def _find_modes(self):
-        """Determine the appropriate modes for files and directories."""
+        """Determine the appropriate modes for files and directories.
+        
+        :deprecated: Replaced by BzrDir._find_modes.
+        """
         try:
             st = self._transport.stat('.')
         except errors.TransportNotPossible:
@@ -140,10 +138,6 @@
             self._dir_mode = (st.st_mode & 07777) | 00700
             # Remove the sticky and execute bits for files
             self._file_mode = self._dir_mode & ~07111
-        if not self._set_dir_mode:
-            self._dir_mode = None
-        if not self._set_file_mode:
-            self._file_mode = None
 
     def controlfilename(self, file_or_path):
         """Return location relative to branch."""

=== modified file 'bzrlib/repofmt/pack_repo.py'
--- a/bzrlib/repofmt/pack_repo.py	2008-05-19 18:56:45 +0000
+++ b/bzrlib/repofmt/pack_repo.py	2008-05-21 02:59:20 +0000
@@ -604,7 +604,7 @@
         return NewPack(self._pack_collection._upload_transport,
             self._pack_collection._index_transport,
             self._pack_collection._pack_transport, upload_suffix=self.suffix,
-            file_mode=self._pack_collection.repo.control_files._file_mode)
+            file_mode=self._pack_collection.repo.bzrdir._get_file_mode())
 
     def _copy_revision_texts(self):
         """Copy revision data to the new pack."""
@@ -1586,7 +1586,7 @@
             for key, value in disk_nodes:
                 builder.add_node(key, value)
             self.transport.put_file('pack-names', builder.finish(),
-                mode=self.repo.control_files._file_mode)
+                mode=self.repo.bzrdir._get_file_mode())
             # move the baseline forward
             self._packs_at_load = disk_nodes
             # now clear out the obsolete packs directory
@@ -1630,7 +1630,7 @@
             raise errors.NotWriteLocked(self)
         self._new_pack = NewPack(self._upload_transport, self._index_transport,
             self._pack_transport, upload_suffix='.pack',
-            file_mode=self.repo.control_files._file_mode)
+            file_mode=self.repo.bzrdir._get_file_mode())
         # allow writing: queue writes to a new index
         self.revision_index.add_writable_index(self._new_pack.revision_index,
             self._new_pack)
@@ -1713,7 +1713,7 @@
             add_callback=add_callback)
         self.repo._revision_knit = knit.KnitVersionedFile(
             'revisions', self.transport.clone('..'),
-            self.repo.control_files._file_mode,
+            self.repo.bzrdir._get_file_mode(),
             create=False,
             index=knit_index, delta=False, factory=knit.KnitPlainFactory(),
             access_method=self.repo._pack_collection.revision_index.knit_access)
@@ -1731,7 +1731,7 @@
             add_callback=add_callback, parents=False)
         self.repo._signature_knit = knit.KnitVersionedFile(
             'signatures', self.transport.clone('..'),
-            self.repo.control_files._file_mode,
+            self.repo.bzrdir._get_file_mode(),
             create=False,
             index=knit_index, delta=False, factory=knit.KnitPlainFactory(),
             access_method=self.repo._pack_collection.signature_index.knit_access)
@@ -1820,7 +1820,7 @@
             add_callback=add_callback, deltas=True, parents=True)
         return knit.KnitVersionedFile(
             'inventory', self.transport.clone('..'),
-            self.repo.control_files._file_mode,
+            self.repo.bzrdir._get_file_mode(),
             create=False,
             index=knit_index, delta=True, factory=knit.KnitPlainFactory(),
             access_method=self.repo._pack_collection.inventory_index.knit_access)

=== modified file 'bzrlib/repofmt/weaverepo.py'
--- a/bzrlib/repofmt/weaverepo.py	2008-05-12 02:40:40 +0000
+++ b/bzrlib/repofmt/weaverepo.py	2008-05-21 02:59:20 +0000
@@ -52,9 +52,8 @@
     _serializer = xml5.serializer_v5
 
     def __init__(self, _format, a_bzrdir, _revision_store, control_store, text_store):
-        # we reuse one control files instance.
-        dir_mode = a_bzrdir._control_files._dir_mode
-        file_mode = a_bzrdir._control_files._file_mode
+        dir_mode = a_bzrdir._get_dir_mode()
+        file_mode = a_bzrdir._get_file_mode()
 
         def get_store(name, compressed=True, prefixed=False):
             # FIXME: This approach of assuming stores are all entirely compressed
@@ -298,8 +297,8 @@
                                 'branch-lock', lockable_files.TransportLock)
         control_files.create_lock()
         control_files.lock_write()
-        control_files._transport.mkdir_multi(dirs,
-                mode=control_files._dir_mode)
+        a_bzrdir.transport.mkdir_multi(dirs,
+            mode=a_bzrdir._get_dir_mode())
         try:
             for file, content in files:
                 control_files.put(file, content)

=== modified file 'bzrlib/repository.py'
--- a/bzrlib/repository.py	2008-05-19 18:56:45 +0000
+++ b/bzrlib/repository.py	2008-05-21 02:59:20 +0000
@@ -1947,8 +1947,6 @@
                                                 _revision_store,
                                                 control_store,
                                                 text_store)
-        dir_mode = self.control_files._dir_mode
-        file_mode = self.control_files._file_mode
 
     @needs_read_lock
     def is_shared(self):
@@ -2212,7 +2210,7 @@
         control_files.lock_write()
         try:
             control_files._transport.mkdir_multi(dirs,
-                    mode=control_files._dir_mode)
+                mode=a_bzrdir._get_dir_mode())
             for file, content in files:
                 control_files.put(file, content)
             for file, content in utf8_files:

=== modified file 'bzrlib/tests/branch_implementations/test_permissions.py'
--- a/bzrlib/tests/branch_implementations/test_permissions.py	2007-03-16 03:20:17 +0000
+++ b/bzrlib/tests/branch_implementations/test_permissions.py	2008-05-21 03:01:10 +0000
@@ -1,5 +1,4 @@
-# Copyright (C) 2005 Canonical Ltd
-# -*- coding: utf-8 -*-
+# Copyright (C) 2005, 2008 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
@@ -57,12 +56,16 @@
         mode = stat.S_IMODE(os.stat('a').st_mode)
         t = self.make_branch_and_tree('.')
         b = t.branch
+        self.assertEqualMode(mode, b.bzrdir._get_dir_mode())
+        self.assertEqualMode(mode & ~07111, b.bzrdir._get_file_mode())
         self.assertEqualMode(mode, b.control_files._dir_mode)
         self.assertEqualMode(mode & ~07111, b.control_files._file_mode)
 
         os.mkdir('b')
         os.chmod('b', 02777)
         b = self.make_branch('b')
+        self.assertEqualMode(02777, b.bzrdir._get_dir_mode())
+        self.assertEqualMode(00666, b.bzrdir._get_file_mode())
         self.assertEqualMode(02777, b.control_files._dir_mode)
         self.assertEqualMode(00666, b.control_files._file_mode)
         check_mode_r(self, 'b/.bzr', 00666, 02777)
@@ -70,6 +73,8 @@
         os.mkdir('c')
         os.chmod('c', 02750)
         b = self.make_branch('c')
+        self.assertEqualMode(02750, b.bzrdir._get_dir_mode())
+        self.assertEqualMode(00640, b.bzrdir._get_file_mode())
         self.assertEqualMode(02750, b.control_files._dir_mode)
         self.assertEqualMode(00640, b.control_files._file_mode)
         check_mode_r(self, 'c/.bzr', 00640, 02750)
@@ -77,6 +82,8 @@
         os.mkdir('d')
         os.chmod('d', 0700)
         b = self.make_branch('d')
+        self.assertEqualMode(0700, b.bzrdir._get_dir_mode())
+        self.assertEqualMode(0600, b.bzrdir._get_file_mode())
         self.assertEqualMode(0700, b.control_files._dir_mode)
         self.assertEqualMode(0600, b.control_files._file_mode)
         check_mode_r(self, 'd/.bzr', 00600, 00700)

=== modified file 'bzrlib/tests/test_permissions.py'
--- a/bzrlib/tests/test_permissions.py	2008-04-24 07:22:53 +0000
+++ b/bzrlib/tests/test_permissions.py	2008-05-21 03:05:59 +0000
@@ -104,6 +104,8 @@
         b = t.branch
         self.assertEqualMode(0755, b.control_files._dir_mode)
         self.assertEqualMode(0644, b.control_files._file_mode)
+        self.assertEqualMode(0755, b.bzrdir._get_dir_mode())
+        self.assertEqualMode(0644, b.bzrdir._get_file_mode())
 
         # Modifying a file shouldn't break the permissions
         open('a', 'wb').write('foo2\n')
@@ -124,6 +126,8 @@
         b = t.branch
         self.assertEqualMode(0775, b.control_files._dir_mode)
         self.assertEqualMode(0664, b.control_files._file_mode)
+        self.assertEqualMode(0775, b.bzrdir._get_dir_mode())
+        self.assertEqualMode(0664, b.bzrdir._get_file_mode())
 
         open('a', 'wb').write('foo3\n')
         t.commit('foo3')
@@ -142,6 +146,8 @@
         b = t.branch
         self.assertEqualMode(02775, b.control_files._dir_mode)
         self.assertEqualMode(0664, b.control_files._file_mode)
+        self.assertEqualMode(02775, b.bzrdir._get_dir_mode())
+        self.assertEqualMode(0664, b.bzrdir._get_file_mode())
 
         open('a', 'wb').write('foo4\n')
         t.commit('foo4')
@@ -152,43 +158,6 @@
         t.commit('new d')
         check_mode_r(self, '.bzr', 0664, 02775)
 
-    def test_disable_set_mode(self):
-        # TODO: jam 20051215 Ultimately, this test should probably test that
-        #                    extra chmod calls aren't being made
-        try:
-            transport = get_transport(self.get_url())
-            transport.put_bytes('my-lock', '')
-            lockable = LockableFiles(transport, 'my-lock', TransportLock)
-            self.assertNotEqual(None, lockable._dir_mode)
-            self.assertNotEqual(None, lockable._file_mode)
-
-            LockableFiles._set_dir_mode = False
-            transport = get_transport('.')
-            lockable = LockableFiles(transport, 'my-lock', TransportLock)
-            self.assertEqual(None, lockable._dir_mode)
-            self.assertNotEqual(None, lockable._file_mode)
-
-            LockableFiles._set_file_mode = False
-            transport = get_transport('.')
-            lockable = LockableFiles(transport, 'my-lock', TransportLock)
-            self.assertEqual(None, lockable._dir_mode)
-            self.assertEqual(None, lockable._file_mode)
-
-            LockableFiles._set_dir_mode = True
-            transport = get_transport('.')
-            lockable = LockableFiles(transport, 'my-lock', TransportLock)
-            self.assertNotEqual(None, lockable._dir_mode)
-            self.assertEqual(None, lockable._file_mode)
-
-            LockableFiles._set_file_mode = True
-            transport = get_transport('.')
-            lockable = LockableFiles(transport, 'my-lock', TransportLock)
-            self.assertNotEqual(None, lockable._dir_mode)
-            self.assertNotEqual(None, lockable._file_mode)
-        finally:
-            LockableFiles._set_dir_mode = True
-            LockableFiles._set_file_mode = True
-
 
 class TestSftpPermissions(TestCaseWithSFTPServer):
 
@@ -217,6 +186,8 @@
         b_local = t.branch
         self.assertEqualMode(0755, b_local.control_files._dir_mode)
         self.assertEqualMode(0644, b_local.control_files._file_mode)
+        self.assertEqualMode(0755, b_local.bzrdir._get_dir_mode())
+        self.assertEqualMode(0644, b_local.bzrdir._get_file_mode())
 
         os.mkdir('sftp')
         sftp_url = self.get_url('sftp')
@@ -230,6 +201,8 @@
         b_sftp = Branch.open(sftp_url)
         self.assertEqualMode(0755, b_sftp.control_files._dir_mode)
         self.assertEqualMode(0644, b_sftp.control_files._file_mode)
+        self.assertEqualMode(0755, b_sftp.bzrdir._get_dir_mode())
+        self.assertEqualMode(0644, b_sftp.bzrdir._get_file_mode())
 
         open('local/a', 'wb').write('foo2\n')
         t_local.commit('foo2')
@@ -251,6 +224,8 @@
         b_sftp = Branch.open(sftp_url)
         self.assertEqualMode(0775, b_sftp.control_files._dir_mode)
         self.assertEqualMode(0664, b_sftp.control_files._file_mode)
+        self.assertEqualMode(0775, b_sftp.bzrdir._get_dir_mode())
+        self.assertEqualMode(0664, b_sftp.bzrdir._get_file_mode())
 
         open('local/a', 'wb').write('foo3\n')
         t_local.commit('foo3')

=== modified file 'bzrlib/workingtree.py'
--- a/bzrlib/workingtree.py	2008-05-08 04:33:38 +0000
+++ b/bzrlib/workingtree.py	2008-05-12 05:46:44 +0000
@@ -224,7 +224,7 @@
         wt_trans = self.bzrdir.get_workingtree_transport(None)
         cache_filename = wt_trans.local_abspath('stat-cache')
         self._hashcache = hashcache.HashCache(basedir, cache_filename,
-                                              self._control_files._file_mode)
+            self.bzrdir._get_file_mode())
         hc = self._hashcache
         hc.read()
         # is this scan needed ? it makes things kinda slow.




More information about the bazaar-commits mailing list