/usr/bin/backport-dsc is in neurodebian-dev 0.37.2.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 | #!/bin/bash
# play save
set -e
set -u
# version of this script
backports_dsc_version=0.2
############
# Defaults #
############
bp_distribution=${BACKPORT_DISTRIBUTION:-squeeze-backports}
bp_version_prefix=${BACKPORT_VERSION_PREFIX:-\~}
bp_version_suffix=${BACKPORT_VERSION_SUFFIX:-bpo60}
bp_maintainer_name=${DEBFULLNAME:-unamed}
bp_maintainer_email=${DEBEMAIL:-unknown}
bp_update_maintainer=1
# whether or not to apply backport patches found in a package
bp_apply_patches=1
# produce fancy colored output
bp_color_output=1
# enables additional status message if set to true
bp_verbose=0
# sed expressions to modify debian/control
bp_mod_control=""
# source config files
if [ -f /etc/backport-dsc ]; then
. /etc/backport-dsc
fi
# source user config files
if [ -f "$HOME/.backport-dsc" ]; then
. $HOME/.backport-dsc
fi
print_version()
{
cat << EOT
backport-dsc $backports_dsc_version
Copyright (C) 2010-2012 Michael Hanke <michael.hanke@gmail.com>
Licensed under GNU Public License version 2 or later.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Michael Hanke for the NeuroDebian project.
EOT
}
print_short_description()
{
cat << EOT
Helper to aid backporting a Debian source package to an arbitrary distribution
release.
backport-dsc aids backporting by appropriately mangling the source package
version, adjusting the maintainer of a package and compiling an informative
changelog entry. Moreover, it supports distribution specific patches (plain, or
for format 3.0 (quilt) source packages) and allow modification of debian/control
via arbitrary 'sed' expressions.
Backport relevant patches can be embedded in source packages for use with
backport-dsc. The distribution name (see --target-distribution) serves as an
identifier to search for patches in the source package that shall be applied
for a particular distribution. For packages using format the 3.0 (quilt),
backport-dsc will look for debian/patches/series-<distname> and append it to
the main patch series. Moreover, backport-dsc will also look for patches
matching /debian/patches/<distname>-dsc-patch* and apply them to the source
package. The latter patches, unlike the former quilt series, can also be used
to modify the debian/ directory itself.
EOT
}
print_help()
{
cat << EOT
Usage: backport-dsc [OPTIONS] <dsc-file>
Options:
-d <distname>, --target-distribution <distname>
Arbitrary distribution name (e.g. squeeze-backports). This will be the target
distribution used for the backport changelog entry. The distribution name
also serves as an identifier to search for backport patches in the source
package.
-h, --help
Print short description, usage summary and option list.
--maint-email <email>
Specify the backport maintainer's email address. Alternatively, backport-dsc
will use the DEBEMAIL environment setting.
--maint-name <name>
Specify the backport maintainer's real name. Alternatively, backport-dsc will
use the DEBFULLNAME environment setting.
--mod-control <expression>
sed expression to modify debian/control. The option can be given multiple
times and all expressions will be passed to sed in the order of appearance.
This can be used to, e.g. change build or runtime dependencies.
--no-backport-patches
If set, potentially existing backport patches will not be applied/activated.
--no-colored
If set, backport-dsc won't colorize its status and error messages.
--no-maintainer-update
If set, the orginal maintainer is preserved in the backported source package.
This should only be done if original maintainer and backporter are identical.
Otherwise the porter should take responsibility for the source package
backport and identify herself as the maintainer.
-s <string>, --version-suffix <string>
Version suffix that will be appended to the original source package version,
ideally indicating the backport target distribution. The resulting package
version will follow this schema:
<originalversion><prefix><suffix>+<digit>
e.g.: 1.2.3-4~bpo60+1 with default <prefix>=~
-p <string>, --version-prefix <string>
Version prefix that will be prepended to the backport version. By default it
is ~ but want to be changed (e.g. to +) for forward-porting to next releases.
--verbose
Enable additional status messages.
--verbose-help
Print all available help.
--version
Print version information and exit.
EOT
}
print_additional_description()
{
cat << EOT
Examples:
backport-dsc examplepkg_1.2.3-4.dsc
Create backport suitable for backports.org
backport-dsc -d myown-backports -v mo2010 examplepkg_1.2.3-4.dsc
Create backport for some custom distribution with custom version suffix.
backport-dsc -d ubuntu-lucid -v myppa --mod-control "-e 's/iceweasel/firefox/g'" examplepkg_1.2.3-4.dsc
Create a backport for a fake Ubuntu PPA repository, replacing all occurrences
of iceweasel in debian/control with firefox.
Files:
backport-dsc reads configuration from two files: system-wide from
/etc/backports-dsc and per user settings from \$HOME/.backport-dsc
(in that order). Both files have to be valid bash scripts that will
be sourced by backport-dsc. The following variables (each shown with an
example setting) can be used to pre-configure backport-dsc:
bp_distribution="squeeze-backports"
Backport target distribution (see --backport-distribution)
bp_version_prefix="~"
Version prefix (see --version-prefix)
bp_version_suffix="bpo60"
Version suffix (see --version-suffix)
bp_maintainer_name="Unknown fellow"
Name of the backport maintainer (see --maint-name)
bp_maintainer_email="user@example.net"
Email address of backport maintainer (see --maint-email)
bp_apply_patches=1
Whether or not to apply backport patches found in a source package.
(see --no-backport-patches)
bp_color_output=1
Enable or disable colored status output (see --no-color)
bp_verbose=0
Enable verbose status output (see --verbose)
bp_mod_control="--mod-control 's/^Depends:.*$/&, mypackage/'"
sed expressions to modify debian/control, for example to add dependencies
(see --mod-control)
bp_update_maintainer=1
Whether or not to replace the original maintainer in the backported source
package (see --no-maintainer-update)
Environment:
backport-dsc acknowledges the common environment variables DEBFULLNAME and
DEBEMAIL to specify the maintainer.
Report bugs to <michael.hanke@gmail.com>.
EOT
}
################################
# Commandline options handling #
################################
# Parse commandline options (taken from the getopt examples from the Debian util-linux package)
# Note that we use `"$@"' to let each command-line parameter expand to a
# separate word. The quotes around `$@' are essential!
# We need CLOPTS as the `eval set --' would nuke the return value of getopt.
CLOPTS=`getopt -o h,d:,s:,p: --long help,verbose-help,version,target-distribution:,version-suffix:,version-prefix:,maint-name:,maint-email:,no-color,no-backport-patches,verbose,mod-control:,no-maintainer-update, -n 'backport-dsc' -- "$@"`
if [ $? != 0 ] ; then
echo "Terminating..." >&2
exit 1
fi
# Note the quotes around `$CLOPTS': they are essential!
eval set -- "$CLOPTS"
while true ; do
case "$1" in
-d|--target-distribution) shift; bp_distribution=$1; shift;;
-s|--version-suffix) shift; bp_version_suffix=$1; shift;;
-p|--version-prefix) shift; bp_version_prefix=$1; shift;;
--maint-name) shift; bp_maintainer_name=$1; shift;;
--maint-email) shift; bp_maintainer_email=$1; shift;;
--no-maintainer-update) bp_update_maintainer=0; shift;;
--no-backport-patches) apply_patches=0; shift;;
--no-color) bp_color_output=0; shift;;
--verbose) bp_verbose=1; shift;;
--mod-control) shift; bp_mod_control="$bp_mod_control -e '$1'"; shift;;
-h|--help) print_short_description; print_help; exit 0;;
--verbose-help) print_short_description; print_help; print_additional_description; exit 0;;
--version) print_version; exit 0;;
--) shift ; break ;;
*) echo "Internal error! ($1)"; exit 1;;
esac
done
# colorful output requested?
if [ "$bp_color_output" = 1 ]; then
black='\e[0;30m'; Black='\e[1;30m'
red='\e[0;31m'; Red='\e[1;31m'
green='\e[0;32m'; Green='\e[1;32m'
yellow='\e[0;33m'; Yellow='\e[1;33m'
blue='\e[0;34m'; Blue='\e[1;34m'
cyan='\e[0;36m'; Cyan='\e[1;36m'
white='\e[0;37m'; White='\e[1;37m'
NC='\e[0m' #no color
else
black=''; Black=''
red=''; Red=''
green=''; Green=''
yellow=''; Yellow=''
blue=''; Blue=''
cyan=''; Cyan=''
white=''; White=''
NC='' #no color
fi
if [ $# -ne 1 ]; then
printf "${Red}Error: This command needs exactly one positional argument.\n${NC}"
exit 1
fi
# to be processed source package
dsc_file=$1
if [ ! -f "$dsc_file" ]; then
printf "${Red}Error: Cannot find DSC file at '$dsc_file'.\n${NC}"
exit 1
fi
# determine basic DSC properties
src_name=$(basename "${dsc_file%%_*}")
src_version=${dsc_file#*_}
src_version=${src_version%%.dsc}
wdir=$(mktemp -d -t backport-dsc.XXXXXX)
sdir=$wdir/${src_name}-${src_version}
bp_version="${bp_version_prefix}${bp_version_suffix}+"
# setup environment for dpkg
DEBEMAIL="$bp_maintainer_email"
DEBFULLNAME="$bp_maintainer_name"
export DEBEMAIL DEBFULLNAME
if [ "$bp_verbose" = 1 ]; then
printf "${green}DSC name: '$src_name'\nDSC version: '$src_version'\n${NC}"
printf "${green}Backporting to '$bp_distribution', version suffix '$bp_version'\n${NC}"
printf "${green}Extracting source package to '$sdir'\n${NC}"
fi
# common debchange call
bp_dch_cmd="dch --noconf --force-distribution --force-bad-version -c $sdir/debian/changelog"
# extract the original source package
dpkg-source -x $dsc_file $sdir
# note backport in changelog
# This will create a new changelog entry
# All subsequent calls to dch should use -a to assure that those entries
# are appended to the existing entry (otherwise with wheezy new entries will be added)
$bp_dch_cmd -D ${bp_distribution} -l "${bp_version}" "Backported for ${bp_distribution}."
if [ "$bp_update_maintainer" = 1 ]; then
if [ "$bp_verbose" = 1 ]; then
printf "${green}Set backport maintainer to: '$bp_maintainer_name <$bp_maintainer_email>'\n${NC}"
fi
bp_mod_control="$bp_mod_control -e 's/^Maintainer:.*$/Maintainer: $bp_maintainer_name <$bp_maintainer_email>\nX-Original-&/'"
fi
# handle patches if desired
if [ "$bp_apply_patches" = 1 ]; then
dsc_format=$(dpkg-source --print-format $sdir)
# per each supported source package format
if [ "$dsc_format" = "3.0 (quilt)" -a -f "$sdir/debian/patches/series-$bp_distribution" ]; then
if [ "$bp_verbose" = 1 ]; then
printf "${green}Enabling additional quilt patch series for $bp_distribution.\n${NC}"
fi
cat $sdir/debian/patches/series-$bp_distribution >> $sdir/debian/patches/series
$bp_dch_cmd -a "Added 'series-$bp_distribution' in quilt patch series."
fi
# look for backport patches
for p in $(ls -1 $sdir/debian/patches/$bp_distribution-dsc-patch* 2> /dev/null || true); do
if [ "$bp_verbose" = 1 ]; then
printf "${green}Applying additional patch $(basename "$p").\n${NC}"
fi
patch -p1 --directory=$sdir < "$p"
$bp_dch_cmd -a "Applied additional patch from debian/patches/$(basename "$p")."
done
fi
# modify control file
if [ -n "$bp_mod_control" ]; then
if [ "$bp_verbose" = 1 ]; then
printf "${green}Modifying debian/control with given instructions.\n${NC}"
fi
bash -c "sed -i $bp_mod_control $sdir/debian/control"
$bp_dch_cmd -a "Used following sed expression to modify debian/control:$bp_mod_control."
fi
# extract final version
final_version=$(dpkg-parsechangelog -l$sdir/debian/changelog | egrep '^Version: ' | cut -d ' ' -f 2,2)
# build backported source package
bash -c "cd $wdir && dpkg-source -b $sdir"
# remove extracted source tree
rm -rf $sdir
# move generated source package into working dir
mv $wdir/* .
# cleanup
rm -rf $wdir
if [ "$bp_verbose" = 1 ]; then
printf "${green}Backported source package is at '${src_name}_$final_version.dsc'\n${NC}"
fi
|