diff options
author | Bogdano Arendartchuk <bogdano@mandriva.org> | 2008-06-23 15:56:37 +0000 |
---|---|---|
committer | Bogdano Arendartchuk <bogdano@mandriva.org> | 2008-06-23 15:56:37 +0000 |
commit | 4c556ed6d07fbebf175f8e009c4ceb166f42fb6d (patch) | |
tree | e95dee4806d15eb555549e487e8dbb75ff1e4859 /RepSys/log.py | |
parent | a068fe76ec7ad2fe3fdd1957d55f587bb7eb6f86 (diff) | |
download | mgarepo-4c556ed6d07fbebf175f8e009c4ceb166f42fb6d.tar mgarepo-4c556ed6d07fbebf175f8e009c4ceb166f42fb6d.tar.gz mgarepo-4c556ed6d07fbebf175f8e009c4ceb166f42fb6d.tar.bz2 mgarepo-4c556ed6d07fbebf175f8e009c4ceb166f42fb6d.tar.xz mgarepo-4c556ed6d07fbebf175f8e009c4ceb166f42fb6d.zip |
Merged latest V1_6_X branch
Diffstat (limited to 'RepSys/log.py')
-rw-r--r-- | RepSys/log.py | 141 |
1 files changed, 118 insertions, 23 deletions
diff --git a/RepSys/log.py b/RepSys/log.py index 60cf0d5..2eadbe2 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -8,6 +8,8 @@ try: except ImportError: raise Error, "repsys requires the package python-cheetah" +from cStringIO import StringIO + import sys import os import re @@ -464,29 +466,68 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, data = dump_file(releases[::-1], currentlog=currentlog, template=template) return data - - -def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, - submit=False, template=None, macros=[], exported=None): - newlines = [] +def _split_changelog(stream): + current = None + count = 0 + def finish(entry): + lines = entry[2] + # strip newlines at the end + for i in xrange(len(lines)-1, -1, -1): + if lines[i] != "\n": + break + del lines[i] + return entry + for line in stream: + if line.startswith("*"): + if current: + yield finish(current) + fields = line.split() + rawdate = " ".join(fields[:5]) + try: + date = time.strptime(rawdate, "* %a %b %d %Y") + except ValueError, e: + raise Error, "failed to parse spec changelog: %s" % e + curlines = [line] + current = (date, count, curlines) + # count used to ensure stable sorting when changelog entries + # have the same date, otherwise it would also compare the + # changelog lines + count -= 1 + elif current: + curlines.append(line) + else: + pass # not good, but ignore + if current: + yield finish(current) + +def sort_changelog(stream): + entries = _split_changelog(stream) + log = StringIO() + for time, count, elines in sorted(entries, reverse=True): + log.writelines(elines) + log.write("\n") + return log + +def split_spec_changelog(stream): + chlog = StringIO() + spec = StringIO() found = 0 - - # Strip old changelogs - for line in open(specfile): + for line in stream: if line.startswith("%changelog"): found = 1 elif not found: - newlines.append(line) + spec.write(line) + elif found: + chlog.write(line) elif line.startswith("%"): found = 0 - newlines.append(line) - - # Create new changelog - newlines.append("\n\n%changelog\n") - newlines.append(svn2rpm(pkgdirurl, rev=rev, size=size, submit=submit, - template=template, macros=macros, exported=exported)) + spec.write(line) + spec.seek(0) + chlog.seek(0) + return spec, chlog - # Merge old changelog, if available +def get_old_log(pkgdirurl): + chlog = StringIO() oldurl = config.get("log", "oldurl") if oldurl: svn = SVN() @@ -504,20 +545,74 @@ def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, logfile = os.path.join(tmpdir, "log") if os.path.isfile(logfile): file = open(logfile) - newlines.append("\n") + chlog.write("\n") # TODO needed? log = file.read() log = escape_macros(log) - newlines.append(log) + chlog.write(log) file.close() finally: if os.path.isdir(tmpdir): shutil.rmtree(tmpdir) + chlog.seek(0) + return chlog + +def get_changelog(pkgdirurl, another=None, svn=True, rev=None, size=None, + submit=False, sort=False, template=None, macros=[], exported=None, + oldlog=False): + """Generates the changelog for a given package URL + + @another: a stream with the contents of a changelog to be merged with + the one generated + @svn: enable changelog from svn + @rev: generate the changelog with the changes up to the given + revision + @size: the number of revisions to be used (as in svn log --limit) + @submit: defines whether the latest unreleased log entries should have + the version parsed from the spec file + @sort: should changelog entries be reparsed and sorted after appending + the oldlog? + @template: the path to the cheetah template used to generate the + changelog from svn + @macros: a list of tuples containing macros to be defined when + parsing the version in the changelog + @exported: the path of a directory containing an already existing + checkout of the package, so that the spec file can be + parsed from there + @oldlog: if set it will try to append the old changelog file defined + in oldurl in repsys.conf + """ + newlog = StringIO() + if svn: + rawsvnlog = svn2rpm(pkgdirurl, rev=rev, size=size, submit=submit, + template=template, macros=macros, exported=exported) + newlog.write(rawsvnlog) + if another: + newlog.writelines(another) + if oldlog: + newlog.writelines(get_old_log(pkgdirurl)) + if sort: + newlog.seek(0) + newlog = sort_changelog(newlog) + newlog.seek(0) + return newlog - # Write new specfile - file = open(specfile, "w") - file.write("".join(newlines)) - file.close() - +def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, + submit=False, sort=False, template=None, macros=[], exported=None): + fi = open(specfile) + spec, oldchlog = split_spec_changelog(fi) + fi.close() + another = None + if config.getbool("log", "merge-spec", False): + another = oldchlog + sort = sort or config.getbool("log", "sort", False) + chlog = get_changelog(pkgdirurl, another=another, rev=rev, size=size, + submit=submit, sort=sort, template=template, macros=macros, + exported=exported, oldlog=True) + fo = open(specfile, "w") + fo.writelines(spec) + fo.write("\n\n%changelog\n") + fo.writelines(chlog) + fo.close() if __name__ == "__main__": l = svn2rpm(sys.argv[1]) |