[Pkg-bazaar-commits] ./bzr/unstable r969: - Add less-sucky is_within_any

Martin Pool mbp at sourcefrog.net
Fri Apr 10 08:21:38 UTC 2009


------------------------------------------------------------
revno: 969
committer: Martin Pool <mbp at sourcefrog.net>
timestamp: Fri 2005-07-22 21:18:14 -0300
message:
  - Add less-sucky is_within_any
modified:
  bzrlib/osutils.py
  bzrlib/selftest/__init__.py
  bzrlib/selftest/testinv.py
-------------- next part --------------
=== modified file 'bzrlib/osutils.py'
--- a/bzrlib/osutils.py	2005-07-11 07:33:45 +0000
+++ b/bzrlib/osutils.py	2005-07-23 00:18:14 +0000
@@ -38,6 +38,9 @@
 
 
 _QUOTE_RE = re.compile(r'([^a-zA-Z0-9.,:/_~-])')
+
+_SLASH_RE = re.compile(r'[\\/]+')
+
 def quotefn(f):
     """Return a quoted filename filename
 
@@ -131,9 +134,29 @@
 
 def is_inside(dir, fname):
     """True if fname is inside dir.
+    
+    The parameters should typically be passed to os.path.normpath first, so
+    that . and .. and repeated slashes are eliminated, and the separators
+    are canonical for the platform.
+    
+    >>> is_inside('src', 'src/foo.c')
+    True
+    >>> is_inside('src', 'srccontrol')
+    False
+    >>> is_inside('src', 'src/a/a/a/foo.c')
+    True
+    >>> is_inside('foo.c', 'foo.c')
+    True
     """
-    return os.path.commonprefix([dir, fname]) == dir
-
+    # XXX: Most callers of this can actually do something smarter by 
+    # looking at the inventory
+    
+    dir = dir.split(os.sep)
+    pl = len(dir)
+    fname = fname.split(os.sep)
+   
+    return (len(fname) >= pl) and (dir == fname[:pl])
+    
 
 def is_inside_any(dir_list, fname):
     """True if fname is inside any of given dirs."""

=== modified file 'bzrlib/selftest/__init__.py'
--- a/bzrlib/selftest/__init__.py	2005-07-22 23:31:09 +0000
+++ b/bzrlib/selftest/__init__.py	2005-07-23 00:18:14 +0000
@@ -47,7 +47,8 @@
               bzrlib.osutils, bzrlib.commands, bzrlib.merge3):
         if m not in MODULES_TO_DOCTEST:
             MODULES_TO_DOCTEST.append(m)
-            
+    
+    # ugly ugly!
     for m in (bzrlib.selftest.whitebox,
               bzrlib.selftest.versioning,
               bzrlib.selftest.testinv,

=== modified file 'bzrlib/selftest/testinv.py'
--- a/bzrlib/selftest/testinv.py	2005-07-22 23:58:11 +0000
+++ b/bzrlib/selftest/testinv.py	2005-07-23 00:18:14 +0000
@@ -18,6 +18,7 @@
 
 from bzrlib.inventory import Inventory, InventoryEntry
 
+
 class TestIsWithin(TestBase):
     def runTest(self):
         from bzrlib.osutils import is_inside_any
@@ -28,6 +29,11 @@
                          ]:
             self.assert_(is_inside_any(dirs, fn))
             
+        for dirs, fn in [(['src'], 'srccontrol'),
+                         (['src'], 'srccontrol/foo')]:
+            self.assertFalse(is_inside_any(dirs, fn))
+            
+            
             
 class TestInventoryIds(TestBase):
     def runTest(self):



More information about the Pkg-bazaar-commits mailing list