update to reflect move to Subversion
This commit is contained in:
parent
50bf51a3a9
commit
aaa28df3ce
|
@ -1,81 +0,0 @@
|
||||||
"""Utility class and function to get information about the CVS repository
|
|
||||||
based on checked-out files.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
|
|
||||||
|
|
||||||
def get_repository_list(paths):
|
|
||||||
d = {}
|
|
||||||
for name in paths:
|
|
||||||
if os.path.isfile(name):
|
|
||||||
dir = os.path.dirname(name)
|
|
||||||
else:
|
|
||||||
dir = name
|
|
||||||
rootfile = os.path.join(name, "CVS", "Root")
|
|
||||||
root = open(rootfile).readline().strip()
|
|
||||||
if not d.has_key(root):
|
|
||||||
d[root] = RepositoryInfo(dir), [name]
|
|
||||||
else:
|
|
||||||
d[root][1].append(name)
|
|
||||||
return d.values()
|
|
||||||
|
|
||||||
|
|
||||||
class RepositoryInfo:
|
|
||||||
"""Record holding information about the repository we want to talk to."""
|
|
||||||
cvsroot_path = None
|
|
||||||
branch = None
|
|
||||||
|
|
||||||
# type is '', ':ext', or ':pserver:'
|
|
||||||
type = ""
|
|
||||||
|
|
||||||
def __init__(self, dir=None):
|
|
||||||
if dir is None:
|
|
||||||
dir = os.getcwd()
|
|
||||||
dir = os.path.join(dir, "CVS")
|
|
||||||
root = open(os.path.join(dir, "Root")).readline().strip()
|
|
||||||
if root.startswith(":pserver:"):
|
|
||||||
self.type = ":pserver:"
|
|
||||||
root = root[len(":pserver:"):]
|
|
||||||
elif ":" in root:
|
|
||||||
if root.startswith(":ext:"):
|
|
||||||
root = root[len(":ext:"):]
|
|
||||||
self.type = ":ext:"
|
|
||||||
self.repository = root
|
|
||||||
if ":" in root:
|
|
||||||
host, path = root.split(":", 1)
|
|
||||||
self.cvsroot_path = path
|
|
||||||
else:
|
|
||||||
self.cvsroot_path = root
|
|
||||||
fn = os.path.join(dir, "Tag")
|
|
||||||
if os.path.isfile(fn):
|
|
||||||
self.branch = open(fn).readline().strip()[1:]
|
|
||||||
|
|
||||||
def get_cvsroot(self):
|
|
||||||
return self.type + self.repository
|
|
||||||
|
|
||||||
_repository_dir_cache = {}
|
|
||||||
|
|
||||||
def get_repository_file(self, path):
|
|
||||||
filename = os.path.abspath(path)
|
|
||||||
if os.path.isdir(path):
|
|
||||||
dir = path
|
|
||||||
join = 0
|
|
||||||
else:
|
|
||||||
dir = os.path.dirname(path)
|
|
||||||
join = 1
|
|
||||||
try:
|
|
||||||
repodir = self._repository_dir_cache[dir]
|
|
||||||
except KeyError:
|
|
||||||
repofn = os.path.join(dir, "CVS", "Repository")
|
|
||||||
repodir = open(repofn).readline().strip()
|
|
||||||
repodir = os.path.join(self.cvsroot_path, repodir)
|
|
||||||
self._repository_dir_cache[dir] = repodir
|
|
||||||
if join:
|
|
||||||
fn = os.path.join(repodir, os.path.basename(path))
|
|
||||||
else:
|
|
||||||
fn = repodir
|
|
||||||
return fn[len(self.cvsroot_path)+1:]
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "<RepositoryInfo for %r>" % self.get_cvsroot()
|
|
|
@ -1,161 +0,0 @@
|
||||||
#!/usr/bin/env python
|
|
||||||
"""Script to locate email addresses in the CVS logs."""
|
|
||||||
__version__ = '$Revision$'
|
|
||||||
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
import UserDict
|
|
||||||
|
|
||||||
import cvsinfo
|
|
||||||
|
|
||||||
|
|
||||||
class Acknowledgements(UserDict.UserDict):
|
|
||||||
def add(self, email, name, path):
|
|
||||||
d = self.data
|
|
||||||
d.setdefault(email, {})[path] = name
|
|
||||||
|
|
||||||
|
|
||||||
def open_cvs_log(info, paths=None):
|
|
||||||
cvsroot = info.get_cvsroot()
|
|
||||||
cmd = "cvs -q -d%s log " % cvsroot
|
|
||||||
if paths:
|
|
||||||
cmd += " ".join(paths)
|
|
||||||
return os.popen(cmd, "r")
|
|
||||||
|
|
||||||
|
|
||||||
email_rx = re.compile("<([a-z][-a-z0-9._]*@[-a-z0-9.]+)>", re.IGNORECASE)
|
|
||||||
|
|
||||||
def find_acks(f, acks):
|
|
||||||
prev = ''
|
|
||||||
filename = None
|
|
||||||
MAGIC_WORDS = ('van', 'von')
|
|
||||||
while 1:
|
|
||||||
line = f.readline()
|
|
||||||
if not line:
|
|
||||||
break
|
|
||||||
if line.startswith("Working file: "):
|
|
||||||
filename = line.split(None, 2)[2].strip()
|
|
||||||
prev = line
|
|
||||||
continue
|
|
||||||
m = email_rx.search(line)
|
|
||||||
if m:
|
|
||||||
words = prev.split() + line[:m.start()].split()
|
|
||||||
L = []
|
|
||||||
while words \
|
|
||||||
and (words[-1][0].isupper() or words[-1] in MAGIC_WORDS):
|
|
||||||
L.insert(0, words.pop())
|
|
||||||
name = " ".join(L)
|
|
||||||
email = m.group(1).lower()
|
|
||||||
acks.add(email, name, filename)
|
|
||||||
prev = line
|
|
||||||
|
|
||||||
|
|
||||||
def load_cvs_log_acks(acks, args):
|
|
||||||
repolist = cvsinfo.get_repository_list(args or [""])
|
|
||||||
for info, paths in repolist:
|
|
||||||
print >>sys.stderr, "Repository:", info.get_cvsroot()
|
|
||||||
f = open_cvs_log(info, paths)
|
|
||||||
find_acks(f, acks)
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
|
|
||||||
def load_tex_source_acks(acks, args):
|
|
||||||
for path in args:
|
|
||||||
path = path or os.curdir
|
|
||||||
if os.path.isfile(path):
|
|
||||||
read_acks_from_tex_file(acks, path)
|
|
||||||
else:
|
|
||||||
read_acks_from_tex_dir(acks, path)
|
|
||||||
|
|
||||||
|
|
||||||
def read_acks_from_tex_file(acks, path):
|
|
||||||
f = open(path)
|
|
||||||
while 1:
|
|
||||||
line = f.readline()
|
|
||||||
if not line:
|
|
||||||
break
|
|
||||||
if line.startswith(r"\sectionauthor{"):
|
|
||||||
line = line[len(r"\sectionauthor"):]
|
|
||||||
name, line = extract_tex_group(line)
|
|
||||||
email, line = extract_tex_group(line)
|
|
||||||
acks.add(email, name, path)
|
|
||||||
|
|
||||||
|
|
||||||
def read_acks_from_tex_dir(acks, path):
|
|
||||||
stack = [path]
|
|
||||||
while stack:
|
|
||||||
p = stack.pop()
|
|
||||||
for n in os.listdir(p):
|
|
||||||
n = os.path.join(p, n)
|
|
||||||
if os.path.isdir(n):
|
|
||||||
stack.insert(0, n)
|
|
||||||
elif os.path.normpath(n).endswith(".tex"):
|
|
||||||
read_acks_from_tex_file(acks, n)
|
|
||||||
|
|
||||||
|
|
||||||
def extract_tex_group(s):
|
|
||||||
c = 0
|
|
||||||
for i in range(len(s)):
|
|
||||||
if s[i] == '{':
|
|
||||||
c += 1
|
|
||||||
elif s[i] == '}':
|
|
||||||
c -= 1
|
|
||||||
if c == 0:
|
|
||||||
return s[1:i], s[i+1:]
|
|
||||||
|
|
||||||
|
|
||||||
def print_acks(acks):
|
|
||||||
first = 1
|
|
||||||
for email, D in acks.items():
|
|
||||||
if first:
|
|
||||||
first = 0
|
|
||||||
else:
|
|
||||||
print
|
|
||||||
L = D.items()
|
|
||||||
L.sort()
|
|
||||||
prefname = L[0][1]
|
|
||||||
for file, name in L[1:]:
|
|
||||||
if name != prefname:
|
|
||||||
prefname = ""
|
|
||||||
break
|
|
||||||
if prefname:
|
|
||||||
print prefname, "<%s>:" % email
|
|
||||||
else:
|
|
||||||
print email + ":"
|
|
||||||
for file, name in L:
|
|
||||||
if name == prefname:
|
|
||||||
print " " + file
|
|
||||||
else:
|
|
||||||
print " %s (as %s)" % (file, name)
|
|
||||||
|
|
||||||
|
|
||||||
def print_ack_names(acks):
|
|
||||||
names = []
|
|
||||||
for email, D in acks.items():
|
|
||||||
L = D.items()
|
|
||||||
L.sort()
|
|
||||||
prefname = L[0][1]
|
|
||||||
for file, name in L[1:]:
|
|
||||||
prefname = prefname or name
|
|
||||||
names.append(prefname or email)
|
|
||||||
def f(s1, s2):
|
|
||||||
s1 = s1.lower()
|
|
||||||
s2 = s2.lower()
|
|
||||||
return cmp((s1.split()[-1], s1),
|
|
||||||
(s2.split()[-1], s2))
|
|
||||||
names.sort(f)
|
|
||||||
for name in names:
|
|
||||||
print name
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
args = sys.argv[1:]
|
|
||||||
acks = Acknowledgements()
|
|
||||||
load_cvs_log_acks(acks, args)
|
|
||||||
load_tex_source_acks(acks, args)
|
|
||||||
print_ack_names(acks)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
|
@ -24,8 +24,6 @@ import shutil
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
import cvsinfo
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
__file__
|
__file__
|
||||||
except NameError:
|
except NameError:
|
||||||
|
@ -79,42 +77,22 @@ def main():
|
||||||
else:
|
else:
|
||||||
formats = ["gzip"]
|
formats = ["gzip"]
|
||||||
release = args[0]
|
release = args[0]
|
||||||
cvstag = None
|
svntag = None
|
||||||
if len(args) > 1:
|
if len(args) > 1:
|
||||||
cvstag = args[1]
|
svntag = args[1]
|
||||||
tempdir = tempfile.mktemp()
|
tempdir = tempfile.mktemp()
|
||||||
os.mkdir(tempdir)
|
os.mkdir(tempdir)
|
||||||
pkgdir = os.path.join(tempdir, "Python-Docs-" + release)
|
pkgdir = os.path.join(tempdir, "Python-Docs-" + release)
|
||||||
os.mkdir(pkgdir)
|
|
||||||
pwd = os.getcwd()
|
pwd = os.getcwd()
|
||||||
mydir = os.path.abspath(os.path.dirname(sys.argv[0]))
|
mydir = os.path.abspath(os.path.dirname(sys.argv[0]))
|
||||||
info = cvsinfo.RepositoryInfo(mydir)
|
|
||||||
cvsroot = info.get_cvsroot()
|
|
||||||
m = rx.match(cvsroot)
|
|
||||||
if m and anonymous:
|
|
||||||
# If this is an authenticated SourceForge repository, convert to
|
|
||||||
# anonymous usage for the export/checkout, since that avoids the
|
|
||||||
# SSH overhead.
|
|
||||||
group = m.group(1)
|
|
||||||
cvsroot = ":pserver:anonymous@cvs.%s.sourceforge.net:/cvsroot/%s" \
|
|
||||||
% (group, group)
|
|
||||||
# For some reason, SourceForge/CVS doesn't seem to care that we
|
|
||||||
# might not have done a "cvs login" to the anonymous server.
|
|
||||||
# That avoids a lot of painful gunk here.
|
|
||||||
os.chdir(tempdir)
|
os.chdir(tempdir)
|
||||||
if not quiet:
|
if not quiet:
|
||||||
print "--- current directory is:", pkgdir
|
print "--- current directory is:", tempdir
|
||||||
if cvstag:
|
if not svntag:
|
||||||
run("cvs -d%s export -r %s -d Python-Docs-%s python/dist/src/Doc"
|
svntag = "trunk"
|
||||||
% (cvsroot, cvstag, release))
|
svnbase = "http://svn.python.org/projects/python"
|
||||||
else:
|
run("svn export %s/%s/Doc Python-Docs-%s"
|
||||||
run("cvs -Q -d%s checkout -d Python-Docs-%s python/dist/src/Doc"
|
% (svnbase, svntag, release))
|
||||||
% (cvsroot, release))
|
|
||||||
# remove CVS directories
|
|
||||||
for p in ('*/CVS', '*/*/CVS', '*/*/*/CVS'):
|
|
||||||
map(shutil.rmtree, glob.glob(p))
|
|
||||||
for f in ('.cvsignore', '*/.cvsignore'):
|
|
||||||
map(os.unlink, glob.glob(f))
|
|
||||||
|
|
||||||
# Copy in the version informtation, if we're not just going to
|
# Copy in the version informtation, if we're not just going to
|
||||||
# rip it back out:
|
# rip it back out:
|
||||||
|
|
Loading…
Reference in New Issue