diff options
Diffstat (limited to 'setuptools/svn_utils.py')
-rw-r--r-- | setuptools/svn_utils.py | 242 |
1 files changed, 6 insertions, 236 deletions
diff --git a/setuptools/svn_utils.py b/setuptools/svn_utils.py index 5783489c..657393e2 100644 --- a/setuptools/svn_utils.py +++ b/setuptools/svn_utils.py @@ -119,240 +119,10 @@ def parse_externals(path): return externals
+def get_svn_tool_version():
+ _, data = _run_command(['svn', '--version', '--quiet'])
+ if data:
+ return data.strip()
+ else:
+ return ''
-
-
-
-#TODO add the text entry back, and make its use dependent on the
-# non existence of svn?
-
-class SVNEntries(object):
- svn_tool_version = ''
-
- def __init__(self, path, data):
- self.path = path
- self.data = data
- if not self.svn_tool_version:
- self.svn_tool_version = self.get_svn_tool_version()
-
- @staticmethod
- def get_svn_tool_version():
- _, data = _run_command(['svn', '--version', '--quiet'])
- if data:
- return data.strip()
- else:
- return ''
-
- @classmethod
- def load_dir(class_, base):
- filename = os.path.join(base, '.svn', 'entries')
- f = open(filename)
- result = SVNEntries.read(f, base)
- f.close()
- return result
-
- @classmethod
- def read(class_, file, path=None):
- data = file.read()
-
- if data.startswith('<?xml'):
- #entries were originally xml so pre-1.4.x
- return SVNEntriesXML(path, data)
- elif path is None:
- return SVNEntriesText(path, data)
- else:
- result = SVNEntriesText(path, data)
- if result.is_valid():
- return result
- else:
- return SVNEntriesCMD(path, data)
-
- def parse_revision(self):
- all_revs = self.parse_revision_numbers() + [0]
- return max(all_revs)
-
- def __get_cached_external_dirs(self):
- return self.external_dirs
-
- def _get_externals_data(self, filename):
- found = False
- if not os.path.isfile(filename):
- return
-
- f = open(filename,'rt')
- for line in iter(f.readline, ''): # can't use direct iter!
- parts = line.split()
- if len(parts)==2:
- kind, length = parts
- data = f.read(int(length))
- if kind == 'K' and data == 'svn:externals':
- found = True
- elif kind == 'V' and found:
- f.close()
- break
- else:
- f.close()
- return ''
-
- def get_external_dirs(self, filename):
- return parse_externals(self.path)
-
-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):
- # remove the SVN version number from the first line
- svn_version, _, sections = self.data.partition("\n")
- try:
- svn_version = int(svn_version)
- if not svn_version in self.known_svn_versions.values():
- log.warn("SVNEntriesText: Unknown subversion verson %d."
- " Maybe another parser will work,", svn_version)
- except ValueError:
- return
-
- SECTION_DIVIDER = '\f\n' # or '\n\x0c\n'?
- sections = sections.split(SECTION_DIVIDER)
- sections = [section.splitlines() for section in sections if section]
-
- self.sections = sections
- self.get_sections = self.__get_cached_sections
- return self.sections
-
- def is_valid(self):
- return bool(self.get_sections())
-
- 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):
- #Note for self this skip and only returns the children
- 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 parse_revision_numbers(self):
- revre = re.compile(r'committed-rev="(\d+)"')
- return [
- int(m.group(1))
- for m in revre.finditer(self.data)
- if m.group(1)
- ]
-
- 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)
- if match.group(1)
- ]
- return results
-
-import xml.dom.pulldom
-
-class SVNEntriesCMD(SVNEntries):
- #<info>
- # <entry path='' //Entry Path
- # revision=''
- # kind=''>
- # <url>
- # <repository>
- # <root>...</root>
- # <uuid>...</uuid>
- # </repository>
- # <wc-info>
- # ...
- # </wc-info>
- # <commit revision=''>
- # ...
- # </commit>
- # </entry>
- # ...
- #</info>
- entrypathre = re.compile(r'<entry\s+[^>]*path="(\.+)">', re.I)
- entryre = re.compile(r'<entry.*?</entry>', re.DOTALL or re.I)
- namere = re.compile(r'<name>(.*?)</name>', re.I)
-
- def __get_cached_entries(self):
- return self.entries
-
- def is_valid(self):
- return bool(self.get_entries())
-
- def get_dir_data(self):
- #This returns the info entry for the directory ONLY
- 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.entries = list()
- for event, node in doc:
- if event=='START_ELEMENT' and node.nodeName=='entry':
- doc.expandNode(node)
- self.entries.append(node)
-
- self.get_entries = self.__get_cached_entries
- return self.entries
-
-
-
- def __get_cached_revision(self):
- return self.revision
-
- def parse_revision(self):
- self.revision = parse_revision(self.path)
- self.parse_revision = self.__get_cached_revision
- return self.revision
-
- def get_undeleted_records(self):
- #NOTE: Need to parse entities?
- if not self.is_valid():
- return list()
- else:
- return [
- _get_entry_name(element)
- for element in self.get_entries()[1:]
- if _get_entry_schedule(element).lower() != 'deleted'
- ]
-
- def _get_externals_data(self, filename):
-
- #othewise will be called twice.
- if os.path.basename(filename).lower() != 'dir-props':
- return ''
-
- try:
- _, lines = _run_command(['svn',
- 'propget', 'svn:externals', self.path])
- lines = [line for line in lines.splitlines() if line]
- return lines
- except ValueError:
- return ''
|