Apply patch to fix SVN-1.6 versioning problem. see #511021

This commit is contained in:
Konstantin Ryabitsev 2009-07-14 14:20:53 +00:00
parent 6a010e7129
commit 66503d53df
2 changed files with 223 additions and 1 deletions

View File

@ -2,7 +2,7 @@
Name: python-setuptools
Version: 0.6c9
Release: 3%{?dist}
Release: 4%{?dist}
Summary: Easily build and distribute Python packages
Group: Applications/System
@ -11,6 +11,7 @@ URL: http://pypi.python.org/pypi/setuptools
Source0: http://pypi.python.org/packages/source/s/setuptools/setuptools-%{version}.tar.gz
Source1: psfl.txt
Source2: zpl.txt
Patch0: http://bugs.python.org/setuptools/file55/svn_versioning_4.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildArch: noarch
@ -41,6 +42,7 @@ requiring setuptools.
%prep
%setup -q -n setuptools-%{version}
%patch0 -p0 -b .svn16
find -name '*.txt' | xargs chmod -x
find -name '*.py' | xargs sed -i '1s|^#!python|#!%{__python}|'
@ -84,6 +86,9 @@ rm -rf $RPM_BUILD_ROOT
%changelog
* Tue Jul 14 2009 Konstantin Ryabitsev <icon@fedoraproject.org> - 0.6c9-4
- Apply SVN-1.6 versioning patch (rhbz #511021)
* Thu Feb 26 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.6c9-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild

217
svn_versioning_4.patch Normal file
View File

@ -0,0 +1,217 @@
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 = [
("&lt;","<"), ("&gt;", ">"), ("&quot;", '"'), ("&apos;", "'"),
@@ -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))),