# vi: encoding=utf-8 ts=8 sts=4 sw=4 et import re import sys import os import log import string import codecs def uuid_python(): return str(uuid_random()) def uuid_external(): f = os.popen("uuidgen 2>&1") u = f.read().strip() f.close() if len(u) != 36: raise Exception("uuid: fatal, cannot generate uuid: %s" % u) return u # uuid module available in python >= 2.5 try: from uuid import uuid4 as uuid_random except ImportError: uuid = uuid_external else: uuid = uuid_python def pkg_name(nvr): return re.match(r"(.+)-[^-]+-[^-]+", nvr).group(1) def msg(m): sys.stderr.write(m) def sendfile(src, dst): cnt = 0 while 1: s = src.read(10000) if s == "" or s == b"": break cnt += len(s) dst.write(s) return cnt def append_to(log, msg): f = open(log, "a") f.write("%s\n" % msg) f.close() def clean_tmp(dir): # FIXME: use python os.system("rm -f %s/* 2>/dev/null; rmdir %s 2>/dev/null" % (dir, dir)) def collect_files(log, basedir = "/home"): f = open(log, 'r') rx = re.compile(r"^Wrote: (%s.*\.rpm)$" % basedir) proc = re.compile(r"^Processing files:.*$") files = [] for l in reversed(list(f)): if proc.match(l): break m = rx.search(l) if m: files.append(m.group(1)) f.close() return files def find_last_section(log): f = open(log, 'r') rx1 = re.compile(r"^Executing\(%(\w+)\).*$") rx2 = re.compile(r"^Processing (files):.*$") last_section = None for l in f: m = rx1.search(l) if not m: m = rx2.search(l) if m: last_section = m.group(1) f.close() return last_section def cmp_to_key(mycmp): 'Convert a cmp= function into a key= function' class K: def __init__(self, obj, *args): self.obj = obj def __lt__(self, other): return mycmp(self.obj, other.obj) < 0 def __gt__(self, other): return mycmp(self.obj, other.obj) > 0 def __eq__(self, other): return mycmp(self.obj, other.obj) == 0 def __le__(self, other): return mycmp(self.obj, other.obj) <= 0 def __ge__(self, other): return mycmp(self.obj, other.obj) >= 0 def __ne__(self, other): return mycmp(self.obj, other.obj) != 0 return K def to_bytes(s): if type(s) is bytes: return s elif type(s) is str or (sys.version_info[0] < 3 and type(s) is unicode): return codecs.encode(s, 'utf-8') else: raise TypeError("Expected bytes or string, but got %s." % type(s)) def to_str(s): if type(s) is bytes: return codecs.decode(s, 'utf-8') elif type(s) is str or (sys.version_info[0] < 3 and type(s) is unicode): return s else: raise TypeError("Expected bytes or string, but got %s." % type(s)) def cmp(a, b): return (a > b) - (a < b)