From 9581f2057ad7f6fb6fbb2f372b28a088a258d60a Mon Sep 17 00:00:00 2001 From: Andreas Hasenack Date: Tue, 17 Oct 2006 13:27:25 +0000 Subject: - added Warly's patch to make log.py cope with packages which have no markrelease --- RepSys/log.py | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 0c49d12..feca06a 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -266,17 +266,18 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): # for the emergency bug fixer: the [].sort() is done using the # decorate-sort-undecorate pattern releases_data = [] - for relentry in releaseslog[::-1]: - try: - revinfo = parse_repsys_entry(relentry) - except InvalidEntryError: - continue - try: - release_number = int(revinfo["revision"]) - except (KeyError, ValueError): - raise Error, "Error parsing data from log entry from r%s" % \ - relentry.revision - releases_data.append((release_number, relentry, revinfo)) + if releaseslog: + for relentry in releaseslog[::-1]: + try: + revinfo = parse_repsys_entry(relentry) + except InvalidEntryError: + continue + try: + release_number = int(revinfo["revision"]) + except (KeyError, ValueError): + raise Error, "Error parsing data from log entry from r%s" % \ + relentry.revision + releases_data.append((release_number, relentry, revinfo)) releases_data.sort() for release_number, relentry, revinfo in releases_data: @@ -311,16 +312,17 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): # look for commits that have been not submited (released) yet # this is done by getting all log entries newer (revision larger) # than releaseslog[0] - latest_revision = releaseslog[0].revision - notsubmitted = [entry for entry in currentlog - if entry.revision > latest_revision] - if notsubmitted: - # if they are not submitted yet, what we have to do is to add - # a release/version number from getrelease() - version, release = getrelease(pkgdirurl) - toprelease = make_release(entries=notsubmitted, released=False, - version=version, release=release) - releases.append(toprelease) + if releaseslog: + latest_revision = releaseslog[0].revision + notsubmitted = [entry for entry in currentlog + if entry.revision > latest_revision] + if notsubmitted: + # if they are not submitted yet, what we have to do is to add + # a release/version number from getrelease() + version, release = getrelease(pkgdirurl) + toprelease = make_release(entries=notsubmitted, released=False, + version=version, release=release) + releases.append(toprelease) data = dump_file(releases[::-1], template=template) return data -- cgit v1.2.1 From f4e84db35fec26c19b15bc163c139d183e7151a6 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Wed, 18 Oct 2006 17:32:37 +0000 Subject: - removed unnecessary parsing of the log entries --- RepSys/log.py | 5 ----- 1 file changed, 5 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index feca06a..ea5c798 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -281,11 +281,6 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): releases_data.sort() for release_number, relentry, revinfo in releases_data: - try: - revinfo = parse_repsys_entry(relentry) - except InvalidEntryError: - continue - try: release_revision = int(revinfo["revision"]) except (ValueError, KeyError): -- cgit v1.2.1 From 0b137c7f5d5141717297e8e063b820f35de64eca Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Thu, 19 Oct 2006 16:42:41 +0000 Subject: - fixed bug introducted in r65890, in which it was ignoring unreleased revisions when the package had no releases. --- RepSys/log.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index ea5c798..931ba5d 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -306,18 +306,20 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): # look for commits that have been not submited (released) yet # this is done by getting all log entries newer (revision larger) - # than releaseslog[0] + # than releaseslog[0] (in the case it exists) if releaseslog: latest_revision = releaseslog[0].revision - notsubmitted = [entry for entry in currentlog - if entry.revision > latest_revision] - if notsubmitted: - # if they are not submitted yet, what we have to do is to add - # a release/version number from getrelease() - version, release = getrelease(pkgdirurl) - toprelease = make_release(entries=notsubmitted, released=False, - version=version, release=release) - releases.append(toprelease) + else: + latest_revision = 0 + notsubmitted = [entry for entry in currentlog + if entry.revision > latest_revision] + if notsubmitted: + # if they are not submitted yet, what we have to do is to add + # a release/version number from getrelease() + version, release = getrelease(pkgdirurl) + toprelease = make_release(entries=notsubmitted, released=False, + version=version, release=release) + releases.append(toprelease) data = dump_file(releases[::-1], template=template) return data -- cgit v1.2.1 From f1059f752f5dc34bc08a1bbd7a2731105a02cc8d Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Thu, 19 Oct 2006 21:32:34 +0000 Subject: - added another format for the changelog data, so that it can be used by templates for changelogs compatible with repsys 1.5 --- RepSys/log.py | 50 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 931ba5d..dde2ad0 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -161,10 +161,38 @@ def group_releases_by_author(releases): release.revision = first.revisions[0].revision return releases - + + +def group_revisions_by_author(currentlog): + revisions = [] + last_author = None + for entry in currentlog: + revision = _Revision() + revision.lines = format_lines(entry.lines) + revision.raw_date = entry.date + revision.date = parse_raw_date(entry.date) + revision.revision = entry.revision + if entry.author == last_author: + revisions[-1].revisions.append(revision) + else: + author = _Author() + author.name, author.email = get_author_name(entry.author) + author.revisions = [revision] + revisions.append(author) + last_author = entry.author + return revisions + emailpat = re.compile("(?P.*?)\s*<(?P.*?)>") +def get_author_name(author): + found = emailpat.match(config.get("users", author, author)) + name = ((found and found.group("name")) or author) + email = ((found and found.group("email")) or author) + return name, email + +def parse_raw_date(rawdate): + return time.strftime("%a %b %d %Y", rawdate) def make_release(author=None, revision=None, date=None, lines=None, entries=[], released=True, version=None, release=None): @@ -176,27 +204,23 @@ def make_release(author=None, revision=None, date=None, lines=None, rel.revision = revision rel.version = version rel.release = release - rel.date = (date and time.strftime("%a %b %d %Y", date)) or None + rel.date = (date and parse_raw_date(date)) or None rel.lines = lines rel.released = released for entry in entries: revision = _Revision() revision.revision = entry.revision revision.lines = format_lines(entry.lines) - revision.date = time.strftime("%a %b %d %Y", entry.date) + revision.date = parse_raw_date(entry.date) revision.raw_date = entry.date revision.author = entry.author - found = emailpat.match(config.get("users", entry.author, entry.author)) - revision.author_name = ((found and found.group("name")) or - entry.author) - revision.author_email = ((found and found.group("email")) or - entry.author) + (revision.author_name, revision.author_email) = \ + get_author_name(entry.author) rel.revisions.append(revision) return rel -def dump_file(releases, template=None): - +def dump_file(releases, currentlog=None, template=None): templpath = template or config.get("template", "path", None) params = {} if templpath is None or not os.path.exists(templpath): @@ -206,8 +230,10 @@ def dump_file(releases, template=None): else: params["file"] = templpath releases_author = group_releases_by_author(releases) + revisions_author = group_revisions_by_author(currentlog) params["searchList"] = [{"releases_by_author" : releases_author, - "releases" : releases}] + "releases" : releases, + "revisions_by_author": revisions_author}] t = Template(**params) return repr(t) @@ -321,7 +347,7 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): version=version, release=release) releases.append(toprelease) - data = dump_file(releases[::-1], template=template) + data = dump_file(releases[::-1], currentlog=currentlog, template=template) return data -- cgit v1.2.1 From f36eb3974bb8b0eafe71aee733a27d5c5836e457 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Fri, 20 Oct 2006 21:55:31 +0000 Subject: - changed repsys to use copy-from svn metadata to generate log messages --- RepSys/log.py | 85 +++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 35 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index dde2ad0..2f058fc 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -274,6 +274,27 @@ def get_revision_offset(): "file(s).") return revoffset or 0 +oldmsgpat = re.compile( + r"Copying release (?P[^\s]+) to (?P[^\s]+) directory\.") + +def parse_markrelease_log(relentry): + if not ((relentry.lines and oldmsgpat.match(relentry.lines[0]) \ + or parse_repsys_entry(relentry))): + raise InvalidEntryError + from_rev = None + path = None + for changed in relentry.changed: + if changed["action"] == "A" and changed["from_rev"]: + from_rev = changed["from_rev"] + path = changed["path"] + break + else: + raise InvalidEntryError + # get the version and release from the names in the path, do not relay + # on log messages + version, release = path.rsplit(os.path.sep, 3)[-2:] + return version, release, from_rev + def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): concat = config.get("log", "concat", "").split() @@ -284,52 +305,46 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): releaseslog = svn.log(pkgreleasesurl, noerror=1) currentlog = svn.log(pkgcurrenturl, limit=size, start=rev, end=revoffset) - lastauthor = None - previous_revision = 0 - currelease = None - releases = [] - # for the emergency bug fixer: the [].sort() is done using the - # decorate-sort-undecorate pattern - releases_data = [] - if releaseslog: - for relentry in releaseslog[::-1]: - try: - revinfo = parse_repsys_entry(relentry) - except InvalidEntryError: - continue - try: - release_number = int(revinfo["revision"]) - except (KeyError, ValueError): - raise Error, "Error parsing data from log entry from r%s" % \ - relentry.revision - releases_data.append((release_number, relentry, revinfo)) - releases_data.sort() - - for release_number, relentry, revinfo in releases_data: + # sort releases by copyfrom-revision, so that markreleases for same + # revisions won't be look empty + releasesdata = [] + for relentry in releaseslog[::-1]: try: - release_revision = int(revinfo["revision"]) - except (ValueError, KeyError): - raise Error, "Error parsing data from log entry from r%s" % \ - relentry.revision - - # get entries newer than 'previous' and older than 'relentry' + (version, release, relrevision) = \ + parse_markrelease_log(relentry) + except InvalidEntryError: + continue + releasesdata.append((relrevision, -relentry.revision, relentry, version, release)) + releasesdata.sort() + + # collect valid releases using the versions provided by the changes and + # the packages + prevrevision = 0 + releases = [] + for (relrevision, dummy, relentry, version, release) in releasesdata: + if prevrevision == relrevision: + # ignore older markrelease of the same revision, since they + # will have history + continue entries = [entry for entry in currentlog - if release_revision >= entry.revision and - (previous_revision < entry.revision)] + if relrevision >= entry.revision and + (prevrevision < entry.revision)] if not entries: #XXX probably a forced release, without commits in current/, - # check if this is the right behavior and if some release is - # not being lost. + # check if this is the right behavior + sys.stderr.write("warning: skipping (possible) release " + "%s-%s@%s, no commits since previous markrelease (r%r)\n" % + (version, release, relrevision, prevrevision)) continue release = make_release(author=relentry.author, revision=relentry.revision, date=relentry.date, lines=relentry.lines, entries=entries, - version=revinfo["version"], release=revinfo["release"]) + version=version, release=release) releases.append(release) - previous_revision = release_revision - + prevrevision = relrevision + # look for commits that have been not submited (released) yet # this is done by getting all log entries newer (revision larger) # than releaseslog[0] (in the case it exists) -- cgit v1.2.1 From 19b75603da4fb275fee76ae9eb765ab6ba16f463 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Fri, 20 Oct 2006 22:04:08 +0000 Subject: - fixed regression from the bug of package without releases/ --- RepSys/log.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 2f058fc..62a290d 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -309,14 +309,15 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): # sort releases by copyfrom-revision, so that markreleases for same # revisions won't be look empty releasesdata = [] - for relentry in releaseslog[::-1]: - try: - (version, release, relrevision) = \ - parse_markrelease_log(relentry) - except InvalidEntryError: - continue - releasesdata.append((relrevision, -relentry.revision, relentry, version, release)) - releasesdata.sort() + if releaseslog: + for relentry in releaseslog[::-1]: + try: + (version, release, relrevision) = \ + parse_markrelease_log(relentry) + except InvalidEntryError: + continue + releasesdata.append((relrevision, -relentry.revision, relentry, version, release)) + releasesdata.sort() # collect valid releases using the versions provided by the changes and # the packages -- cgit v1.2.1 From 29fb68e4a59dd18bb84e2bed46949f245f9b0327 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Mon, 23 Oct 2006 13:32:21 +0000 Subject: - fixed the problem of trailling slashes in package urls --- RepSys/log.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 62a290d..cf913f8 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -1,5 +1,5 @@ #!/usr/bin/python -from RepSys import Error, config +from RepSys import Error, config, RepSysTree from RepSys.svn import SVN from RepSys.util import execcmd @@ -52,7 +52,7 @@ def getrelease(pkgdirurl, rev=None): svn = SVN(baseurl=pkgdirurl) tmpdir = tempfile.mktemp() try: - pkgname = os.path.basename(pkgdirurl) + pkgname = RepSysTree.pkgname(pkgdirurl) pkgcurrenturl = os.path.join(pkgdirurl, "current") specurl = os.path.join(pkgcurrenturl, "SPECS") if svn.ls(specurl, noerror=1): @@ -394,7 +394,7 @@ def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, svn = SVN(baseurl=pkgdirurl) tmpdir = tempfile.mktemp() try: - pkgname = os.path.basename(pkgdirurl) + pkgname = RepSysTree.pkgname(pkgdirurl) pkgoldurl = os.path.join(oldurl, pkgname) if svn.ls(pkgoldurl, noerror=1): svn.export(pkgoldurl, tmpdir, rev=rev) -- cgit v1.2.1 From 18fbc3bebe823b3d1b79e042dda4521782dec44d Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Tue, 31 Oct 2006 13:52:10 +0000 Subject: - added small lstrip to handle log messages beginning with spaces --- RepSys/log.py | 1 + 1 file changed, 1 insertion(+) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index cf913f8..5c29876 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -104,6 +104,7 @@ def format_lines(lines): entrylines = [] perexpr = re.compile(r"([^%])%([^%])") for line in lines: + line = line.lstrip() if line: line = perexpr.sub("\\1%%\\2", line) if first: -- cgit v1.2.1 From 7405ba4000a438fd49873100dfefaef53d0ea68e Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Mon, 13 Nov 2006 03:10:46 +0000 Subject: Removed duplicated code to find the author name in make_releases. --- RepSys/log.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 5c29876..25c54de 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -199,9 +199,7 @@ def make_release(author=None, revision=None, date=None, lines=None, entries=[], released=True, version=None, release=None): rel = _Release() rel.author = author - found = emailpat.match(config.get("users", author, author or "")) - rel.author_name = (found and found.group("name")) or author - rel.author_email = (found and found.group("email")) or author + rel.author_name, rel.author_email = get_author_name(author) rel.revision = revision rel.version = version rel.release = release -- cgit v1.2.1 From 0c62e6d9a17ca45c1709ca17d0005ecfb640fe99 Mon Sep 17 00:00:00 2001 From: Andreas Hasenack Date: Tue, 14 Nov 2006 20:58:00 +0000 Subject: - silence stderr when querying for version-release of a .src.rpm package --- RepSys/log.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 25c54de..d1e2a59 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -61,7 +61,7 @@ def getrelease(pkgdirurl, rev=None): if found: specpath = found[0] command = (("rpm -q --qf '%%{VERSION}-%%{RELEASE}\n' " - "--specfile %s") % specpath) + "--specfile %s 2>/dev/null") % specpath) status, output = execcmd(command) if status != 0: raise Error, "Error in command %s: %s" % (command, output) -- cgit v1.2.1 From d376426856a092a44635c6616ba72c8d1a2e3444 Mon Sep 17 00:00:00 2001 From: Andreas Hasenack Date: Thu, 30 Nov 2006 21:53:14 +0000 Subject: - use svn export instead of checkout, saves 50% disk space --- RepSys/log.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index d1e2a59..152abb0 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -199,7 +199,8 @@ def make_release(author=None, revision=None, date=None, lines=None, entries=[], released=True, version=None, release=None): rel = _Release() rel.author = author - rel.author_name, rel.author_email = get_author_name(author) + if author: + rel.author_name, rel.author_email = get_author_name(author) rel.revision = revision rel.version = version rel.release = release -- cgit v1.2.1 From 275cab2de13197085229b0478ecebb1859036092 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Tue, 2 Jan 2007 15:23:10 +0000 Subject: Make source lines fit in 80 columns --- RepSys/log.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 152abb0..b2e9321 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -316,7 +316,8 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): parse_markrelease_log(relentry) except InvalidEntryError: continue - releasesdata.append((relrevision, -relentry.revision, relentry, version, release)) + releasesdata.append((relrevision, -relentry.revision, relentry, + version, release)) releasesdata.sort() # collect valid releases using the versions provided by the changes and -- cgit v1.2.1 From 9a98086f0224ea644e0dc2d8e2a42bcf40c2d6df Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Tue, 2 Jan 2007 15:24:55 +0000 Subject: Really minor comment fixes --- RepSys/log.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index b2e9321..2934907 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -307,7 +307,7 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): end=revoffset) # sort releases by copyfrom-revision, so that markreleases for same - # revisions won't be look empty + # revisions won't look empty releasesdata = [] if releaseslog: for relentry in releaseslog[::-1]: @@ -327,7 +327,7 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): for (relrevision, dummy, relentry, version, release) in releasesdata: if prevrevision == relrevision: # ignore older markrelease of the same revision, since they - # will have history + # will have no history continue entries = [entry for entry in currentlog if relrevision >= entry.revision and -- cgit v1.2.1 From c2361c74e06a0fe7e84b534a74f868cf19f90f5a Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Tue, 2 Jan 2007 16:30:45 +0000 Subject: Commit messages containing SILENT (or whatever is in repsys.conf) won't appear in the changelog. --- RepSys/log.py | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 2934907..064b585 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -195,6 +195,13 @@ def get_author_name(author): def parse_raw_date(rawdate): return time.strftime("%a %b %d %Y", rawdate) +def ignore_log_entry(entry): + ignstr = config.get("log", "ignore-string", "SILENT") + for line in entry.lines: + if ignstr in line: + return True + return False + def make_release(author=None, revision=None, date=None, lines=None, entries=[], released=True, version=None, release=None): rel = _Release() @@ -208,6 +215,8 @@ def make_release(author=None, revision=None, date=None, lines=None, rel.lines = lines rel.released = released for entry in entries: + if ignore_log_entry(entry): + continue revision = _Revision() revision.revision = entry.revision revision.lines = format_lines(entry.lines) -- cgit v1.2.1 From ae858677cdae9a7fa093fda779661d3d26b6b4c6 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Tue, 2 Jan 2007 19:30:29 +0000 Subject: Changed the behavior of the SILENT option to be line-oriented. Lines in the commit messages containing SILENT at any place will be ignored. Commit messages containing SILENT at the beginning of the first line will make all lines to be ignored. --- RepSys/log.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 064b585..f3f2bab 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -195,12 +195,16 @@ def get_author_name(author): def parse_raw_date(rawdate): return time.strftime("%a %b %d %Y", rawdate) -def ignore_log_entry(entry): +def filter_log_lines(lines): + # lines in commit messages containing SILENT at any position will be + # skipped; commits with their log messages beggining with SILENT in the + # first positionj of the first line will be completely ignored. ignstr = config.get("log", "ignore-string", "SILENT") - for line in entry.lines: - if ignstr in line: - return True - return False + if len(lines) and lines[0].startswith(ignstr): + return None + filtered = [line for line in lines if ignstr not in line] + return filtered + def make_release(author=None, revision=None, date=None, lines=None, entries=[], released=True, version=None, release=None): @@ -215,11 +219,12 @@ def make_release(author=None, revision=None, date=None, lines=None, rel.lines = lines rel.released = released for entry in entries: - if ignore_log_entry(entry): + lines = filter_log_lines(entry.lines) + if lines is None: continue revision = _Revision() revision.revision = entry.revision - revision.lines = format_lines(entry.lines) + revision.lines = format_lines(lines) revision.date = parse_raw_date(entry.date) revision.raw_date = entry.date revision.author = entry.author -- cgit v1.2.1 From e95b85e5666db657c4e7d1b252dca0a0ffe6090a Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Wed, 3 Jan 2007 13:49:45 +0000 Subject: Make the changelog show the revision number from ignored commits that are newer than the not ignored ones. Releases containing only SILENT commit messages will be shown, but without log lines (probably the changelog template should handle this case). --- RepSys/log.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index f3f2bab..2651d19 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -198,10 +198,10 @@ def parse_raw_date(rawdate): def filter_log_lines(lines): # lines in commit messages containing SILENT at any position will be # skipped; commits with their log messages beggining with SILENT in the - # first positionj of the first line will be completely ignored. + # first positionj of the first line will have all lines ignored. ignstr = config.get("log", "ignore-string", "SILENT") if len(lines) and lines[0].startswith(ignstr): - return None + return [] filtered = [line for line in lines if ignstr not in line] return filtered @@ -220,8 +220,6 @@ def make_release(author=None, revision=None, date=None, lines=None, rel.released = released for entry in entries: lines = filter_log_lines(entry.lines) - if lines is None: - continue revision = _Revision() revision.revision = entry.revision revision.lines = format_lines(lines) -- cgit v1.2.1 From 25545a7a3702c0b624b802b795d631534977979b Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Wed, 24 Jan 2007 15:26:48 +0000 Subject: Added "repsys.macros" configuration file. It will contain macros overriding the local system ones. The reason for it is to make changelogs generated in kenobi (2007.0) having the cooker release number (in the case 2007.1). --- RepSys/log.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 2651d19..6d7bde0 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -60,8 +60,12 @@ def getrelease(pkgdirurl, rev=None): found = glob.glob(os.path.join(tmpdir, "*.spec")) if found: specpath = found[0] + fmt = "--define \"%s %s\"" + macros = (fmt % macro for macro in parse_macros()) + options = " ".join(macros) command = (("rpm -q --qf '%%{VERSION}-%%{RELEASE}\n' " - "--specfile %s 2>/dev/null") % specpath) + "--specfile %s %s 2>/dev/null") % + (specpath, options)) status, output = execcmd(command) if status != 0: raise Error, "Error in command %s: %s" % (command, output) @@ -77,6 +81,25 @@ def getrelease(pkgdirurl, rev=None): shutil.rmtree(tmpdir) +def parse_macros(): + path = config.get("log", "macros-file", None) + if not path: + # if the user did not declated where is the file, ignore it + return + if not os.path.isfile(path): + # complain when declared and not found + sys.stderr.write("warning: could not open macros file: %s\n" % + path) + return + for line in open(path): + line = line.strip() + if line.startswith("#") or not line: + continue + name, value = line.split(None, 1) + # trying to have the same format from rpm macros files + name = name[1:] + yield (name, value) + class _Revision: lines = [] date = None -- cgit v1.2.1 From a493be252f25b57767023930d4ed927b37816e71 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Mon, 29 Jan 2007 18:14:56 +0000 Subject: Removed bogus macros files and added [macros ..] sections to repsys.conf. These sections are referenced by the "rpm-macros" option in [submit ..] sections and contain the RPM macros to be used with the target of the package being generated. These macros are defined using --define option of rpm. --- RepSys/log.py | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 6d7bde0..3645fdd 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -42,13 +42,14 @@ default_template = """ #end for """ -def getrelease(pkgdirurl, rev=None): +def getrelease(pkgdirurl, rev=None, macros=[]): """Tries to obtain the version-release of the package for a yet-not-markrelease revision of the package. Is here where things should be changed if "automatic release increasing" will be used. """ + from RepSys.rpmutil import rpm_macros_defs svn = SVN(baseurl=pkgdirurl) tmpdir = tempfile.mktemp() try: @@ -60,9 +61,7 @@ def getrelease(pkgdirurl, rev=None): found = glob.glob(os.path.join(tmpdir, "*.spec")) if found: specpath = found[0] - fmt = "--define \"%s %s\"" - macros = (fmt % macro for macro in parse_macros()) - options = " ".join(macros) + options = rpm_macros_defs(macros) command = (("rpm -q --qf '%%{VERSION}-%%{RELEASE}\n' " "--specfile %s %s 2>/dev/null") % (specpath, options)) @@ -80,26 +79,6 @@ def getrelease(pkgdirurl, rev=None): if os.path.isdir(tmpdir): shutil.rmtree(tmpdir) - -def parse_macros(): - path = config.get("log", "macros-file", None) - if not path: - # if the user did not declated where is the file, ignore it - return - if not os.path.isfile(path): - # complain when declared and not found - sys.stderr.write("warning: could not open macros file: %s\n" % - path) - return - for line in open(path): - line = line.strip() - if line.startswith("#") or not line: - continue - name, value = line.split(None, 1) - # trying to have the same format from rpm macros files - name = name[1:] - yield (name, value) - class _Revision: lines = [] date = None @@ -331,7 +310,8 @@ def parse_markrelease_log(relentry): return version, release, from_rev -def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): +def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, + template=None, macros=[]): concat = config.get("log", "concat", "").split() revoffset = get_revision_offset() svn = SVN(baseurl=pkgdirurl) @@ -394,7 +374,7 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): if notsubmitted: # if they are not submitted yet, what we have to do is to add # a release/version number from getrelease() - version, release = getrelease(pkgdirurl) + version, release = getrelease(pkgdirurl, macros=macros) toprelease = make_release(entries=notsubmitted, released=False, version=version, release=release) releases.append(toprelease) @@ -405,7 +385,7 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None): def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, - submit=False, template=None): + submit=False, template=None, macros=[]): newlines = [] found = 0 @@ -422,7 +402,7 @@ def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, # Create new changelog newlines.append("\n\n%changelog\n") newlines.append(svn2rpm(pkgdirurl, rev=rev, size=size, submit=submit, - template=template)) + template=template, macros=macros)) # Merge old changelog, if available oldurl = config.get("log", "oldurl") -- cgit v1.2.1 From f2d171495ab3387cb95256accd5db304f8db0f86 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Tue, 30 Jan 2007 15:10:12 +0000 Subject: Removed stripping of log messages in order to not destroy topic structure from log messages. --- RepSys/log.py | 1 - 1 file changed, 1 deletion(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 3645fdd..535287d 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -106,7 +106,6 @@ def format_lines(lines): entrylines = [] perexpr = re.compile(r"([^%])%([^%])") for line in lines: - line = line.lstrip() if line: line = perexpr.sub("\\1%%\\2", line) if first: -- cgit v1.2.1 From dfbe875f5fed1fdd017eba2d460c53b8b7cd2658 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Tue, 30 Jan 2007 20:56:26 +0000 Subject: Hide authors with only SILENTed changesets. --- RepSys/log.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 535287d..d6d13e3 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -94,7 +94,9 @@ class _Revision: class _Release(_Revision): version = None release = None - revisions = None + revisions = [] + release_revisions = [] + authors = [] def __init__(self, **kwargs): self.revisions = [] @@ -135,8 +137,13 @@ def group_releases_by_author(releases): for release in releases: authors = {} for revision in release.revisions: + if not revision.lines: + continue authors.setdefault(revision.author, []).append(revision) + if not authors: + continue + # all the mess below is to sort by author and by revision number decorated = [] for authorname, revs in authors.iteritems(): -- cgit v1.2.1 From b98cc32e7546d0cb90ce6df763a9515045750924 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Thu, 15 Mar 2007 18:40:24 +0000 Subject: Make releases with only SILENTed messages will result in a warning, not to be skipped. --- RepSys/log.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index d6d13e3..85d502f 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -97,6 +97,7 @@ class _Release(_Revision): revisions = [] release_revisions = [] authors = [] + visible = False def __init__(self, **kwargs): self.revisions = [] @@ -137,13 +138,8 @@ def group_releases_by_author(releases): for release in releases: authors = {} for revision in release.revisions: - if not revision.lines: - continue authors.setdefault(revision.author, []).append(revision) - if not authors: - continue - # all the mess below is to sort by author and by revision number decorated = [] for authorname, revs in authors.iteritems(): @@ -226,8 +222,11 @@ def make_release(author=None, revision=None, date=None, lines=None, rel.date = (date and parse_raw_date(date)) or None rel.lines = lines rel.released = released + rel.visible = False for entry in entries: lines = filter_log_lines(entry.lines) + if lines: + rel.visible = True revision = _Revision() revision.revision = entry.revision revision.lines = format_lines(lines) -- cgit v1.2.1 From 8c403d422268c1ef1ddfd481e5835c9c071478da Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Tue, 24 Apr 2007 18:15:43 +0000 Subject: Aways use HEAD for changelogs placed in misc/, since they can contain fixes. Also they are always intended to represent one change *BEFORE* the package import. --- RepSys/log.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 85d502f..c4e2769 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -418,7 +418,9 @@ def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, pkgname = RepSysTree.pkgname(pkgdirurl) pkgoldurl = os.path.join(oldurl, pkgname) if svn.ls(pkgoldurl, noerror=1): - svn.export(pkgoldurl, tmpdir, rev=rev) + # we're using HEAD here because fixes in misc/ (oldurl) may + # be newer than packages' last changed revision. + svn.export(pkgoldurl, tmpdir) logfile = os.path.join(tmpdir, "log") if os.path.isfile(logfile): file = open(logfile) -- cgit v1.2.1 From 5cf994844b3510ec0d79f6dbc0fc1109d9412673 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Tue, 24 Apr 2007 18:16:41 +0000 Subject: Escape even the old changelogs that are inside misc/. These old changelogs contain bogus macros entries because the output of rpm -qp --changelog (or the equivalent) doesn't print the changelogs escaped. --- RepSys/log.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index c4e2769..24dca3c 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -103,6 +103,11 @@ class _Release(_Revision): self.revisions = [] _Revision.__init__(self, **kwargs) +unescaped_macro_pat = re.compile(r"([^%])%([^%])") + +def escape_macros(text): + escaped = unescaped_macro_pat.sub("\\1%%\\2", text) + return escaped def format_lines(lines): first = 1 @@ -110,7 +115,7 @@ def format_lines(lines): perexpr = re.compile(r"([^%])%([^%])") for line in lines: if line: - line = perexpr.sub("\\1%%\\2", line) + line = escape_macros(line) if first: first = 0 line = line.lstrip() @@ -425,7 +430,9 @@ def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, if os.path.isfile(logfile): file = open(logfile) newlines.append("\n") - newlines.append(file.read()) + log = file.read() + log = escape_macros(log) + newlines.append(log) file.close() finally: if os.path.isdir(tmpdir): -- cgit v1.2.1 From 61014d8ba27b0bb25d83c62c0da2404073c362b5 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Wed, 2 May 2007 17:26:28 +0000 Subject: Implemented __repr__ for the classes _Release and _Revision in order to ease debugging. --- RepSys/log.py | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 24dca3c..b03e23d 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -90,6 +90,12 @@ class _Revision: def __init__(self, **kwargs): self.__dict__.update(kwargs) + def __repr__(self): + lines = repr(self.lines)[:30] + "...]" + line = "<_Revision %d author=%r date=%r lines=%s>" % \ + (self.revision, self.author, self.date, lines) + return line + class _Release(_Revision): version = None @@ -103,6 +109,11 @@ class _Release(_Revision): self.revisions = [] _Revision.__init__(self, **kwargs) + def __repr__(self): + line = "<_Release v=%s r=%s revs=%r>" % \ + (self.version, self.release, self.revisions) + return line + unescaped_macro_pat = re.compile(r"([^%])%([^%])") def escape_macros(text): -- cgit v1.2.1 From 91700a68924f4b2e97a18f2c3787bd885c36640c Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Wed, 2 May 2007 17:28:55 +0000 Subject: Fixed regressions introduced in changelog generation while fixing the problem of package just imported. --- RepSys/log.py | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index b03e23d..f298e6f 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -151,8 +151,10 @@ class _Author: def group_releases_by_author(releases): allauthors = [] + grouped = [] for release in releases: authors = {} + latest = None for revision in release.revisions: authors.setdefault(revision.author, []).append(revision) @@ -165,7 +167,19 @@ def group_releases_by_author(releases): revdeco = [(r.revision, r) for r in revs] revdeco.sort(reverse=1) author.revisions = [t[1] for t in revdeco] - decorated.append((max(revdeco)[0], author)) + revlatest = author.revisions[0] + # keep the latest revision even for silented 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 + continue + decorated.append((revdeco[0][0], author)) + + if not decorated: + # skipping release with only authors with silented lines + continue decorated.sort(reverse=1) release.authors = [t[1] for t in decorated] @@ -176,12 +190,17 @@ def group_releases_by_author(releases): first, release.authors = release.authors[0], release.authors[1:] release.author_name = first.name release.author_email = first.email - release.date = first.revisions[0].date - release.raw_date = first.revisions[0].raw_date release.release_revisions = first.revisions - release.revision = first.revisions[0].revision - return releases + #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) + + return grouped def group_revisions_by_author(currentlog): -- cgit v1.2.1 From 1e082d77b7d44682d6a41c5cf53cc0b132fb5765 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Tue, 8 May 2007 17:57:57 +0000 Subject: Make issue an clearer error when python-cheetah is not installed. Closes #27374. --- RepSys/log.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index f298e6f..785214e 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -3,7 +3,10 @@ from RepSys import Error, config, RepSysTree from RepSys.svn import SVN from RepSys.util import execcmd -from Cheetah.Template import Template +try: + from Cheetah.Template import Template +except ImportError: + raise Error, "repsys requires the package python-cheetah" import sys import os -- cgit v1.2.1 From eecca989feb2fd9ca8edff1a26c2f8ac6e7c54f4 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Tue, 8 May 2007 19:00:31 +0000 Subject: Show epoch of the release in changelog, even when it has not been markreleased yet. --- RepSys/log.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 785214e..138918f 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -65,7 +65,7 @@ def getrelease(pkgdirurl, rev=None, macros=[]): if found: specpath = found[0] options = rpm_macros_defs(macros) - command = (("rpm -q --qf '%%{VERSION}-%%{RELEASE}\n' " + command = (("rpm -q --qf '%%{EPOCH}:%%{VERSION}-%%{RELEASE}\n' " "--specfile %s %s 2>/dev/null") % (specpath, options)) status, output = execcmd(command) @@ -73,11 +73,17 @@ def getrelease(pkgdirurl, rev=None, macros=[]): raise Error, "Error in command %s: %s" % (command, output) releases = output.split() try: - version, release = releases[0].split("-", 1) + epoch, vr = releases[0].split(":", 1) + version, release = vr.split("-", 1) except ValueError: raise Error, "Invalid command output: %s: %s" % \ (command, output) - return version, release + #XXX check if this is the right way: + if epoch == "(none)": + ev = version + else: + ev = epoch + ":" + version + return ev, release finally: if os.path.isdir(tmpdir): shutil.rmtree(tmpdir) -- cgit v1.2.1 From cb1f86f2e30b8d7311c8ed75e7d4014827cced38 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Sat, 16 Jun 2007 16:05:44 +0000 Subject: prepare for cheetah-2 --- RepSys/log.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 138918f..7263be3 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -298,7 +298,7 @@ def dump_file(releases, currentlog=None, template=None): "releases" : releases, "revisions_by_author": revisions_author}] t = Template(**params) - return repr(t) + return t.respond() class InvalidEntryError(Exception): -- cgit v1.2.1 From b1d0787e062a976b33113f08e12c6d9193dbd2e7 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Sun, 17 Jun 2007 15:07:25 +0000 Subject: Perform less svn operations in getsrpm and rpmlog - don't export SPECS/ when current/ is already exported - don't check for the presence of a path that will be exported in the same code, let it raise one exception - complain when no changelogs are found inside SPECS/ --- RepSys/log.py | 78 ++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 42 insertions(+), 36 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 7263be3..b5bf212 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -45,7 +45,7 @@ default_template = """ #end for """ -def getrelease(pkgdirurl, rev=None, macros=[]): +def getrelease(pkgdirurl, rev=None, macros=[], exported=None): """Tries to obtain the version-release of the package for a yet-not-markrelease revision of the package. @@ -54,38 +54,40 @@ def getrelease(pkgdirurl, rev=None, macros=[]): """ from RepSys.rpmutil import rpm_macros_defs svn = SVN(baseurl=pkgdirurl) - tmpdir = tempfile.mktemp() + pkgcurrenturl = os.path.join(pkgdirurl, "current") + specurl = os.path.join(pkgcurrenturl, "SPECS") + if exported is None: + tmpdir = tempfile.mktemp() + svn.export(specurl, tmpdir, rev=rev) + else: + tmpdir = os.path.join(exported, "SPECS") try: - pkgname = RepSysTree.pkgname(pkgdirurl) - pkgcurrenturl = os.path.join(pkgdirurl, "current") - specurl = os.path.join(pkgcurrenturl, "SPECS") - if svn.ls(specurl, noerror=1): - svn.export(specurl, tmpdir, rev=rev) - found = glob.glob(os.path.join(tmpdir, "*.spec")) - if found: - specpath = found[0] - options = rpm_macros_defs(macros) - command = (("rpm -q --qf '%%{EPOCH}:%%{VERSION}-%%{RELEASE}\n' " - "--specfile %s %s 2>/dev/null") % - (specpath, options)) - status, output = execcmd(command) - if status != 0: - raise Error, "Error in command %s: %s" % (command, output) - releases = output.split() - try: - epoch, vr = releases[0].split(":", 1) - version, release = vr.split("-", 1) - except ValueError: - raise Error, "Invalid command output: %s: %s" % \ - (command, output) - #XXX check if this is the right way: - if epoch == "(none)": - ev = version - else: - ev = epoch + ":" + version - return ev, release + found = glob.glob(os.path.join(tmpdir, "*.spec")) + if not found: + raise Error, "no .spec file found inside %s" % specurl + specpath = found[0] + options = rpm_macros_defs(macros) + command = (("rpm -q --qf '%%{EPOCH}:%%{VERSION}-%%{RELEASE}\n' " + "--specfile %s %s 2>/dev/null") % + (specpath, options)) + status, output = execcmd(command) + if status != 0: + raise Error, "Error in command %s: %s" % (command, output) + releases = output.split() + try: + epoch, vr = releases[0].split(":", 1) + version, release = vr.split("-", 1) + except ValueError: + raise Error, "Invalid command output: %s: %s" % \ + (command, output) + #XXX check if this is the right way: + if epoch == "(none)": + ev = version + else: + ev = epoch + ":" + version + return ev, release finally: - if os.path.isdir(tmpdir): + if exported is None and os.path.isdir(tmpdir): shutil.rmtree(tmpdir) class _Revision: @@ -360,7 +362,7 @@ def parse_markrelease_log(relentry): def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, - template=None, macros=[]): + template=None, macros=[], exported=None): concat = config.get("log", "concat", "").split() revoffset = get_revision_offset() svn = SVN(baseurl=pkgdirurl) @@ -423,7 +425,8 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, if notsubmitted: # if they are not submitted yet, what we have to do is to add # a release/version number from getrelease() - version, release = getrelease(pkgdirurl, macros=macros) + version, release = getrelease(pkgdirurl, macros=macros, + exported=exported) toprelease = make_release(entries=notsubmitted, released=False, version=version, release=release) releases.append(toprelease) @@ -434,7 +437,7 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, - submit=False, template=None, macros=[]): + submit=False, template=None, macros=[], exported=None): newlines = [] found = 0 @@ -451,7 +454,7 @@ def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, # Create new changelog newlines.append("\n\n%changelog\n") newlines.append(svn2rpm(pkgdirurl, rev=rev, size=size, submit=submit, - template=template, macros=macros)) + template=template, macros=macros, exported=exported)) # Merge old changelog, if available oldurl = config.get("log", "oldurl") @@ -461,10 +464,13 @@ def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, try: pkgname = RepSysTree.pkgname(pkgdirurl) pkgoldurl = os.path.join(oldurl, pkgname) - if svn.ls(pkgoldurl, noerror=1): + try: # we're using HEAD here because fixes in misc/ (oldurl) may # be newer than packages' last changed revision. svn.export(pkgoldurl, tmpdir) + except Error: + pass + else: logfile = os.path.join(tmpdir, "log") if os.path.isfile(logfile): file = open(logfile) -- cgit v1.2.1 From e5ac8131f63ee32d79c2d4e8232cd8d047add24c Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Fri, 21 Sep 2007 15:50:43 +0000 Subject: Fix: unreleased commits are not those newer than the last markrelease Entries considered unreleased must be those newer than the latest released revision in current/. Problem pointed out by mrl. --- RepSys/log.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index b5bf212..009e4e0 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -413,11 +413,11 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, releases.append(release) prevrevision = relrevision - # look for commits that have been not submited (released) yet - # this is done by getting all log entries newer (revision larger) - # than releaseslog[0] (in the case it exists) - if releaseslog: - latest_revision = releaseslog[0].revision + # look for commits that have been not submitted (released) yet + # this is done by getting all log entries newer (greater revision no.) + # than releasesdata[0] (in the case it exists) + if releasesdata: + latest_revision = releasesdata[0][0] # "relrevision" else: latest_revision = 0 notsubmitted = [entry for entry in currentlog -- cgit v1.2.1 From 0b923f7cebcdb0f9435c0961a08c537fad7608e0 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Thu, 8 Nov 2007 16:30:08 +0000 Subject: Added the complement to SILENT: CLOG When using CLOG, only those lines beginning with this token will be shown. It only works when enabled in repsys.conf. --- RepSys/log.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 009e4e0..10026c3 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -246,13 +246,25 @@ def parse_raw_date(rawdate): return time.strftime("%a %b %d %Y", rawdate) def filter_log_lines(lines): - # lines in commit messages containing SILENT at any position will be - # skipped; commits with their log messages beggining with SILENT in the - # first positionj of the first line will have all lines ignored. - ignstr = config.get("log", "ignore-string", "SILENT") - if len(lines) and lines[0].startswith(ignstr): - return [] - filtered = [line for line in lines if ignstr not in line] + # Lines in commit messages beginning with CLOG will be the only shown + # in the changelog. These lines will have the CLOG token and blanks + # stripped from the beginning. + onlylines = None + clogstr = config.get("log", "unignore-string") + if clogstr: + clogre = re.compile(r"(^%s[^ \t]?[ \t])" % clogstr) + onlylines = [clogre.sub("", line) + for line in lines if line.startswith(clogstr)] + if onlylines: + filtered = onlylines + else: + # Lines in commit messages containing SILENT at any position will be + # skipped; commits with their log messages beggining with SILENT in the + # first positionj of the first line will have all lines ignored. + ignstr = config.get("log", "ignore-string", "SILENT") + if len(lines) and lines[0].startswith(ignstr): + return [] + filtered = [line for line in lines if ignstr not in line] return filtered -- cgit v1.2.1 From bbcb7441232303601ccce9a413e104c450477bef Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Tue, 13 Nov 2007 17:14:47 +0000 Subject: Reverted "Fix: unreleased commits are not those newer than the last markrelease" It was r228878. Some changelogs are broken. Revert it while a better fix is investigated. --- RepSys/log.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 10026c3..b476618 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -425,11 +425,11 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, releases.append(release) prevrevision = relrevision - # look for commits that have been not submitted (released) yet - # this is done by getting all log entries newer (greater revision no.) - # than releasesdata[0] (in the case it exists) - if releasesdata: - latest_revision = releasesdata[0][0] # "relrevision" + # look for commits that have been not submited (released) yet + # this is done by getting all log entries newer (revision larger) + # than releaseslog[0] (in the case it exists) + if releaseslog: + latest_revision = releaseslog[0].revision else: latest_revision = 0 notsubmitted = [entry for entry in currentlog -- cgit v1.2.1 From a927524c43d391579a17b3630606f350f44acf3c Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Wed, 14 Nov 2007 20:29:55 +0000 Subject: Really fixed generation of unreleased commits It was using the previous markrelease revision as reference. The recent broken fix was using "releasesdata[0]" instead of "releasesdata[-1]" which is the newest release revision. --- RepSys/log.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index b476618..730c674 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -425,11 +425,11 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, releases.append(release) prevrevision = relrevision - # look for commits that have been not submited (released) yet - # this is done by getting all log entries newer (revision larger) - # than releaseslog[0] (in the case it exists) - if releaseslog: - latest_revision = releaseslog[0].revision + # look for commits that have been not submitted (released) yet + # this is done by getting all log entries newer (greater revision no.) + # than releasesdata[-1] (in the case it exists) + if releasesdata: + latest_revision = releasesdata[-1][0] # the latest copied rev else: latest_revision = 0 notsubmitted = [entry for entry in currentlog -- cgit v1.2.1 From e196e676aa302cd3a1f7b37f259491a8b03cc483 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Thu, 15 Nov 2007 05:30:56 +0000 Subject: Dropped all authenticated access support Subversion authentication has been broken for a long time and the workarounds weren't decent. It will be back in 1.7.x. Also added configuration option svn-command in the global section, allowing to replace the default svn command. And use svn+ssh:// URLs to be in BatchMode, in order to not have any interactivity at all with ssh --- RepSys/log.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 730c674..df7bc9f 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -53,7 +53,7 @@ def getrelease(pkgdirurl, rev=None, macros=[], exported=None): will be used. """ from RepSys.rpmutil import rpm_macros_defs - svn = SVN(baseurl=pkgdirurl) + svn = SVN() pkgcurrenturl = os.path.join(pkgdirurl, "current") specurl = os.path.join(pkgcurrenturl, "SPECS") if exported is None: @@ -377,7 +377,7 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, template=None, macros=[], exported=None): concat = config.get("log", "concat", "").split() revoffset = get_revision_offset() - svn = SVN(baseurl=pkgdirurl) + svn = SVN() pkgreleasesurl = os.path.join(pkgdirurl, "releases") pkgcurrenturl = os.path.join(pkgdirurl, "current") releaseslog = svn.log(pkgreleasesurl, noerror=1) @@ -471,7 +471,7 @@ def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, # Merge old changelog, if available oldurl = config.get("log", "oldurl") if oldurl: - svn = SVN(baseurl=pkgdirurl) + svn = SVN() tmpdir = tempfile.mktemp() try: pkgname = RepSysTree.pkgname(pkgdirurl) -- cgit v1.2.1 From ffdaa7d17062bf450a040b34056aaf0e096a9599 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Tue, 5 Feb 2008 21:06:50 +0000 Subject: Set the default template path and update the built-in one to match default.chlog --- RepSys/log.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index df7bc9f..68cbbc0 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -23,17 +23,27 @@ locale.setlocale(locale.LC_ALL, "C") default_template = """ #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 @@ -298,7 +308,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 -- cgit v1.2.1 From 11c6a91f79529e1e6ab029f81f8b1582fff74842 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Wed, 6 Feb 2008 01:39:28 +0000 Subject: Fixed emptylog to be shown when necessary As emptylog started working again another problem arose: the first release in most of the packages is SILENTed and result in a emptlog entry. The problem is that the log gathered from misc/ already contains (in most of the cases, at least) the version-release with the right message. --- RepSys/log.py | 53 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 23 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 68cbbc0..60cf0d5 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -21,6 +21,12 @@ 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 + Revision: $rel.revision @@ -174,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 = _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) -- cgit v1.2.1 From 3be56dcf69b2edca96aaf68cce75608649b6572e Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Mon, 3 Mar 2008 21:06:55 +0000 Subject: Add configuration option to sort the generated changelog The boolean option "sort" in the [log] section can be used to make repsys sort all the entries after generating the changelog from svn and concatenating with the one found in "misc/". It was also added another option to merge the log found in the spec (those that don't have the %changelog section stripped). The current problem with this implementation is that SILENTed entries in svn will not be merged with those found in %changelog or in misc. Not a problem really. --- RepSys/log.py | 67 +++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 11 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 60cf0d5..4a74716 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,11 +466,41 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, data = dump_file(releases[::-1], currentlog=currentlog, template=template) return data +def _split_changelog(stream): + current = None + count = 0 + for line in stream: + if line.startswith("*"): + if current: + yield 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 += 1 # used to ensure stable sorting when using tuples + elif current: + curlines.append(line) + else: + pass # not good, but ignore + if current: + yield current +def sort_changelog(stream): + entries = list(_split_changelog(stream)) + log = StringIO() + for time, count, elines in sorted(entries, reverse=True): + log.writelines(elines) + return log def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, - submit=False, template=None, macros=[], exported=None): - newlines = [] + submit=False, sort=False, template=None, macros=[], exported=None): + oldspec = StringIO() + newlog = StringIO() + oldlog = StringIO() found = 0 # Strip old changelogs @@ -476,15 +508,17 @@ def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, if line.startswith("%changelog"): found = 1 elif not found: - newlines.append(line) + oldspec.write(line) + elif found: + oldlog.write(line) elif line.startswith("%"): found = 0 - newlines.append(line) + oldspec.write(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)) + rawsvnlog = svn2rpm(pkgdirurl, rev=rev, size=size, submit=submit, + template=template, macros=macros, + exported=exported) + newlog.write(rawsvnlog) # Merge old changelog, if available oldurl = config.get("log", "oldurl") @@ -504,18 +538,29 @@ 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") + newlog.write("\n") # TODO needed? log = file.read() log = escape_macros(log) - newlines.append(log) + newlog.write(log) file.close() finally: if os.path.isdir(tmpdir): shutil.rmtree(tmpdir) + if sort or config.getbool("log", "sort", False): + if config.getbool("log", "merge-spec", False): + oldlog.seek(0) + newlog.writelines(oldlog) + newlog.seek(0) + newlog = sort_changelog(newlog) + # Write new specfile + newlog.seek(0) + oldspec.seek(0) file = open(specfile, "w") - file.write("".join(newlines)) + file.writelines(oldspec) + file.write("\n\n%changelog\n") + file.writelines(newlog) file.close() -- cgit v1.2.1 From 1070a065cead83f9606fb4bf7e5727ed3b42d6b3 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Mon, 3 Mar 2008 21:09:17 +0000 Subject: Instead of inverting count all the time, decrease it in every loop Also added a clearer comment about the function of count. --- RepSys/log.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 4a74716..25c8548 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -480,8 +480,11 @@ def _split_changelog(stream): except ValueError, e: raise Error, "failed to parse spec changelog: %s" % e curlines = [line] - current = (date, -count, curlines) - count += 1 # used to ensure stable sorting when using tuples + 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: @@ -490,7 +493,7 @@ def _split_changelog(stream): yield current def sort_changelog(stream): - entries = list(_split_changelog(stream)) + entries = _split_changelog(stream)) log = StringIO() for time, count, elines in sorted(entries, reverse=True): log.writelines(elines) -- cgit v1.2.1 From 977db706098e5fc8c9a89004c49af802e58d0d13 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Mon, 3 Mar 2008 21:10:38 +0000 Subject: Refactored log api: move specifile_svn2rpm to get_changelog The old specfile_svn2rpm will be used only to the purpose of creating the spec with the changelog to be used by getsrpm. The new main function to retrieve the changelog of a given package is the function get_changelog(), which creates the changelog from svn, append oldlog, append the changelog from the spec (if available), sort them and create the final changelog to be output. --- RepSys/log.py | 104 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 71 insertions(+), 33 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 25c8548..217a996 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -493,37 +493,32 @@ def _split_changelog(stream): yield current def sort_changelog(stream): - entries = _split_changelog(stream)) + entries = _split_changelog(stream) log = StringIO() for time, count, elines in sorted(entries, reverse=True): log.writelines(elines) return log -def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, - submit=False, sort=False, template=None, macros=[], exported=None): - oldspec = StringIO() - newlog = StringIO() - oldlog = StringIO() +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: - oldspec.write(line) + spec.write(line) elif found: - oldlog.write(line) + chlog.write(line) elif line.startswith("%"): found = 0 - oldspec.write(line) - - rawsvnlog = svn2rpm(pkgdirurl, rev=rev, size=size, submit=submit, - template=template, macros=macros, - exported=exported) - newlog.write(rawsvnlog) + 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() @@ -541,31 +536,74 @@ def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, logfile = os.path.join(tmpdir, "log") if os.path.isfile(logfile): file = open(logfile) - newlog.write("\n") # TODO needed? + chlog.write("\n") # TODO needed? log = file.read() log = escape_macros(log) - newlog.write(log) + chlog.write(log) file.close() finally: if os.path.isdir(tmpdir): shutil.rmtree(tmpdir) - - if sort or config.getbool("log", "sort", False): - if config.getbool("log", "merge-spec", False): - oldlog.seek(0) - newlog.writelines(oldlog) + 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) - - # Write new specfile newlog.seek(0) - oldspec.seek(0) - file = open(specfile, "w") - file.writelines(oldspec) - file.write("\n\n%changelog\n") - file.writelines(newlog) - file.close() + return newlog +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]) -- cgit v1.2.1 From 74df7c8e80bac7b44f148fbd702e523982698fdf Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Mon, 3 Mar 2008 21:11:21 +0000 Subject: Ensure sorted changelog entries will have correct spacing Strip the spare changelog entries newlines in order to add again later and ensure that we will have the same spacing between all sorted changelog entries. --- RepSys/log.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 217a996..2eadbe2 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -469,10 +469,18 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, 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 current + yield finish(current) fields = line.split() rawdate = " ".join(fields[:5]) try: @@ -490,13 +498,14 @@ def _split_changelog(stream): else: pass # not good, but ignore if current: - yield 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): -- cgit v1.2.1 From 0af96a9eb0e69191d5fb5d5dcfa35a287bcc31b4 Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Thu, 17 Jul 2008 12:24:13 +0000 Subject: Don't hide authors with only the first revision SILENTed (#41117) --- RepSys/log.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index 2eadbe2..ca1d107 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -45,7 +45,7 @@ $line #end for #for $author in $rel.authors - #if $author.revisions and not $author.revisions[0].lines + #if not $author.visible #continue #end if ##alternatively, one could use: @@ -176,6 +176,7 @@ class _Author: name = None email = None revisions = None + visible = False def group_releases_by_author(releases): @@ -196,13 +197,14 @@ def group_releases_by_author(releases): author.name = revs[0].author_name author.email = revs[0].author_email author.revisions = revs + # #41117: mark those authors without visible messages + author.visible = bool(sum(len(rev.lines) for rev in revs)) revlatest = author.revisions[0] # 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: + if not author.visible: # only sort those visible authors, invisible ones are used # only in "latest" continue @@ -302,11 +304,11 @@ def make_release(author=None, revision=None, date=None, lines=None, rel.visible = False for entry in entries: lines = filter_log_lines(entry.lines) - if lines: - rel.visible = True revision = _Revision() revision.revision = entry.revision revision.lines = format_lines(lines) + if revision.lines: + rel.visible = True revision.date = parse_raw_date(entry.date) revision.raw_date = entry.date revision.author = entry.author -- cgit v1.2.1 From 5c7f585c08c8ffb944095ae031fbf82a54ba13bc Mon Sep 17 00:00:00 2001 From: Bogdano Arendartchuk Date: Thu, 17 Jul 2008 12:24:21 +0000 Subject: Allow specifying distro branches without using complete URLs Added the configuration option "repository", which will have the URL to the root of the repository. The change also allowed using mirrors in all the read-only commands. --- RepSys/log.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'RepSys/log.py') diff --git a/RepSys/log.py b/RepSys/log.py index ca1d107..a1d1944 100644 --- a/RepSys/log.py +++ b/RepSys/log.py @@ -1,5 +1,5 @@ #!/usr/bin/python -from RepSys import Error, config, RepSysTree +from RepSys import Error, config, layout from RepSys.svn import SVN from RepSys.util import execcmd @@ -400,8 +400,8 @@ def svn2rpm(pkgdirurl, rev=None, size=None, submit=False, concat = config.get("log", "concat", "").split() revoffset = get_revision_offset() svn = SVN() - pkgreleasesurl = os.path.join(pkgdirurl, "releases") - pkgcurrenturl = os.path.join(pkgdirurl, "current") + pkgreleasesurl = layout.checkout_url(pkgdirurl, releases=True) + pkgcurrenturl = layout.checkout_url(pkgdirurl) releaseslog = svn.log(pkgreleasesurl, noerror=1) currentlog = svn.log(pkgcurrenturl, limit=size, start=rev, end=revoffset) @@ -535,7 +535,7 @@ def get_old_log(pkgdirurl): svn = SVN() tmpdir = tempfile.mktemp() try: - pkgname = RepSysTree.pkgname(pkgdirurl) + pkgname = layout.package_name(pkgdirurl) pkgoldurl = os.path.join(oldurl, pkgname) try: # we're using HEAD here because fixes in misc/ (oldurl) may -- cgit v1.2.1