The debdiff a.
diff -Nru debdelta-0.50+2/debdelta debdelta-0.55/debdelta --- debdelta-0.50+2/debdelta 2012-11-07 11:09:14.000000000 +0100 +++ debdelta-0.55/debdelta 2014-11-30 18:31:13.000000000 +0100 @@ -62,6 +62,7 @@ possible values are: xdelta xdelta-bzip xdelta3 bsdiff -M Mb maximum memory to use (for 'bsdiff' or 'xdelta') --clean-deltas delete deltas if newer deb is not in archive +--cache cache parsed version of Packages.bz2 as Packages.debdelta_cache """) ## implement : --search search in the directory of the above debs for older versions @@ -119,13 +120,23 @@ #################################################################### -import sys , os , tempfile , string ,getopt , tarfile , shutil , time, traceback, ConfigParser, subprocess, time, tarfile, stat, hashlib, random +import sys , os , tempfile , string ,getopt , tarfile , shutil , time, traceback, ConfigParser, subprocess, time, tarfile, stat, hashlib, random, gzip + +try: + import debian.deb822 + debian_deb822 = debian.deb822 +except ImportError: + debian_deb822 = None + +import cPickle as pickle from stat import ST_SIZE, ST_MTIME, ST_MODE, S_IMODE, S_IRUSR, S_IWUSR, S_IXUSR from os.path import abspath, expanduser from copy import copy -from types import StringType, UnicodeType, FunctionType, TupleType, ListType, DictType +from types import FunctionType + +string_types = (str, unicode) # change this for python3 def get_termsize(): import termios, fcntl, struct @@ -208,6 +219,8 @@ DO_PREDICTOR = False +DO_CACHE = False #cache parsed version of Packages.bz2 as Packages.debdelta_cache + #see README.features DISABLEABLE_FEATURES=['xz', 'lzma', 'xdelta3-fifo'] DISABLED_FEATURES=[] @@ -217,7 +230,10 @@ DPKG_MULTIARCH=( 0 == os.system('dpkg --assert-multi-arch 2> /dev/null') ) -if os.path.dirname(sys.argv[0]) == '/usr/lib/apt/methods' : + +if __name__ != "__main__": + action = None +elif os.path.dirname(sys.argv[0]) == '/usr/lib/apt/methods' : action = None else: action=(os.path.basename(sys.argv[0]))[3:] @@ -238,7 +254,7 @@ ( opts, argv ) = getopt.getopt(sys.argv[1:], 'vkhdM:n:A' , ('help','info','needsold','dir=','no-act','alt=','old=','delta-algo=', 'max-percent=','deb-policy=','clean-deltas','clean-alt','no-md5','debug','forensicdir=','forensic=', - 'signing-key=', "accept-unsigned", "gpg-home=", "disable-feature=", "test", "format=") ) + 'signing-key=', "accept-unsigned", "gpg-home=", "disable-feature=", "test", "format=","cache") ) except getopt.GetoptError,a: sys.stderr.write(sys.argv[0] +': '+ str(a)+'\n') raise SystemExit(3) @@ -328,6 +344,7 @@ sys.stderr.write(_("Error: output format `%s' is unknown.") % v + '\n') raise SystemExit(3) DEB_FORMAT=v + elif o == '--cache': DO_CACHE=True else: sys.stderr.write(_("Error: option `%s' is unknown, try --help") % o + '\n') raise SystemExit(3) @@ -346,6 +363,11 @@ print ' Warning, /proc not mounted, using bogus BOGOMIPS' BOGOMIPS=3000.0 +SP=subprocess.Popen(['hostname','-f'], shell=False, stdout=subprocess.PIPE) +HOSTID=hashlib.md5( SP.stdout.read() ).hexdigest() +SP.wait() +del SP + TMPDIR = ( os.getenv('TMPDIR') or '/tmp' ).rstrip('/') if KEEP: @@ -376,7 +398,7 @@ #################################################### various routines def my_popen_read(cmd): - return subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout + return subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stdin=open(os.devnull), close_fds=True).stdout def freespace(w): assert(os.path.exists(w)) @@ -478,6 +500,88 @@ p.close() return ar_list + + +class cache_sequence(object): + cache_filename=None + cache=None + exists=None + broken=None + def __init__(self, filename): + "manages a cache file that store a sequence of python object" + self.cache_filename=os.path.splitext(filename)[0]+'.debdelta_cache' + self.cache=None + self.broken=None + self.exists=os.path.isfile(self.cache_filename) and \ + os.path.getmtime(filename) < os.path.getmtime(self.cache_filename) + + def __iter__(self): + assert self.exists and not self.cache + self.cache=gzip.GzipFile(self.cache_filename) + return self + + def next(self): + assert self.cache + try: + return pickle.load(self.cache) + except EOFError: + self.cache=None + raise StopIteration + except Exception, e: + print 'Cache file is broken (%r), deleting %r' % (e, self.cache_filename) + if ACT: os.unlink(self.cache_filename) + self.cache=None + self.broken=True + # do not kill program + raise StopIteration + + def __prepare_for_write__(self): + if not self.cache: + if DEBUG: print ' Creating cache file :', self.cache_filename + self.cache=gzip.GzipFile(self.cache_filename,'w') + + def close(self): + if self.cache: + try: + self.cache.close() + except Exception,e: + print 'Cannot close the cache file (%r)' % (self.cache_filename,) + self.broken=True + try: + self.cache=None + except: + pass + + __del__=close + + def write(self,s): + " write one object" + assert not self.exists + if self.broken: + return + self.__prepare_for_write__() + try: + self.cache.write(pickle.dumps(s)) + except Exception,e: + print 'Cannot write to cache file (%r), deleting %r' % (e, self.cache_filename) + self.close() + if ACT: os.unlink(self.cache_filename) + self.broken=True + +class cache_same_dict(cache_sequence): + "cache occurrences of a dict that uses always the same keys; omit the keys to optimize" + def __init__(self, filename, keys): + super(cache_same_dict, self).__init__(filename) + self.keys=keys + + def write(self, s): + n=[s[k] for k in self.keys] + super(cache_same_dict, self).write(n) + + def next(self): + n=super(cache_same_dict, self).next() + return dict(map(lambda x,y: (x,y) , self.keys, n)) # dict comprehension may be used instead + ##################################################################### ALLOWED = '<>()[]{}.,;:!_-+/ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' @@ -499,7 +603,7 @@ """ def prepare_for_echo__(s): - assert ( type (s) == StringType ) + assert ( type (s) in string_types ) r='' shortquoted=False for a in s: @@ -587,7 +691,7 @@ # Subclasses that define an __init__ must call Exception.__init__ # or define self.args. Otherwise, str() will fail. def __init__(self,s,retriable=False,exitcode=None,logs=None): - assert(type(s) == StringType) + assert(type(s) in string_types) self.retriable = retriable if retriable: self.args=(s + ' (retriable) ',) @@ -603,13 +707,13 @@ def die(s): #if s : sys.stderr.write(s+'\n') - assert(type(s) == StringType) - raise DebDeltaError,s + assert type(s) in string_types + raise DebDeltaError(s) def system(a,TD,saveargs=None,ignore_output=False,return_output=False): "a must be a tuple, TD the temporary directory ; if return_output , it will return (stdout,stderr,exitcode) regardless" - assert type(a) in (ListType, TupleType) + assert type(a) in (list, tuple) # mvo: compat with python2.5 where tuple does not have index a = list(a) if VERBOSE and TD[: (len(TMPDIR)+9) ] != TMPDIR+'/debdelta' : @@ -623,10 +727,10 @@ pros=[] while '|' in a: l=a.index('|') ; a1=a[:l] ; a=a[l+1:] - p=subprocess.Popen(args=a1,stdin=old_stdin,stdout=subprocess.PIPE,stderr=temp_err_fd,cwd=TD) + p=subprocess.Popen(args=a1, stdin=old_stdin, stdout=subprocess.PIPE, stderr=temp_err_fd, cwd=TD, close_fds=True) pros.append( p ) old_stdin=p.stdout - final_pro= subprocess.Popen(args=a,stdin=old_stdin,stdout=temp_fd,stderr=temp_err_fd,cwd=TD) + final_pro= subprocess.Popen(args=a, stdin=old_stdin, stdout=temp_fd, stderr=temp_err_fd, cwd=TD, close_fds=True) for p in pros: p.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. pros.append(final_pro) @@ -699,19 +803,24 @@ ################################################################### GPG -if GPG_HOME: - GPG_BASE_CMD_LINE=[GPG_CMD,"--homedir",GPG_HOME] -else: - GPG_BASE_CMD_LINE=[GPG_CMD,"--keyring",GPG_MASTER_PUB_KEYRING] +def gpg_base_commandline(): + if GPG_HOME: + GPG_BASE_CMD_LINE=[GPG_CMD,"--homedir",GPG_HOME] + else: + GPG_BASE_CMD_LINE=[GPG_CMD,"--keyring",GPG_MASTER_PUB_KEYRING] + + if VERBOSE < 1 : + GPG_BASE_CMD_LINE+=['--quiet'] + + return GPG_BASE_CMD_LINE -if VERBOSE < 1 : - GPG_BASE_CMD_LINE+=['--quiet'] +def gpg_sign_command(): + return gpg_base_commandline()+["--batch","--armor","--clearsign","--default-key",GPG_SIGNING_KEY,"--sign"] -GPG_SIGN=GPG_BASE_CMD_LINE+["--batch","--armor","--clearsign","--default-key",GPG_SIGNING_KEY,"--sign"] def compute_md5_len(o): "hash the file using MD5. 'o' may be a string (in which case the file is opened) or a file type; returns MD5 and length" - if type(o) in (StringType, UnicodeType): + if type(o) in string_types: o = open(o) m=hashlib.md5() a=o.read(1024) @@ -756,8 +865,8 @@ (temp_fd, temp_name) = tempfile.mkstemp(prefix="debdelta_gpg_verified") #(read_end, write_end) = os.pipe() - p=subprocess.Popen(GPG_BASE_CMD_LINE+['--batch','--status-fd',"2",'--output',"-",signature], - stdout=subprocess.PIPE,stderr=temp_fd) + p=subprocess.Popen(gpg_base_commandline() + ['--batch','--status-fd',"2",'--output',"-",signature], + stdout=subprocess.PIPE, stderr=temp_fd, stdin=open(os.devnull), close_fds=True) r=_verify_signature_no_gpg(p.stdout, DIR, role) p.wait() @@ -842,7 +951,7 @@ TD = abspath(tempfile.mkdtemp(prefix='debdelta',dir=TMPDIR)) try: _write_signature(db,TD+'/_temp',role) - p=subprocess.Popen(GPG_SIGN+['--output',TD+'/_gpg'+role,TD+'/_temp']) + p=subprocess.Popen(gpg_sign_command() +['--output',TD+'/_gpg'+role,TD+'/_temp'], stdin=open(os.devnull), close_fds=True) p.wait() if p.returncode==0: r=system(("ar","qS",delta,TD+"/_gpg"+role),TD) @@ -962,7 +1071,7 @@ ########### other auxiliary routines def patch_check_tmp_space(params,olddeb): - if type(params) != DictType: + if type(params) != dict: params=info_2_db(params) if 'NEW/Installed-Size' not in params or 'OLD/Installed-Size' not in params: print '(Warning... Installed size unknown...)' @@ -1147,7 +1256,7 @@ def sha1_hash_file(f): s=hashlib.sha1() - if type(f) == StringType: + if type(f) in string_types: f=open(f) a=f.read(1024) while a: @@ -1594,7 +1703,7 @@ #unfortunately 'prelink -o' sometimes alters files, see http://bugs.debian.org/627932 shutil.copy2(divert, tmpcopy) proc=subprocess.Popen(["/usr/sbin/prelink","-u",tmpcopy],stdin=open(os.devnull),\ - stdout=subprocess.PIPE,stderr=subprocess.STDOUT) + stdout=subprocess.PIPE,stderr=subprocess.STDOUT,close_fds=True) out=proc.stdout.read().strip() proc.wait() if proc.returncode: @@ -2648,9 +2757,10 @@ if DEBUG > 1 : script.md5_check_file(o, compute_md5(TD+o)) - def guess_xz_parameters(o): - "tries to guess the parameters used to compress ; uses lock " - par=None + def guess_xz_parameters(o, check=True): + "tries to guess the parameters used to compress, returns a string of options ; if check=True and it fails, returns False " + par='' + crc='' z=tempfile.NamedTemporaryFile(suffix='.xz',delete=False) #unfortunately 'xz --list' does not work on pipes! shutil.copyfileobj(o,z) @@ -2662,13 +2772,51 @@ for a in b.stdout: a=a.rstrip('\n') a=string.split(a,'\t') - #print '------ ',a if a[0]=='block': - if par and par != a[16]: - print " warning : this xz -- compressed file was compressed with variable blocks options ?! '%s' ~= '%s'" & (par,a[16]) - par=a[-1] + if crc and crc != a[9]: + print " warning : this xz -- compressed file was compressed with variable blocks crc ?! '%s' != '%s'" & (crc,a[9]) + crc=a[9] + if par and par != a[15]: + print " warning : this xz -- compressed file was compressed with variable blocks options ?! '%s' != '%s'" & (par,a[15]) + par=a[15] + #print ' guessed par crc ',par,crc + if crc: + crc=crc.lower() + if crc=='sha-256': crc='sha256' + if crc not in ('crc32','crc64','sha256'): + print ' Unknown XZ crc ',crc + crc='' + PARS=['-6e','-9','-9e'] + if par: + PARS.append(par) + if check: + redo=True + while redo and PARS: + par=PARS.pop() + y=subprocess.Popen(['unxz','-c',z.name],stdout=subprocess.PIPE) + w=['xz','-c'] + if par: + w.append(par) + if crc: + w+=['-C',crc] + w.append('-') + if VERBOSE > 2 : print ' Testing XZ options ',w + w=subprocess.Popen(w,stdin=y.stdout,stdout=subprocess.PIPE,close_fds=True) + y.stdout.close() + redo=False + c=subprocess.Popen(['cmp','-',z.name],stdin=w.stdout,stdout=open(os.devnull,'w'),close_fds=True) + w.stdout.close() + if c.wait() : + redo=True + if VERBOSE or DEBUG : print ' Tried XZ options but failed: ',par,crc + if redo and not PARS: + #print ' HO FINITO LE OPZIONI !' + os.unlink(z.name) + return False + if crc: + crc=' -C '+crc os.unlink(z.name) - return par + return par+crc ########### helper sh functions for script, for delta_tar() @@ -2741,9 +2889,9 @@ def files_similarity_score(oo,nn): if oo == nn : return 0 - if type(oo) == StringType: + if type(oo) in string_types: oo=file_similarity_premangle(oo) - if type(nn) == StringType: + if type(nn) in string_types: nn=file_similarity_premangle(nn) return files_similarity_score__(oo,nn) @@ -2786,13 +2934,13 @@ skip=[], old_md5={}, new_md5={},\ chunked_p=(not delta_uses_infifo) ,debdelta_conf_skip=()): " compute delta of two tar files, and prepare the script consequently" - assert( type(old_filename) == StringType or type(old_filename) == FunctionType ) + assert( type(old_filename) in string_types or type(old_filename) == FunctionType ) script.write('ECR () { $E "$1" ; $E "${FTH}" ; cat OLD/'+CWD+'/"$1" ; rm OLD/'+CWD+'/"$1" ;}\n') script.write('EC () { $E "$1" ; $E "${FTH}" ; cat OLD/'+CWD+'/"$1" ;}\n') ###### uncompress and scan the old tar file, extract regular files - if type(old_filename) == StringType : + if type(old_filename) in string_types : (old_filename,old_filename_ext) = unzip(old_filename) oldtar = tarfile.open(TD+old_filename, "r") else: @@ -2845,7 +2993,7 @@ [hash_to_hex(sha1_hash_file(os.path.join(TD,"OLD",CWD,oldname)))]) oldtar.close() - if type(old_filename) == StringType : + if type(old_filename) in string_types : unlink(TD+old_filename) else: while oldfileobj.read(512): @@ -3196,6 +3344,15 @@ script.end_member() elif not NEEDSOLD and name[:8] == 'data.tar' : script.start_member(ar_line, newname, extrachar) + # + if 'data.tar.lzma' == name : + info_append('needs-lzma') + elif 'data.tar.xz' == name : + info_append('needs-xz') + script.xz_parameters=guess_xz_parameters(my_popen_read('cd '+TD+'; ar p NEW.file data.tar.xz')) + if script.xz_parameters==False: + raise DebDeltaError('Cannot guess XZ parameters') + # if 'data.tar.gz' in ar_list_old : def x(): return my_popen_read('cd '+TD+'; ar p OLD.file data.tar.gz | gzip -cd') @@ -3208,7 +3365,6 @@ return my_popen_read('cd '+TD+'; ar p OLD.file data.tar.lzma | unlzma -c') elif 'data.tar.xz' in ar_list_old : info_append('needs-xz') - script.xz_parameters=guess_xz_parameters(my_popen_read('cd '+TD+'; ar p NEW.file data.tar.xz')) def x(): return my_popen_read('cd '+TD+'; ar p OLD.file data.tar.xz | unxz -c') else: assert(0) @@ -3330,10 +3486,6 @@ else: assert 'lopadf' == 0 except ImportError: raise DebDeltaError('python module "apt_pkg" is missing. Please install python-apt', retriable=True) - - f=my_popen_read('hostname -f') - HOSTID=hashlib.md5( f.read() ).hexdigest() - f.close() info_by_pack_arch={} @@ -3343,11 +3495,14 @@ if (pack,arch) not in info_by_pack_arch : info_by_pack_arch[ (pack,arch) ]=[] info_by_pack_arch[ (pack,arch) ].append( f ) - - def iterate_Packages(packages): + + def iterate_Packages(packages, use_debian_822=True): + fields=('Package','Architecture','Version','Filename') + for f in fields: intern(f) + packages=abspath(packages) assert os.path.isfile(packages) - assert os.path.basename(packages) in ('Packages', 'Packages.gz','Packages.bz2') + assert os.path.basename(packages) in ('Packages', 'Packages.gz','Packages.bz2','Packages.xz') dir=os.path.dirname(packages) dir=dir.split('/') try: @@ -3356,12 +3511,41 @@ sys.stderr.write('Error: pathname "%s" does not contain "dists"\n' % packages) return base = string.join(dir[:a],'/') + # + cache=cache_same_dict(packages, fields) + if DO_CACHE and cache.exists: + for i in cache: + i['Basepath'] = base + yield i + if not cache.broken: + return + # if packages[-3:] == '.gz': - F=subprocess.Popen(["zcat",packages],stdout=subprocess.PIPE).stdout + import gzip + F=gzip.GzipFile(packages) + SP=None elif packages[-4:] == '.bz2': - F=subprocess.Popen(["bzcat",packages],stdout=subprocess.PIPE).stdout + import bz2 + F=bz2.BZ2File(packages) + SP=None + elif packages[-3:] == '.xz': + SP=subprocess.Popen(["xzcat",packages], stdout=subprocess.PIPE, stdin=open(os.devnull), close_fds=True) + F=SP.stdout else: F=open(packages) + SP=None + # + if debian_deb822 and use_debian_822: #use faster implementation + #P=debian_deb822.Packages(F,fields=fields) + for a in debian_deb822.Packages.iter_paragraphs(sequence=F,shared_storage=False,fields=fields): + if DO_CACHE and not cache.exists: cache.write(a) + a['Basepath'] = base + yield a + if SP: + F.read() + SP.wait() + return + # of,pack,vers,arch=None,None,None,None for l in F: l=l.rstrip('\n') @@ -3381,16 +3565,20 @@ if VERBOSE > 2 : print ' skip udeb: ' continue a={} - a['Basepath'] = base a['Filename'] = of a['Package'] = pack a['Architecture'] = arch a['Version'] = vers + if DO_CACHE and not cache.exists: cache.write(a) + a['Basepath'] = base yield a of,pack,vers,arch=None,None,None,None + if SP: + F.read() + SP.wait() def scan_deb_dir(d, debname, label, lazy): - assert (debname == None or type(debname) == StringType) and type(label) == StringType + assert (debname == None or type(debname) in string_types) and type(label) in string_types if not os.path.isdir(d): print 'Error, skip non dir:',d return @@ -3444,7 +3632,7 @@ if VERBOSE > 2 and DEBUG : print ' No such delta dir: ',d scanned_delta_dirs.add((d,None)) #trick, if aint there no need to retry return - assert debname == None or type(debname) == StringType + assert debname == None or type(debname) in string_types scanned_delta_dirs.add((d,debname)) for n in os.listdir(d): if debname != None and debname != n.split('_')[0]: @@ -3682,6 +3870,7 @@ oldn = newest generated=0 + seen_versions=[] while (oldn>0) : oldn -= 1 @@ -3725,6 +3914,12 @@ if VERBOSE > 1 : print ' Skip , already exists: ',delta continue + if old['Package'] in seen_versions: + if VERBOSE > 3 : print ' Skip , already considered: ',delta + continue + + seen_versions.append(old['Package']) + if os.path.exists(delta+'-too-big'): if VERBOSE > 1 : print ' Skip , tried and too big: ',delta continue @@ -3980,7 +4175,7 @@ original_cwd = os.getcwd() - import thread, threading, Queue, pickle, urllib2, fcntl, atexit, signal + import thread, threading, Queue, urllib2, fcntl, atexit, signal proxies=urllib2.getproxies() if VERBOSE and proxies: diff -Nru debdelta-0.50+2/debian/changelog debdelta-0.55/debian/changelog --- debdelta-0.50+2/debian/changelog 2012-11-07 13:33:08.000000000 +0100 +++ debdelta-0.55/debian/changelog 2014-11-30 18:31:13.000000000 +0100 @@ -1,3 +1,29 @@ +debdelta (0.55) unstable; urgency=medium + + * update git location + * add debian backports to sources.conf + + -- A Mennucc1 <mennu...@debian.org> Sun, 30 Nov 2014 18:30:51 +0100 + +debdelta (0.54) unstable; urgency=medium + + * [INTL:pt] Portuguese translation, thanks to Américo Monteiro + (Closes: #760731). + * bump standards version to 3.9.6.0 + * debian/rules : add build-arch, build-indep + * add new keys into keyring + * import some code from GIT server branch + + -- A Mennucc1 <mennu...@debian.org> Sun, 30 Nov 2014 17:00:39 +0100 + +debdelta (0.53) experimental; urgency=low + + * merge changes uploaded in wheezy, and changelogs as well + * Bug fix: "owned and unowned files after purge (policy 6.8 + 10.7.3)", + thanks to Holger Levsen (Closes: #617481). + + -- A Mennucc1 <mennu...@debian.org> Sun, 02 Dec 2012 18:52:15 +0100 + debdelta (0.50+2) unstable; urgency=high * debdelta-upgrade: uses incorrect URL when requesting @@ -8,12 +34,26 @@ -- A Mennucc1 <mennu...@debian.org> Wed, 07 Nov 2012 13:31:31 +0100 +debdelta (0.52) experimental; urgency=low + + * debpatch, debdelta-upgrade : do not get confused by broken symlinks + * enable hardening flags + + -- A Mennucc1 <mennu...@debian.org> Fri, 02 Nov 2012 10:08:46 +0100 + debdelta (0.50+1) unstable; urgency=high * debpatch, debdelta-upgrade : do not get confused by broken symlinks * enable hardening flags -- A Mennucc1 <mennu...@debian.org> Wed, 31 Oct 2012 10:40:46 +0100 + +debdelta (0.51) experimental; urgency=low + + * debdelta, debdeltas: XZ parameter autodetection, detect CRC choice + and compression + + -- A Mennucc1 <mennu...@debian.org> Wed, 12 Sep 2012 16:34:53 +0200 debdelta (0.50) unstable; urgency=medium diff -Nru debdelta-0.50+2/debian/control debdelta-0.55/debian/control --- debdelta-0.50+2/debian/control 2011-12-06 13:59:12.000000000 +0100 +++ debdelta-0.55/debian/control 2014-11-30 18:31:13.000000000 +0100 @@ -3,14 +3,14 @@ Priority: optional Build-Depends: zlib1g-dev, libbz2-dev Maintainer: A Mennucc1 <mennu...@debian.org> -Standards-Version: 3.9.1.0 +Standards-Version: 3.9.6.0 Homepage: http://debdelta.debian.net -Vcs-git: http://debdelta.debian.net/debdelta-suite.git +Vcs-git: git://anonscm.debian.org/collab-maint/debdelta.git Package: debdelta Architecture: any Depends: python, bzip2, binutils, ${shlibs:Depends} -Recommends: python-apt, xdelta3, xdelta, lzma, xz-utils, xdelta, bsdiff, gnupg2, gnupg-agent +Recommends: python-apt, xdelta3, xdelta, lzma, xz-utils, xdelta, bsdiff, gnupg2, gnupg-agent, python-debian Conflicts: xdelta3 (<< 0y.dfsg-1) Enhances: cupt Suggests: debdelta-doc diff -Nru debdelta-0.50+2/debian/postinst debdelta-0.55/debian/postinst --- debdelta-0.50+2/debian/postinst 2011-03-31 11:32:26.000000000 +0200 +++ debdelta-0.55/debian/postinst 2014-11-30 18:31:13.000000000 +0100 @@ -1,19 +1,47 @@ -#!/bin/sh -e +#!/bin/sh + +set -e + +umask 0077 GPG_MASTER_PUB_KEYRING="/usr/share/keyrings/debian-debdelta-archive-keyring.gpg" GPG_HOME="/etc/debdelta/gnupg" +sha1it () { + ( + cd ${GPG_HOME} + echo '#if this file is deleted or it does not match, then ' > sha1_hashes.txt + echo '# these files will not be removed when purging "debdelta" ' >> sha1_hashes.txt + sha1sum pubring.gpg secring.gpg >> sha1_hashes.txt + if test -f trustdb.gpg ; then sha1sum trustdb.gpg >> sha1_hashes.txt ; fi + ) +} + +check1it () { + ( + cd ${GPG_HOME} + test -f sha1_hashes.txt && sha1sum -c --quiet sha1_hashes.txt + ) +} + case "$1" in configure|reconfigure) if test ! -r ${GPG_HOME} ; then + echo "Debdelta: creating ${GPG_HOME}" + mkdir ${GPG_HOME} + fi + if test ! -r ${GPG_HOME}/pubring.gpg -a \ + ! -r ${GPG_HOME}/secring.gpg ; then echo "Debdelta: creating keyrings in ${GPG_HOME}" - mkdir ${GPG_HOME} - chmod 0700 ${GPG_HOME} - touch ${GPG_HOME}/secring.gpg ${GPG_HOME}/pubring.gpg - chmod 0600 ${GPG_HOME}/secring.gpg ${GPG_HOME}/pubring.gpg + touch ${GPG_HOME}/secring.gpg ${GPG_HOME}/pubring.gpg + sha1it else echo "Debdelta: updating public keyring in ${GPG_HOME}" fi - gpg --no-tty --batch --no-options --no-auto-check-trustdb --homedir ${GPG_HOME} --import ${GPG_MASTER_PUB_KEYRING} || true + + c=0 ; if check1it ; then c=1 ; fi + gpg --no-tty --batch --no-options --no-auto-check-trustdb --homedir ${GPG_HOME} --import ${GPG_MASTER_PUB_KEYRING} || true + if test $c = 1 ; then sha1it ; fi + ;; esac diff -Nru debdelta-0.50+2/debian/postrm debdelta-0.55/debian/postrm --- debdelta-0.50+2/debian/postrm 2011-03-31 11:32:26.000000000 +0200 +++ debdelta-0.55/debian/postrm 2014-11-30 18:31:13.000000000 +0100 @@ -3,32 +3,28 @@ GPG_HOME=/etc/debdelta/gnupg +check1it () { + ( + cd ${GPG_HOME} + test -f sha1_hashes.txt && sha1sum -c --quiet sha1_hashes.txt + ) +} + if [ "$1" = purge ] ; then if [ -r /var/lib/debdelta ] ; then rm -r /var/lib/debdelta fi - if test -f "${GPG_HOME}/secring.gpg" ; then - if test -s "${GPG_HOME}/secring.gpg" ; then - echo debdelta: does not delete nonempty ${GPG_HOME}/secring.gpg - else - rm ${GPG_HOME}/secring.gpg - fi - fi - - if test -f "${GPG_HOME}/pubring.gpg" ; then - if echo "4509b7260dc7aee6ec8dac68263bc662 ${GPG_HOME}/pubring.gpg" | md5sum -c --quiet ; then - rm ${GPG_HOME}/pubring.gpg - else - echo debdelta: does not delete modified ${GPG_HOME}/pubring.gpg - fi + if check1it ; then + ( + cd ${GPG_HOME} + rm -f pubring.gpg secring.gpg trustdb.gpg + if test -f pubring.gpg~ ; then + rm -f pubring.gpg~ + fi + rm -f sha1_hashes.txt + ) + rmdir ${GPG_HOME} || true fi - if test -f "${GPG_HOME}/pubring.gpg~" ; then - rm ${GPG_HOME}/pubring.gpg~ - fi - - #unfortunately I could not spot a good way to detect if the - # trustdb does contain useful info - fi diff -Nru debdelta-0.50+2/debian/rules debdelta-0.55/debian/rules --- debdelta-0.50+2/debian/rules 2012-11-02 09:56:49.000000000 +0100 +++ debdelta-0.55/debian/rules 2014-11-30 18:31:13.000000000 +0100 @@ -32,10 +32,14 @@ minigzip: minigzip.c $(CC) $(CFLAGS) $(CPPFLAGS) minigzip.c -o minigzip $(LDFLAGS) -lz -build: minibzip2 minigzip +build-arch: minibzip2 minigzip $(checkdir) touch build +build-indep: + +build: build-arch build-indep + clean: $(checkdir) rm -f build *~ */*~ debian/files* debian/substvars diff -Nru debdelta-0.50+2/etc/sources.conf debdelta-0.55/etc/sources.conf --- debdelta-0.50+2/etc/sources.conf 2011-03-31 11:32:26.000000000 +0200 +++ debdelta-0.55/etc/sources.conf 2014-11-30 18:31:13.000000000 +0100 @@ -23,6 +23,11 @@ Label=Debian delta_uri=http://debdeltas.debian.net/debian-deltas +[backports debian archive] +Origin=Debian Backports +Label=Debian Backports +delta_uri=http://debdeltas.debian.net/debian-deltas + [stable security debian archive] Origin=Debian
signature.asc
Description: Digital signature