aboutsummaryrefslogtreecommitdiffstats
path: root/MgaRepo/log.py
diff options
context:
space:
mode:
Diffstat (limited to 'MgaRepo/log.py')
-rw-r--r--MgaRepo/log.py129
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__":