218 lines
7.4 KiB
Diff
218 lines
7.4 KiB
Diff
Index: setuptools/svn_util.py
|
|
===================================================================
|
|
--- setuptools/svn_util.py (revision 0)
|
|
+++ setuptools/svn_util.py (revision 0)
|
|
@@ -0,0 +1,109 @@
|
|
+import os
|
|
+import re
|
|
+
|
|
+def get_entries_files(base, recurse=True):
|
|
+ for base,dirs,files in os.walk(os.curdir):
|
|
+ if '.svn' not in dirs:
|
|
+ dirs[:] = []
|
|
+ continue # no sense walking uncontrolled subdirs
|
|
+ dirs.remove('.svn')
|
|
+ f = open(os.path.join(base,'.svn','entries'))
|
|
+ yield f.read()
|
|
+ f.close()
|
|
+
|
|
+class SVNEntries(object):
|
|
+ def __init__(self, data):
|
|
+ self.data = data
|
|
+
|
|
+ @classmethod
|
|
+ def load(class_, base):
|
|
+ filename = os.path.join(base, '.svn', 'entries')
|
|
+ f = open(filename)
|
|
+ result = SVNEntries.read(f)
|
|
+ f.close()
|
|
+ return result
|
|
+
|
|
+ @classmethod
|
|
+ def read(class_, file):
|
|
+ data = file.read()
|
|
+ is_xml = data.startswith('<?xml')
|
|
+ class_ = [SVNEntriesText, SVNEntriesXML][is_xml]
|
|
+ return class_(data)
|
|
+
|
|
+ def parse_revision(self):
|
|
+ all_revs = self.parse_revision_numbers() + [0]
|
|
+ return max(all_revs)
|
|
+
|
|
+class SVNEntriesText(SVNEntries):
|
|
+ known_svn_versions = {
|
|
+ '1.4.x': 8,
|
|
+ '1.5.x': 9,
|
|
+ '1.6.x': 10,
|
|
+ }
|
|
+
|
|
+ def __get_cached_sections(self):
|
|
+ return self.sections
|
|
+
|
|
+ def get_sections(self):
|
|
+ SECTION_DIVIDER = '\f\n'
|
|
+ sections = self.data.split(SECTION_DIVIDER)
|
|
+ sections = map(str.splitlines, sections)
|
|
+ try:
|
|
+ # remove the SVN version number from the first line
|
|
+ svn_version = int(sections[0].pop(0))
|
|
+ if not svn_version in self.known_svn_versions.values():
|
|
+ log.warn("Unknown subversion verson %d", svn_version)
|
|
+ except ValueError:
|
|
+ return
|
|
+ self.sections = sections
|
|
+ self.get_sections = self.__get_cached_sections
|
|
+ return self.sections
|
|
+
|
|
+ def is_valid(self):
|
|
+ return bool(self.get_sections())
|
|
+
|
|
+ def get_url(self):
|
|
+ return self.get_sections()[0][4]
|
|
+
|
|
+ def parse_revision_numbers(self):
|
|
+ revision_line_number = 9
|
|
+ rev_numbers = [
|
|
+ int(section[revision_line_number])
|
|
+ for section in self.get_sections()
|
|
+ if len(section)>revision_line_number
|
|
+ and section[revision_line_number]
|
|
+ ]
|
|
+ return rev_numbers
|
|
+
|
|
+ def get_undeleted_records(self):
|
|
+ undeleted = lambda s: s and s[0] and (len(s) < 6 or s[5] != 'delete')
|
|
+ result = [
|
|
+ section[0]
|
|
+ for section in self.get_sections()
|
|
+ if undeleted(section)
|
|
+ ]
|
|
+ return result
|
|
+
|
|
+class SVNEntriesXML(SVNEntries):
|
|
+ def is_valid(self):
|
|
+ return True
|
|
+
|
|
+ def get_url(self):
|
|
+ "Get repository URL"
|
|
+ urlre = re.compile('url="([^"]+)"')
|
|
+ return urlre.search(self.data).group(1)
|
|
+
|
|
+ def parse_revision_numbers(self):
|
|
+ revre = re.compile('committed-rev="(\d+)"')
|
|
+ return [
|
|
+ int(m.group(1))
|
|
+ for m in revre.finditer(self.data)
|
|
+ ]
|
|
+
|
|
+ def get_undeleted_records(self):
|
|
+ entries_pattern = re.compile(r'name="([^"]+)"(?![^>]+deleted="true")', re.I)
|
|
+ results = [
|
|
+ unescape(match.group(1))
|
|
+ for match in entries_pattern.finditer(self.data)
|
|
+ ]
|
|
+ return results
|
|
|
|
Property changes on: setuptools/svn_util.py
|
|
___________________________________________________________________
|
|
Name: svn:keywords
|
|
+ Id Rev Author Date
|
|
Name: svn:eol-style
|
|
+ native
|
|
|
|
Index: setuptools/command/egg_info.py
|
|
===================================================================
|
|
--- setuptools/command/egg_info.py (revision 72970)
|
|
+++ setuptools/command/egg_info.py (working copy)
|
|
@@ -8,6 +8,7 @@
|
|
from distutils.errors import *
|
|
from distutils import log
|
|
from setuptools.command.sdist import sdist
|
|
+from setuptools import svn_util
|
|
from distutils.util import convert_path
|
|
from distutils.filelist import FileList
|
|
from pkg_resources import parse_requirements, safe_name, parse_version, \
|
|
@@ -205,30 +206,20 @@
|
|
|
|
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[:] = []
|
|
continue # no sense walking uncontrolled subdirs
|
|
dirs.remove('.svn')
|
|
- f = open(os.path.join(base,'.svn','entries'))
|
|
- data = f.read()
|
|
- f.close()
|
|
-
|
|
- if data.startswith('9') or data.startswith('8'):
|
|
- data = map(str.splitlines,data.split('\n\x0c\n'))
|
|
- del data[0][0] # get rid of the '8' or '9'
|
|
- dirurl = data[0][3]
|
|
- localrev = max([int(d[9]) for d in data if len(d)>9 and d[9]]+[0])
|
|
- 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)]+[0])
|
|
- else:
|
|
+
|
|
+ entries = svn_util.SVNEntries.load(base)
|
|
+ if not entries.is_valid():
|
|
log.warn("unrecognized .svn/entries format; skipping %s", base)
|
|
dirs[:] = []
|
|
continue
|
|
+ localrev = entries.parse_revision()
|
|
+ dirurl = entries.get_url()
|
|
if base==os.curdir:
|
|
base_url = dirurl+'/' # save the root url
|
|
elif not dirurl.startswith(base_url):
|
|
@@ -243,7 +234,6 @@
|
|
|
|
|
|
|
|
-
|
|
def find_sources(self):
|
|
"""Generate SOURCES.txt manifest file"""
|
|
manifest_filename = os.path.join(self.egg_info,"SOURCES.txt")
|
|
Index: setuptools/command/sdist.py
|
|
===================================================================
|
|
--- setuptools/command/sdist.py (revision 72970)
|
|
+++ setuptools/command/sdist.py (working copy)
|
|
@@ -2,6 +2,7 @@
|
|
from distutils.util import convert_path
|
|
from distutils import log
|
|
import os, re, sys, pkg_resources
|
|
+from setuptools.svn_util import SVNEntries
|
|
|
|
entities = [
|
|
("<","<"), (">", ">"), (""", '"'), ("'", "'"),
|
|
@@ -80,24 +81,11 @@
|
|
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('9') or data.startswith('8'): # subversion 1.5/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:
|
|
- log.warn("unrecognized .svn/entries format in %s", dirname)
|
|
+ for record in SVNEntries.load(dirname).get_undeleted_records():
|
|
+ yield joinpath(dirname, record)
|
|
|
|
-
|
|
finders = [
|
|
(convert_path('CVS/Entries'),
|
|
re_finder(re.compile(r"^\w?/([^/]+)/", re.M))),
|