#!/usr/bin/python # -*- coding: utf8 -*- import os, re, cPickle from config import dir, odir from shutil import copyfile debug = 0 # Read watch file for upstream updates [FG] watch = {} if os.path.exists(dir + "/watch.txt"): f = open(dir + "/watch.txt") while 1: line = f.readline() if not line: break #eof line = line.strip() try: (package, version) = line.split(' ',2) watch[package] = {'version': version, 'new': 0, 'warning': "", 'url': ""} except ValueError: pass f.close() f = open(odir + "/sources_done", "r") sources = cPickle.load(f) for key in sources.keys(): (package, version, dist) = key.split('_') if dist != "unstable" and dist != "experimental": continue if not watch.has_key(package): continue # print "doing " + package + " " + version g = os.popen("/usr/bin/dpkg --compare-versions %s gt %s" % (version, watch[package]['version'])) if g.close() == None: watch[package]['version'] = version f.close() # now try to run uscan in a tmp dir with a bogus changelog sorted = watch.keys() sorted.sort() for pkg in sorted: has_warning = 0 tmpdir = os.tempnam('/tmp', 'PTS_') #ok, insecure blahblah tmpdir = tmpdir + '/' os.mkdir(tmpdir) os.mkdir(tmpdir + 'debian') #our faked debian/ dir hash = pkg[0] if pkg[0:3] == "lib": hash = pkg[0:4] if debug: print "%s/%s/%s/watch" % (odir, hash, pkg) copyfile("%s/%s/%s/watch" % (odir, hash, pkg), tmpdir + 'debian/watch') fch = open(tmpdir + 'debian/changelog', 'w+') fch.write( """%s (%s) unstable; urgency=low * this is a fake entry -- PTS watch update Sat, 11 Jan 2003 17:56:41 +0100 """ % (pkg, watch[pkg]['version']) ) fch.close() curdir = os.getcwd() os.chdir(tmpdir) uscan = os.popen("/usr/bin/uscan --no-download 2>&1") for line in uscan.readlines(): if debug: print line r = re.search("Warning: (.*)", line) if r: has_warning = 1 watch[pkg]['warning'] = watch[pkg]['warning'] + r.group(1) if has_warning and line.startswith(" "): # warning lines seem to be 2space-indented watch[pkg]['warning'] = watch[pkg]['warning'] + line m = re.search("Newer version \((\S+)\) available", line) if m and not has_warning: if m.group(1) > 0: watch[pkg]['new'] = m.group(1) uscan.close() if watch[pkg]['new'] > 0: # extract url from debian/watch file url = '' # TODO: handle continued lines for line in file(tmpdir + 'debian/watch', 'r').readlines(): if line.startswith('#'): continue if line.startswith('http:') or line.startswith('ftp') or line.count('.') >= 1: if debug: print "ORIGINAL LINE: " + line line = line.strip() fields = re.split('\s+', line) if os.path.basename(fields[0]).count('.') == 1: # this is a page like download.html url = os.path.dirname(fields[0]) + '/' else: url = fields[0] for field in fields[1:]: if field.count('/') >= 1: if not field.endswith('/'): field = field + '/' if not field.startswith('/'): field = '/' + field url = url + field elif field.count('(') == 1: url = url + field # experimental code, maybe better # if line.startswith('#') or line.startswith('version'): continue # # fields = re.split('\s+', line) # for i in range(len(fields)): # if fields[i].startswith('opts='): continue # print "SCANSIONO: " + fields[i] # # if i == 0: # initial URL # url = url + fields[i] # if os.path.basename(url).count('.') == 1: break # this is a page like download.html # elif fields[i].count('(') or fields[i].count(')'): # if url.endswith('/'): url = url + fields[i] # else: url = url + '/' + fields[i] # elif os.path.basename(fields[i]).count('.') == 1: # this is a page like download.html # url = url + fields[i] # break # elif fields[i].count('/') >= 1: # if not fields[i].endswith('/'): fields[i] = fields[i]+ '/' # if not fields[i].startswith('/'): fields[i] = '/' + fields[i] # url = url + fields[i] url = url.replace('\\', '') url = url.replace('.*', '') url = url.replace('///', '/') if url.startswith('ftp.'): url = 'ftp://' + url elif not url.startswith('http://') and not url.startswith('ftp://'): url = 'http://' + url watch[pkg]['url'] = re.sub('\(.*\)', watch[pkg]['new'], url) if debug: print "UPSTREAM PAGE: " + watch[pkg]['url'] if has_warning: print "WARNING: " + watch[pkg]['warning'].replace('\n', ' ') else: print "new version %s for package %s" % (watch[pkg]['new'], pkg) os.chdir(curdir) os.remove(tmpdir + 'debian/watch') os.remove(tmpdir + 'debian/changelog') os.removedirs(tmpdir + 'debian') f = open(odir + "/watch_done", "w") cPickle.dump(watch, f, 0) f.close()