#!/bin/sh # # dpkgdiff - diff a file against the version found in its Ubuntu package # # $Id$ me=`basename $0` Ehm() { echo $me: "$@" >&2; } Die() { Ehm "$@"; exit 1; } HaveExecutable() { for f in "$@" do type "$f" >/dev/null || Die Required executable not found: $f done } HaveExecutable dpkg realpath mktemp makeorig=0 diffopts= while [ $# -gt 0 ] do case "$1" in -o) makeorig=1; shift;; -*) diffopts="$diffopts $1"; shift;; *) break;; esac done PlainFilesIn() { for f in "$@" do r=`realpath "$f"` if [ -z "$r" ] then Ehm empty argument, skipped: $r elif [ ! -f "$r" ] then Ehm not a plain file, skipped: $r else echo "$f" fi done } WithProvidingPackage() # given a list of files, outputs the ones provided by a package # preceded by the package name { while read f do dpkg -S "$f" | perl -lne ' my ($pkgs,$f) = /^(.+):\s+(\S+)/ or next; $f eq "'"$f"'" or next; foreach my $p (split(/,/,$pkgs)) # there may be multiple packages { $p =~ s#:.*##; # no :amd64, please print "$p $f" }' done } d=`mktemp -d /tmp/$me-XXXX` [ -d "$d" ] || Die mktemp failed trap "rm -rf $d" EXIT DownloadPackageOnce() ( cd $d >/dev/null for pkg in $pkg do [ -d $pkg ] && continue # assume it is already there mkdir $pkg && cd $pkg >/dev/null apt-get -q download $pkg >/dev/null # the exact filename is hard to describe due to colons in versions deb=`echo $pkg*.deb` #Ehm package $pkg has debfile $deb dpkg -x $deb . done ) PlainFilesIn "$@" | WithProvidingPackage | while read pkg f do if [ X"$makeorig" = X1 ] then cp -p $d$r $r.orig else DownloadPackageOnce $pkg diff $diffopts $d/$pkg$f $f fi done #rm -rf "$d" # done by the trap