diff options
Diffstat (limited to 'MgaRepo/log.py')
-rw-r--r-- | MgaRepo/log.py | 129 |
1 files changed, 96 insertions, 33 deletions
diff --git a/MgaRepo/log.py b/MgaRepo/log.py index fab7d6e..f6c0fc9 100644 --- a/MgaRepo/log.py +++ b/MgaRepo/log.py @@ -8,6 +8,7 @@ from io import StringIO import sys import os +import os.path import re import time import locale @@ -27,7 +28,6 @@ def getrelease(pkgdirurl, rev=None, macros=[], exported=None, create=False): Is here where things should be changed if "automatic release increasing" will be used. """ - from MgaRepo.rpmutil import rpm_macros_defs svn = SVN() pkgcurrenturl = os.path.join(pkgdirurl, "current") specurl = os.path.join(pkgcurrenturl, "SPECS") @@ -43,17 +43,11 @@ def getrelease(pkgdirurl, rev=None, macros=[], exported=None, create=False): 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") % - (specpath, options)) - pipe = subprocess.Popen(command, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, shell=True) - pipe.wait() - output = pipe.stdout.read().decode('utf8') - error = pipe.stderr.read().decode('utf8') - if pipe.returncode != 0: - raise Error("Error in command %s: %s" % (command, error)) + options = [("--define", expr) for expr in macros] + command = ["rpm", "-q", "--qf", "%{EPOCH}:%{VERSION}-%{RELEASE}\n", + "--specfile", specpath] + command.extend(options) + status, output = execcmd(*command) releases = output.split() try: epoch, vr = releases[0].split(":", 1) @@ -81,17 +75,11 @@ def getrelease(pkgdirurl, rev=None, macros=[], exported=None, create=False): if not found: raise Error("no .src.rpm file found inside %s" % srpmurl) srpmpath = found[0] - options = rpm_macros_defs(macros) - command = (("rpm -qp --qf '%%{EPOCH}:%%{VERSION}-%%{RELEASE}\n' " - " %s %s") % - (srpmpath, options)) - pipe = subprocess.Popen(command, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, shell=True) - pipe.wait() - output = pipe.stdout.read().decode('utf8') - error = pipe.stderr.read().decode('utf8') - if pipe.returncode != 0: - raise Error("Error in command %s: %s" % (command, error)) + options = [("--define", expr) for expr in macros] + command = ["rpm", "-q", "--qf", "%{EPOCH}:%{VERSION}-%{RELEASE}\n", + "--specfile", specpath] + command.extend(options) + status, output = execcmd(*command) releases = output.split() try: epoch, vr = releases[0].split(":", 1) @@ -257,11 +245,12 @@ def group_revisions_by_author(currentlog): emailpat = re.compile("(?P<name>.*?)\s*<(?P<email>.*?)>") - +usermap = {} 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) + gold = emailpat.match(usermap.get(author,"")) + name = ((found and found.group("name")) or (gold and gold.group("name")) or author) + email = ((found and found.group("email")) or (gold and gold.group("email")) or author+"@mageia.org") return name, email def parse_raw_date(rawdate): @@ -354,15 +343,18 @@ def dump_file(releases, currentlog=None, template=None): first = False else: draft = draft + spaces + line + "\n" - draft += '\n' + if rel is not releases_author[-1]: + draft += "\n" else: # default template if not releases_author[-1].visible: releases_author = releases_author[:-1] for rel in releases_author: if not rel.released: - draft = " (not released yet)\n" - draft = draft + "* {0} {1} <{2}> {3}-{4}\n+ Revision: {5}\n".format(rel.date, rel.author_name, rel.author_email, rel.version, rel.release, rel.revision) + unreleased = " (not released yet)\n" + else: + unreleased = "" + draft = draft + "* {0} {1} <{2}> {3}-{4}\n{5}+ Revision: {6}\n".format(rel.date, rel.author_name, rel.author_email, rel.version, rel.release, unreleased, rel.revision) if not rel.visible: draft = draft + "+ rebuild (emptylog)\n" for rev in rel.release_revisions: @@ -375,7 +367,8 @@ def dump_file(releases, currentlog=None, template=None): for rev in author.revisions: for line in rev.lines: draft = draft + line + "\n" - draft += "\n" + if rel is not releases_author[-1]: + draft += "\n" return draft class InvalidEntryError(Exception): @@ -606,9 +599,74 @@ def get_old_log(pkgdirurl): chlog.seek(0) return chlog +from html.parser import HTMLParser +from urllib.request import urlopen +class UserTagParser(HTMLParser): + li = False + ahref = False + userpage = None + namepat = re.compile("(?P<name>.*?)\s*\((?P<user>.*?)\)") + usermap = {} + usermapfile = None + + def __init__(self, url=None, defaultmail=None, *cmd, **kwargs): + HTMLParser.__init__(self, *cmd, **kwargs) + self.url = url or "http://people.mageia.org/u/" + self.defaultmail = defaultmail or "mageia.org" + + def handle_starttag(self, tag, attrs): + if tag == "li": + self.li = True + if self.li and tag == "a": + for att in attrs: + if att[0] == "href": + self.ahref = True + self.userpage = att[1] + + def handle_endtag(self, tag): + if self.li and tag == "a": + self.ahref = False + self.userpage = None + if tag == "li": + self.li = False + + def handle_data(self, data): + if self.li and self.ahref: + found = self.namepat.match(data) + if found: + user = found.group("user") + name = found.group("name") + if user and name and user+".html" == self.userpage: + self.usermap[user] = "%s <%s@%s>" % (name, user, self.defaultmail) + + def get_user_map(self): + f = urlopen(self.url) + userhtml = f.read().decode("UTF-8") + f.close() + self.feed(userhtml) + return self.usermap + + def get_user_map_file(self): + if not self.usermap: + self.get_user_map() + self.usermapfile = tempfile.mkstemp(suffix=".txt", prefix="usermap") + f = open(self.usermapfile[0], "w", encoding="UTF-8") + f.writelines("%s = %s\n" % user for user in sorted(self.usermap.items())) + f.close() + return self.usermapfile[1] + + def cleanup(self): + if os.path.exists(self.usermapfile[1]): + os.unlink(self.usermapfile[1]) + +def _map_user_names(): + if not usermap: + parser = UserTagParser() + usermap.update(parser.get_user_map()) + def get_changelog(pkgdirurl, another=None, svn=True, rev=None, size=None, submit=False, sort=False, template=None, macros=[], exported=None, - oldlog=False, create=False): + oldlog=False, create=False, fullnames=False): """Generates the changelog for a given package URL @another: a stream with the contents of a changelog to be merged with @@ -634,6 +692,9 @@ def get_changelog(pkgdirurl, another=None, svn=True, rev=None, size=None, """ newlog = StringIO() if svn: + if fullnames: + if not usermap: + _map_user_names() rawsvnlog = svn2rpm(pkgdirurl, rev=rev, size=size, submit=submit, template=template, macros=macros, exported=exported, create=create) newlog.write(rawsvnlog) @@ -648,19 +709,21 @@ def get_changelog(pkgdirurl, another=None, svn=True, rev=None, size=None, return newlog def specfile_svn2rpm(pkgdirurl, specfile, rev=None, size=None, - submit=False, sort=False, template=None, macros=[], exported=None, create=False): + submit=False, sort=False, template=None, macros=[], exported=None, create=False, fullnames=False): with open(specfile, encoding = 'utf-8') as fi: spec, oldchlog = split_spec_changelog(fi) another = None if config.getbool("log", "merge-spec", False): another = oldchlog sort = sort or config.getbool("log", "sort", False) + if fullnames: + _map_user_names() chlog = get_changelog(pkgdirurl, another=another, rev=rev, size=size, submit=submit, sort=sort, template=template, macros=macros, exported=exported, oldlog=True, create=create) with open(specfile, "w", encoding='utf-8') as fo: fo.writelines(spec) - fo.write("\n\n%changelog\n") + fo.write("\n%changelog\n") fo.writelines(chlog) if __name__ == "__main__": |