From c0f677497b760028ae8aafb72d4d08604aa7870e Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Thu, 18 Dec 2014 17:06:11 +0100 Subject: setup: Add --fast option This is an alternative implementation of "quilt setup" for rpm spec files, which is much faster than the original implementation. The idea is to have rpmbuild generate our working tree directly, instead of taking note of everything it does and then replaying that record from scratch. The new implementation is enabled with option --fast. The original implementation can be selected with --slow, which is the default. Having this option makes it possible to set the default to --fast in ~/.quiltrc and revert to --slow on the command line on a case-by-case basis. This will also make it easier if we decide to change the default in the future. In general, the generated working tree should be the same with --slow or --fast. There are 3 known exceptions though: * The header of the series files is incomplete when using --fast, which means that you can't reuse these series files to feed "quilt setup" later. * If the spec file generates files other than with the tar, unzip and patch commands, you wouldn't get these files in your working tree with --slow, but with --fast you will. * With --fast, all patches are added to the series file, regardless of whether they apply or not. This also means that patches which fail to apply are not reported as such until you attempt to push them. On large packages, this alternative implementation was found to be up to 4 times faster than the original implementation. --- quilt/scripts/inspect-wrapper.in | 5 +++++ quilt/scripts/inspect.in | 23 ++++++++++++++++++--- quilt/setup.in | 43 ++++++++++++++++++++++++++++++++++++---- 3 files changed, 64 insertions(+), 7 deletions(-) diff --git a/quilt/scripts/inspect-wrapper.in b/quilt/scripts/inspect-wrapper.in index c391037..eb0975e 100644 --- a/quilt/scripts/inspect-wrapper.in +++ b/quilt/scripts/inspect-wrapper.in @@ -220,12 +220,14 @@ patch) ;; tar) echo -n t >&4 + [ -n "$QUILT_SETUP_FAST" ] && exec ${0##*/} "$@" inputfile=$(tar_input_file "$@") # For tar, file - means read from stdin [ "$inputfile" = "-" ] && inputfile= ;; unzip) echo -n Z >&4 + [ -n "$QUILT_SETUP_FAST" ] && exec ${0##*/} "$@" inputfile=$(unzip_input_file "$@") ;; esac @@ -259,6 +261,9 @@ then esac fi +# In fast mode, we don't actually apply patches +[ -n "$QUILT_SETUP_FAST" ] && exit 0 + if [ -n "$inputfile" ] then exec ${0##*/} "$@" diff --git a/quilt/scripts/inspect.in b/quilt/scripts/inspect.in index d545b59..3f1ce89 100644 --- a/quilt/scripts/inspect.in +++ b/quilt/scripts/inspect.in @@ -21,11 +21,11 @@ cd ${SUBDIR:-.} usage() { - echo "Usage: ${0##*/} [-v] [--sourcedir dir] [--fuzz=N] specfile" + echo "Usage: ${0##*/} [-v] [--sourcedir dir] [--targetdir dir] [--fuzz=N] specfile" exit 1 } -options=$(getopt -o v --long sourcedir:,fuzz: -n "${0##*/}" -- "$@") || exit +options=$(getopt -o v --long sourcedir:,targetdir:,fuzz: -n "${0##*/}" -- "$@") || exit eval set -- "$options" @@ -40,6 +40,9 @@ do --sourcedir) sourcedir=${2%/}/ shift 2 ;; + --targetdir) + targetdir=$2 + shift 2 ;; --fuzz) # Only works with rpm 4.6 and later DEFINE_FUZZ="%define _default_patch_fuzz $2" @@ -68,8 +71,16 @@ fi tmpdir=$(gen_tempfile -d ${VARTMPDIR:-/var/tmp}/${0##*/}) mkdir -p $tmpdir || exit 1 add_exit_handler "rm -rf $tmpdir" -mkdir -p $tmpdir/build mkdir -p $tmpdir/bin +if [ -n "$targetdir" ] +then + # Fast mode + [ -d "$targetdir" ] || mkdir -p "$targetdir" || exit 1 + ln -s "$targetdir" $tmpdir/build +else + # Standard mode + mkdir -p $tmpdir/build +fi # Redirect file descriptors # 5 is used in verbose mode, 4 in non-verbose mode, and 2 for both (real errors) @@ -90,6 +101,11 @@ do ready|bigpack|_constraints|_service|baselibs.conf|MD5SUMS|MD5SUMS.meta|*.spec|*.changes|*.sig|*.sign|*rpmlintrc) continue ;; + # In fast mode, we are only interested in patches, so filter out + # archives + *.tar|*.tar.Z|*.tar.gz|*.tgz|*.tar.bz2|*.tar.xz|*.zip) + [ -n "$targetdir" ] && continue + ;; esac [ -f "$file" ] || continue echo -n "." >&4 @@ -150,6 +166,7 @@ ln -s $QUILT_DIR/scripts/inspect-wrapper $tmpdir/bin/unzip echo -n "### rpmbuild: " >&4 export PATH="$tmpdir/bin:$PATH" +export QUILT_SETUP_FAST=${targetdir:+1} rpmbuild --eval "%define _sourcedir $sourcedir" \ --eval "%define _specdir $specdir" \ --eval "%define _builddir $tmpdir/build" \ diff --git a/quilt/setup.in b/quilt/setup.in index 93c7ce4..639d40d 100644 --- a/quilt/setup.in +++ b/quilt/setup.in @@ -124,7 +124,7 @@ dir_to_dir() usage() { - printf $"Usage: quilt setup [-d path-prefix] [-v] [--sourcedir dir] [--fuzz=N] {specfile|seriesfile}\n" + printf $"Usage: quilt setup [-d path-prefix] [-v] [--sourcedir dir] [--fuzz=N] [--slow|--fast] {specfile|seriesfile}\n" if [ x$1 = x-h ] then printf $" @@ -139,6 +139,17 @@ Initializes a source tree from an rpm spec file or a quilt series file. --fuzz=N Set the maximum fuzz factor (needs rpm 4.6 or later). + +--slow Use the original, slow method to process the spec file. This is the + default for now, but that might change in the future. In this mode, + rpmbuild generates a working tree in a temporary directory while all + its actions are recorded, and then everything is replayed from scratch + in the target directory. + +--fast Use an alternative, faster method to process the spec file. In this + mode, rpmbuild is told to generate a working tree directly in the + target directory. If the input is a series file, it is assumed that + all archives have been extracted manually beforehand. " exit 0 else @@ -146,7 +157,7 @@ Initializes a source tree from an rpm spec file or a quilt series file. fi } -options=`getopt -o d:vh --long sourcedir:,fuzz: -- "$@"` +options=`getopt -o d:vh --long sourcedir:,fuzz:,slow,fast -- "$@"` if [ $? -ne 0 ] then @@ -175,6 +186,12 @@ do --fuzz) opt_fuzz="--fuzz $2" shift 2 ;; + --slow) + opt_fast= + shift ;; + --fast) + opt_fast=1 + shift ;; --) shift break ;; @@ -203,8 +220,24 @@ case "$1" in # check if rpmbuild is installed before running inspect check_external_tool rpmbuild rpm-build - if ! $QUILT_DIR/scripts/inspect $verbose $opt_sourcedir $opt_fuzz \ - "$spec_file" 2>&1 > $tmpfile + if [ -n "$opt_fast" ] + then + if [ "${prefix:0:1}" = / ] + then + targetdir=$prefix + else + targetdir=$PWD/$prefix + fi + + $QUILT_DIR/scripts/inspect $verbose $opt_sourcedir $opt_fuzz \ + --targetdir "$targetdir" \ + "$spec_file" 2>&1 > $tmpfile + else + $QUILT_DIR/scripts/inspect $verbose $opt_sourcedir $opt_fuzz \ + "$spec_file" 2>&1 > $tmpfile + fi + + if [ $? -ne 0 ] then printf $"The %%prep section of %s failed; results may be incomplete\n" "$spec_file" if [ -z "$verbose" ] @@ -252,8 +285,10 @@ case "$1" in esac # Make sure that unpacking will not overwrite anything +[ -n "$opt_fast" ] || \ check_for_existing_directories || exit 1 +[ -n "$opt_fast" ] || \ while read tag dir arg1 arg2 do case "$tag" in -- cgit