X-Git-Url: https://git.tld-linux.org/?p=tld-builder.git;a=blobdiff_plain;f=TLD_Builder%2Frequest.py;fp=PLD_Builder%2Frequest.py;h=27bc426364538a683cf287a487d8e84dcd4bffc8;hp=93963944788084c154805f6e26dce76060cfe880;hb=b999f53d4bf5d44586ecf028876e8bc20b5fd2ce;hpb=37463eaa22f48f5fecbb90e69ef67a69e0bf9788 diff --git a/PLD_Builder/request.py b/TLD_Builder/request.py similarity index 75% rename from PLD_Builder/request.py rename to TLD_Builder/request.py index 9396394..27bc426 100644 --- a/PLD_Builder/request.py +++ b/TLD_Builder/request.py @@ -1,6 +1,7 @@ # vi: encoding=utf-8 ts=8 sts=4 sw=4 et from xml.dom.minidom import * +from datetime import datetime import string import time import xml.sax.saxutils @@ -8,6 +9,8 @@ import fnmatch import os import urllib import cgi +import pytz +import tempfile import util import log @@ -36,6 +39,12 @@ def attr(e, a, default = None): def escape(s): return xml.sax.saxutils.escape(s) +# return date in iso8601 format +def iso8601(ts, timezone='UTC'): + tz = pytz.timezone(timezone) + dt = datetime.fromtimestamp(ts, tz) + return dt.isoformat() + def is_blank(e): return e.nodeType == Element.TEXT_NODE and string.strip(e.nodeValue) == "" @@ -96,22 +105,25 @@ class Group: def dump_html(self, f): f.write( - "
\n" - "%(no)d. %(time)s from %(requester)s " + "
\n" + "%(no)d. " + " " + "from %(requester)s " "%(id)s, prio=%(priority)d, jobs=%(max_jobs)d, %(flags)s\n" % { 'no': self.no, 'id': '%(id)s' % {'id': self.id}, 'time': escape(time.strftime("%a %b %d %Y %H:%M:%S %z", time.localtime(self.time))), + 'datetime': escape(iso8601(self.time)), 'requester': escape(self.requester), 'priority': self.priority, 'max_jobs': self.max_jobs, 'flags': string.join(self.flags) }) - f.write("\n") + f.write("\n") f.write("
\n") def write_to(self, f): @@ -143,6 +155,7 @@ class Batch: self.builders_status_time = {} self.builders_status_buildtime = {} self.kernel = "" + self.defines = {} self.target = [] self.branch = "" self.src_rpm = "" @@ -155,6 +168,17 @@ class Batch: self.b_id = attr(e, "id") self.depends_on = string.split(attr(e, "depends-on")) self.upgraded = True + + self.parse_xml(e) + + self.__topdir = None + + def get_topdir(self): + if not self.__topdir: + self.__topdir = tempfile.mkdtemp(prefix='B.', dir='/tmp') + return self.__topdir + + def parse_xml(self, e): for c in e.childNodes: if is_blank(c): continue @@ -174,6 +198,9 @@ class Batch: self.info = text(c) elif c.nodeName == "kernel": self.kernel = text(c) + elif c.nodeName == "define": + define = attr(c, "name") + self.defines[define] = text(c) elif c.nodeName == "target": self.target.append(text(c)) elif c.nodeName == "skip": @@ -193,6 +220,21 @@ class Batch: else: log.panic("xml: evil batch child (%s)" % c.nodeName) + def get_package_name(self): + if len(self.spec) <= 5: + return None + return self.spec[:-5] + + def tmpdir(self): + """ + return tmpdir for this batch job building + """ + # it's better to have TMPDIR and BUILD dir on same partition: + # + /usr/bin/bzip2 -dc /home/services/builder/rpm/packages/kernel/patch-2.6.27.61.bz2 + # patch: **** Can't rename file /tmp/B.a1b1d3/poKWwRlp to drivers/scsi/hosts.c : No such file or directory + path = os.path.join(self.get_topdir(), 'BUILD', 'tmp') + return path + def is_done(self): ok = 1 for b in self.builders: @@ -205,6 +247,7 @@ class Batch: f.write(" batch: %s/%s\n" % (self.src_rpm, self.spec)) f.write(" info: %s\n" % self.info) f.write(" kernel: %s\n" % self.kernel) + f.write(" defines: %s\n" % self.defines_string()) f.write(" target: %s\n" % self.target_string()) f.write(" branch: %s\n" % self.branch) f.write(" bconds: %s\n" % self.bconds_string()) @@ -221,23 +264,23 @@ class Batch: if self.is_command(): desc = "SH:
%s
flags: [%s]" % (self.command, ' '.join(self.command_flags)) else: - cmd = "/usr/bin/git ls-remote --heads git://git.tld-linux.org/packages/%s 1>/dev/null 2>&1" % (self.spec[:-5]) - r = call(cmd, shell=True) - if r == 0: - dist = "tld" - else: - dist = "pld" - package_url = "http://git.%(dist)s-linux.org/?p=packages/%(package)s.git;a=blob;f=%(spec)s;hb=%(branch)s" % { - 'dist': dist, - 'spec': self.spec, - 'branch': self.branch, - 'package': self.spec[:-5], + cmd = "/usr/bin/git ls-remote --heads git://git.tld-linux.org/packages/%s 1>/dev/null 2>&1" % (self.spec[:-5]) + r = call(cmd, shell=True) + if r == 0: + dist = "tld" + else: + dist = "pld" + package_url = "http://git.%(dist)s-linux.org/?p=packages/%(package)s.git;a=blob;f=%(spec)s;hb=%(branch)s" % { + 'dist': dist, + 'spec': urllib.quote(self.spec), + 'branch': urllib.quote(self.branch), + 'package': urllib.quote(self.spec[:-5]), } - desc = "%(src_rpm)s (%(spec)s -r %(branch)s%(bconds)s)" % { + desc = "%(src_rpm)s (%(spec)s -r %(branch)s%(rpmopts)s)" % { 'src_rpm': self.src_rpm, 'spec': self.spec, 'branch': self.branch, - 'bconds': self.bconds_string() + self.kernel_string() + self.target_string(), + 'rpmopts': self.bconds_string() + self.kernel_string() + self.target_string() + self.defines_string(), 'package_url': package_url, } f.write("%s [" % desc) @@ -269,8 +312,8 @@ class Batch: bld = lin_ar.split('-') tree_name = '-'.join(bld[:-1]) tree_arch = '-'.join(bld[-1:]) - link_pre = "" \ - % (urllib.quote(tree_name), urllib.quote(tree_arch), urllib.quote(bl_name), urllib.quote(rid)) + link_pre = "" \ + % (urllib.quote(tree_name), urllib.quote(tree_arch), urllib.quote(bl_name), urllib.quote(rid)) link_post = "" def ftime(s): @@ -298,13 +341,62 @@ class Batch: """ return all rpmbuild options related to this build """ - bconds = self.bconds_string() + self.kernel_string() + self.target_string() + rpmopts = self.bconds_string() + self.kernel_string() + self.target_string() + self.defines_string() rpmdefs = \ - "--define '_topdir %(echo $HOME/rpm)' " \ - "--define '_specdir %{_topdir}/packages/%{name}' " \ + "--define '_topdir %s' " % self.get_topdir() + \ + "--define '_specdir %{_topdir}' " \ "--define '_sourcedir %{_specdir}' " \ - "--define '_builddir %{_topdir}/BUILD/%{name}' " - return rpmdefs + bconds + "--define '_rpmdir %{_topdir}/RPMS' " \ + "--define '_builddir %{_topdir}/BUILD' " + return rpmdefs + rpmopts + + def php_ignores(self): + # transform php package name (52) to version (5.2) + def php_name_to_ver(v): + return '.'.join(list(v)) + + # transform php version (5.2) to package name (52) + def php_ver_to_name(v): + return v.replace('.', '') + + # available php versions in distro + php_versions = ['4', '5.2', '5.3', '5.4', '5.5', '5.6', '7.0'] + + # current version if -D php_suffix is present + php_version = php_name_to_ver(self.defines['php_suffix']) + + # remove current php version + try: + php_versions.remove(php_version) + except ValueError: + log.notice("Attempt to remove inexistent key '%s' from %s" % (php_version, php_versions)) + pass + + # map them to poldek ignores + # always ignore hhvm + res = ['hhvm-*'] + for v in map(php_ver_to_name, php_versions): + res.append("php%s-*" % v) + + return res + + # build ignore package list + # currently only php ignore is filled based on build context + def ignores(self): + ignores = [] + + # add php version based ignores + if self.defines.has_key('php_suffix'): + ignores.extend(self.php_ignores()) + + # return empty string if the list is empty + if len(ignores) == 0: + return "" + + def add_ignore(s): + return "--ignore=%s" % s + + return " ".join(map(add_ignore, ignores)) def kernel_string(self): r = "" @@ -326,6 +418,18 @@ class Batch: r = r + " --without " + b return r + def defines_string(self): + r = "" + for key,value in self.defines.items(): + r += " --define '%s %s'" % (key, value) + return r + + def defines_xml(self): + r = "" + for key,value in self.defines.items(): + r += "%s\n" % (escape(key), escape(value)) + return r + def default_target(self, arch): self.target.append("%s-tld-linux" % arch) @@ -349,6 +453,8 @@ class Batch: f.write(" %s\n" % escape(b)) for b in self.bconds_without: f.write(" %s\n" % escape(b)) + if self.defines: + f.write(" %s\n" % self.defines_xml()) for b in self.builders: if self.builders_status_buildtime.has_key(b): t = self.builders_status_buildtime[b]