aboutsummaryrefslogtreecommitdiffstats
path: root/setuptools
diff options
context:
space:
mode:
Diffstat (limited to 'setuptools')
-rwxr-xr-xsetuptools/command/sdist.py2
-rw-r--r--setuptools/svn_utils.py62
-rw-r--r--setuptools/tests/test_svn.py9
3 files changed, 52 insertions, 21 deletions
diff --git a/setuptools/command/sdist.py b/setuptools/command/sdist.py
index 2a37c308..92f8d468 100755
--- a/setuptools/command/sdist.py
+++ b/setuptools/command/sdist.py
@@ -68,7 +68,7 @@ def externals_finder(dirname, filename):
def entries_finder(dirname, filename):
- for record in SVNEntries.load(dirname).get_undeleted_records():
+ for record in svn_utils.parse_manifest(dirname):
yield joinpath(dirname, record)
diff --git a/setuptools/svn_utils.py b/setuptools/svn_utils.py
index 93912b1a..5ada2e31 100644
--- a/setuptools/svn_utils.py
+++ b/setuptools/svn_utils.py
@@ -53,6 +53,36 @@ def parse_revision(path):
pass
return 0
+#svn list returns relative o
+def parse_manifest(path):
+ #NOTE: Need to parse entities?
+ _, data = _run_command(['svn', 'info', '-R', '--xml', path])
+
+ doc = xml.dom.pulldom.parseString(data)
+ entries = list()
+ for event, node in doc:
+ if event=='START_ELEMENT' and node.nodeName=='entry':
+ doc.expandNode(node)
+ entries.append(node)
+
+ if entries:
+ return [
+ _get_entry_name(element)
+ for element in entries[1:]
+ if _get_entry_schedule(element).lower() != 'deleted'
+ ]
+ else:
+ return []
+
+def _get_entry_name(entry):
+ return entry.getAttribute('path')
+
+def _get_entry_schedule(entry):
+ schedule = entry.getElementsByTagName('schedule')[0]
+ return "".join([t.nodeValue for t in schedule.childNodes
+ if t.nodeType == t.TEXT_NODE])
+
+
#TODO add the text entry back, and make its use dependent on the
# non existence of svn?
@@ -253,35 +283,28 @@ class SVNEntriesCMD(SVNEntries):
entryre = re.compile(r'<entry.*?</entry>', re.DOTALL or re.I)
namere = re.compile(r'<name>(.*?)</name>', re.I)
- def __get_cached_dir_data(self):
- return self.dir_data
-
def __get_cached_entries(self):
return self.entries
def is_valid(self):
- return self.get_dir_data() is not None
+ return bool(self.get_entries())
def get_dir_data(self):
#This returns the info entry for the directory ONLY
- _, data = _run_command(['svn', 'info', '--xml', self.path])
+ return self.get_entries()[0]
+
+ def get_entries(self):
+ #regarding the shell argument, see: http://bugs.python.org/issue8557
+ _, data = _run_command(['svn', 'info',
+ '--depth', 'immediates', '--xml', self.path])
doc = xml.dom.pulldom.parseString(data)
- self.dir_data = None
+ self.entries = list()
for event, node in doc:
if event=='START_ELEMENT' and node.nodeName=='entry':
doc.expandNode(node)
- self.dir_data = node
- break
+ self.entries.append(node)
- if self.dir_data:
- self.get_dir_data = self.__get_cached_dir_data
- return self.dir_data
-
- def get_entries(self):
- #regarding the shell argument, see: http://bugs.python.org/issue8557
- _, data = _run_command(['svn', 'list', '--xml', self.path])
- self.entries = self.entryre.findall(data)
self.get_entries = self.__get_cached_entries
return self.entries
@@ -301,10 +324,9 @@ class SVNEntriesCMD(SVNEntries):
return list()
else:
return [
- m.group(1)
- for entry in self.get_entries()
- for m in self.namere.finditer(entry)
- if m.group(1)
+ _get_entry_name(element)
+ for element in self.get_entries()[1:]
+ if _get_entry_schedule(element).lower() != 'deleted'
]
def _get_externals_data(self, filename):
diff --git a/setuptools/tests/test_svn.py b/setuptools/tests/test_svn.py
index d4216491..678508c0 100644
--- a/setuptools/tests/test_svn.py
+++ b/setuptools/tests/test_svn.py
@@ -12,6 +12,7 @@ import stat
from setuptools import svn_utils
from setuptools.command import egg_info
+from setuptools.command import sdist
#requires python >= 2.4
from subprocess import call as _call
@@ -86,6 +87,14 @@ class TestSvn_1_7(unittest.TestCase):
rev = egg_info.egg_info.get_svn_revision()
self.assertEqual(rev, '4')
+ def test_entry_iterator(self):
+ expected = set([
+ os.path.join('.', 'readme.txt'),
+ os.path.join('.', 'other'),
+ os.path.join('.', 'other', 'test.py'),
+ ])
+ self.assertEqual(set(x for x in sdist.entries_finder('.', '')),
+ expected)
def test_suite():
return unittest.defaultTestLoader.loadTestsFromName(__name__)