#!/usr/bin/python import os, os.path, sys, urllib, subprocess, shutil def retrieve_file(url): '''Download file (by URL) to the current directory. If the file is already present, this function does nothing.''' fname = os.path.basename(url) if not os.path.exists(fname): print 'downloading', url urllib.urlretrieve(url, fname) def cur_version(sourcepkg, release): madison = subprocess.Popen(['apt-cache', 'madison', sourcepkg], stdout=subprocess.PIPE) out = madison.communicate()[0] assert (madison.returncode == 0) for l in out.splitlines(): (pkg, version, aptsrc) = l.split('|') if aptsrc.endswith('Sources') and aptsrc.find(release) > 0: return version.strip() raise Exception('apt-cache madison does not contain %s/%s' % (sourcepkg, release)) def dsc_getfiles(dsc): '''Return list of files in a .dsc file (excluding the .dsc file itself).''' f = open(dsc) files = [] # skip until 'Files:' for l in f: if l.strip() == 'Files:': break for l in f: if l.strip() == '': break if not l.startswith(' '): break fname = l.split()[2] if not fname.endswith('.dsc'): files.append(fname) f.close() return files # # entry point # if len(sys.argv) != 3: print 'Usage: syncpackage <.dsc URL or path> ' sys.exit (1) (dscurl, release) = sys.argv[1:] dscname = os.path.basename(dscurl) basepath = os.path.dirname(dscurl) (srcpkg, new_ver) = dscname.split('_') new_ver = new_ver[:-4] # strip off '.dsc' cur_ver = cur_version(srcpkg, release) retrieve_file(dscurl) files = dsc_getfiles(dscname) # do we need the orig.tar.gz? need_orig = True if cur_ver.find('-') > 0 and new_ver.find('-') > 0 and \ cur_ver.split('-')[0] == new_ver.split('-')[0]: need_orig = False #files = [f for f in files if not f.endswith('orig.tar.gz')] print 'Source %s: current version %s, new version %s' % (srcpkg, cur_ver, new_ver) print 'needs orig.tar.gz', need_orig print 'Files:', files for f in files: retrieve_file(os.path.join(basepath, f)) uidx = cur_ver.find('ubuntu') if uidx > 0: cur_ver = cur_ver[:uidx] print 'WARNING! Overwriting modified Ubuntu version, setting current version to', cur_ver uidx = cur_ver.find('build') if uidx > 0: cur_ver = cur_ver[:uidx] orig_arg = '' if need_orig: orig_arg = '-sa' # extract package, build Source assert subprocess.call(['dpkg-source', '-x', dscname]) == 0 os.chdir(srcpkg + '-' + new_ver.split('-')[0]) assert subprocess.call("dpkg-genchanges -q -S %s -v%s -e\"$(getent passwd $(id -u)|cut -f5 -d:|cut -f1 -d,) <$DEBEMAIL>\" | \ sed 's/^Distribution:.*$/Distribution: %s/; 1 i\Origin: debian/unstable' > ../%s_%s_source.changes" % (orig_arg, cur_ver, release, srcpkg, new_ver), shell=True) == 0 os.chdir('..') shutil.rmtree(srcpkg + '-' + new_ver.split('-')[0], True) assert subprocess.call("debsign %s_%s_source.changes" % (srcpkg, new_ver), shell=True) == 0