Commits

Anonymous committed b1d0902

Support svn 1.4 working copy format (backport from trunk)

Comments (0)

Files changed (3)

 Release Notes/Change History
 ----------------------------
 
+0.6c3
+ * Fixed breakages caused by Subversion 1.4's new "working copy" format
+
 0.6c2
  * The ``ez_setup`` module displays the conflicting version of setuptools (and
    its installation location) when a script requests a version that's not

setuptools/command/egg_info.py

             import time; version += time.strftime("-%Y%m%d")
         return version
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
     def get_svn_revision(self):
         revision = 0
         urlre = re.compile('url="([^"]+)"')
         revre = re.compile('committed-rev="(\d+)"')
+
         for base,dirs,files in os.walk(os.curdir):
             if '.svn' not in dirs:
                 dirs[:] = []
             f = open(os.path.join(base,'.svn','entries'))
             data = f.read()
             f.close()
-            dirurl = urlre.search(data).group(1)    # get repository URL
+
+            if data.startswith('8'):
+                data = map(str.splitlines,data.split('\n\x0c\n'))
+                del data[0][0]  # get rid of the '8'
+                dirurl = data[0][3]
+                localrev = max([int(d[9]) for d in data if len(d)>9])
+            elif data.startswith('<?xml'):
+                dirurl = urlre.search(data).group(1)    # get repository URL
+                localrev = max([int(m.group(1)) for m in revre.finditer(data)])
+            else:
+                from warnings import warn
+                warn("unrecognized .svn/entries format; skipping "+base)
+                dirs[:] = []
+                continue
             if base==os.curdir:
                 base_url = dirurl+'/'   # save the root url
             elif not dirurl.startswith(base_url):
                 dirs[:] = []
                 continue    # not part of the same svn tree, skip it
-            for match in revre.finditer(data):
-                revision = max(revision, int(match.group(1)))
+            revision = max(revision, localrev)
+
         return str(revision or get_pkg_info_revision())
 
+
+
+
+
+
     def find_sources(self):
         """Generate SOURCES.txt manifest file"""
         manifest_filename = os.path.join(self.egg_info,"SOURCES.txt")

setuptools/command/sdist.py

             yield joinpath(dirname, parts[0])
 
 
+entries_pattern = re.compile(r'name="([^"]+)"(?![^>]+deleted="true")', re.I)
+
+def entries_finder(dirname, filename):
+    f = open(filename,'rU')
+    data = f.read()
+    f.close()
+    if data.startswith('8'):    # subversion 1.4
+        for record in map(str.splitlines, data.split('\n\x0c\n')[1:]):
+            if not record or len(record)>=6 and record[5]=="delete":
+                continue    # skip deleted
+            yield joinpath(dirname, record[0])
+    elif data.startswith('<?xml'):
+        for match in entries_pattern.finditer(data):
+            yield joinpath(dirname,unescape(match.group(1)))
+    else:
+        from warnings import warn
+        warn("unrecognized .svn/entries format in "+dirname)
+
+
 finders = [
     (convert_path('CVS/Entries'),
         re_finder(re.compile(r"^\w?/([^/]+)/", re.M))),
-    (convert_path('.svn/entries'),
-        re_finder(
-            re.compile(r'name="([^"]+)"(?![^>]+deleted="true")', re.I),
-            unescape
-        )
-    ),
+    (convert_path('.svn/entries'), entries_finder),
     (convert_path('.svn/dir-props'), externals_finder),
+    (convert_path('.svn/dir-prop-base'), externals_finder),  # svn 1.4
 ]
 
 
 
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 class sdist(_sdist):
     """Smart sdist that finds anything supported by revision control"""