diff options
Diffstat (limited to 'RepSys/log.py')
-rw-r--r-- | RepSys/log.py | 129 |
1 files changed, 67 insertions, 62 deletions
diff --git a/RepSys/log.py b/RepSys/log.py index 2c69693..60cf0d5 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -13,25 +13,43 @@ import os import re import time import locale -import codecs import glob import tempfile import shutil + +locale.setlocale(locale.LC_ALL, "C") + default_template = """ +#if not $releases_by_author[-1].visible + ## Hide the first release that contains no changes. It must be a + ## reimported package and the log gathered from misc/ already should + ## contain a correct entry for the version-release: + #set $releases_by_author = $releases_by_author[:-1] +#end if #for $rel in $releases_by_author * $rel.date $rel.author_name <$rel.author_email> $rel.version-$rel.release - ## - #if not $rel.released - (not released yet) ++ Revision: $rel.revision +## #if not $rel.released +##+ Status: not released +## #end if + #if not $rel.visible ++ rebuild (emptylog) #end if #for $rev in $rel.release_revisions #for $line in $rev.lines - $line +$line #end for #end for #for $author in $rel.authors + #if $author.revisions and not $author.revisions[0].lines + #continue + #end if + ##alternatively, one could use: + ###if $author.email == "root" + ## #continue + ###end if + $author.name <$author.email> #for $rev in $author.revisions #for $line in $rev.lines @@ -50,14 +68,13 @@ def getrelease(pkgdirurl, rev=None, macros=[], exported=None): Is here where things should be changed if "automatic release increasing" will be used. """ - svn = SVN() from RepSys.rpmutil import rpm_macros_defs - tmpdir = tempfile.mktemp() + svn = SVN() pkgcurrenturl = os.path.join(pkgdirurl, "current") specurl = os.path.join(pkgcurrenturl, "SPECS") if exported is None: tmpdir = tempfile.mktemp() - svn.export(specurl, tmpdir, revision=SVN.makerev(rev)) + svn.export(specurl, tmpdir, rev=rev) else: tmpdir = os.path.join(exported, "SPECS") try: @@ -89,8 +106,7 @@ def getrelease(pkgdirurl, rev=None, macros=[], exported=None): if exported is None and os.path.isdir(tmpdir): shutil.rmtree(tmpdir) - -class ChangelogRevision: +class _Revision: lines = [] date = None raw_date = None @@ -103,11 +119,12 @@ class ChangelogRevision: def __repr__(self): lines = repr(self.lines)[:30] + "...]" - line = "<ChangelogRevision %d author=%r date=%r lines=%s>" % \ + line = "<_Revision %d author=%r date=%r lines=%s>" % \ (self.revision, self.author, self.date, lines) return line -class ChangelogRelease(ChangelogRevision): + +class _Release(_Revision): version = None release = None revisions = [] @@ -116,11 +133,11 @@ class ChangelogRelease(ChangelogRevision): visible = False def __init__(self, **kwargs): - ChangelogRevision.__init__(self, **kwargs) self.revisions = [] + _Revision.__init__(self, **kwargs) def __repr__(self): - line = "<ChangelogRelease v=%s r=%s revs=%r>" % \ + line = "<_Release v=%s r=%s revs=%r>" % \ (self.version, self.release, self.revisions) return line @@ -153,7 +170,7 @@ def format_lines(lines): return entrylines -class ChangelogByAuthor: +class _Author: name = None email = None revisions = None @@ -163,49 +180,50 @@ def group_releases_by_author(releases): allauthors = [] grouped = [] for release in releases: + + # group revisions of the release by author authors = {} latest = None for revision in release.revisions: authors.setdefault(revision.author, []).append(revision) - # all the mess below is to sort by author and by revision number + # create _Authors and sort them by their latest revisions decorated = [] for authorname, revs in authors.iteritems(): - author = ChangelogByAuthor() + author = _Author() author.name = revs[0].author_name author.email = revs[0].author_email - revdeco = [(r.revision, r) for r in revs] - revdeco.sort(reverse=1) - author.revisions = [t[1] for t in revdeco] + author.revisions = revs revlatest = author.revisions[0] - # keep the latest revision even for silented authors (below) + # keep the latest revision even for completely invisible + # authors (below) if latest is None or revlatest.revision > latest.revision: latest = revlatest count = sum(len(rev.lines) for rev in author.revisions) if count == 0: - # skipping author with only silented lines + # only sort those visible authors, invisible ones are used + # only in "latest" continue - decorated.append((revdeco[0][0], author)) + decorated.append((revlatest.revision, author)) + decorated.sort(reverse=1) - if not decorated: - # skipping release with only authors with silented lines - continue + if release.visible: + release.authors = [t[1] for t in decorated] + firstrel, release.authors = release.authors[0], release.authors[1:] + release.author_name = firstrel.name + release.author_email = firstrel.email + release.release_revisions = firstrel.revisions + else: + # we don't care about other possible authors in completely + # invisible releases + firstrev = release.revisions[0] + release.author_name = firstrev.author_name + release.author_email = firstrev.author_email + release.raw_date = firstrev.raw_date + release.date = firstrev.date - decorated.sort(reverse=1) - release.authors = [t[1] for t in decorated] - # the difference between a released and a not released _Release is - # the way the release numbers is obtained. So, when this is a - # released, we already have it, but if we don't, we should get de - # version/release string using getrelease and then get the first - first, release.authors = release.authors[0], release.authors[1:] - release.author_name = first.name - release.author_email = first.email - release.release_revisions = first.revisions - - #release.date = first.revisions[0].date release.date = latest.date release.raw_date = latest.raw_date - #release.revision = first.revisions[0].revision release.revision = latest.revision grouped.append(release) @@ -217,7 +235,7 @@ def group_revisions_by_author(currentlog): revisions = [] last_author = None for entry in currentlog: - revision = ChangelogRevision() + revision = _Revision() revision.lines = format_lines(entry.lines) revision.raw_date = entry.date revision.date = parse_raw_date(entry.date) @@ -225,7 +243,7 @@ def group_revisions_by_author(currentlog): if entry.author == last_author: revisions[-1].revisions.append(revision) else: - author = ChangelogByAuthor() + author = _Author() author.name, author.email = get_author_name(entry.author) author.revisions = [revision] revisions.append(author) @@ -269,7 +287,7 @@ def filter_log_lines(lines): def make_release(author=None, revision=None, date=None, lines=None, entries=[], released=True, version=None, release=None): - rel = ChangelogRelease() + rel = _Release() rel.author = author if author: rel.author_name, rel.author_email = get_author_name(author) @@ -284,7 +302,7 @@ def make_release(author=None, revision=None, date=None, lines=None, lines = filter_log_lines(entry.lines) if lines: rel.visible = True - revision = ChangelogRevision() + revision = _Revision() revision.revision = entry.revision revision.lines = format_lines(lines) revision.date = parse_raw_date(entry.date) @@ -297,7 +315,8 @@ def make_release(author=None, revision=None, date=None, lines=None, def dump_file(releases, currentlog=None, template=None): - templpath = template or config.get("template", "path", None) + templpath = template or config.get("template", "path", + "/usr/share/repsys/default.chlog") params = {} if templpath is None or not os.path.exists(templpath): params["source"] = default_template @@ -311,12 +330,7 @@ def dump_file(releases, currentlog=None, template=None): "releases" : releases, "revisions_by_author": revisions_author}] t = Template(**params) - chlog = t.respond() - try: - chlog = chlog.decode("utf8") - except UnicodeError: - pass - return chlog + return t.respond() class InvalidEntryError(Exception): @@ -379,18 +393,14 @@ def parse_markrelease_log(relentry): def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None, macros=[], exported=None): - size = size or 0 concat = config.get("log", "concat", "").split() revoffset = get_revision_offset() svn = SVN() pkgreleasesurl = os.path.join(pkgdirurl, "releases") pkgcurrenturl = os.path.join(pkgdirurl, "current") - releaseslog = list(svn.log(pkgreleasesurl, - strict_node_history=False, noerror=1)) or [] - currentlog = list(svn.log(pkgcurrenturl, - strict_node_history=False, - revision_start=SVN.makerev(rev), - revision_end=SVN.makerev(revoffset), limit=size)) + releaseslog = svn.log(pkgreleasesurl, noerror=1) + currentlog = svn.log(pkgcurrenturl, limit=size, start=rev, + end=revoffset) # sort releases by copyfrom-revision, so that markreleases for same # revisions won't look empty @@ -460,11 +470,6 @@ def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, submit=False, template=None, macros=[], exported=None): newlines = [] found = 0 - - encoding = locale.getpreferredencoding() - - def open(name, mode="r"): - return codecs.open(name, mode, encoding, errors="replace") # Strip old changelogs for line in open(specfile): |