quilt-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Quilt-dev] [PATCH 2/3] setup: Add --fast option


From: Jean Delvare
Subject: [Quilt-dev] [PATCH 2/3] setup: Add --fast option
Date: Sun, 07 Dec 2014 18:34:07 +0100

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.
---
This is my SUSE hackweek 11 project, more information at:
https://hackweek.suse.com/11/projects/194

 quilt/scripts/inspect-wrapper.in |    5 ++++
 quilt/scripts/inspect.in         |   23 ++++++++++++++++++--
 quilt/setup.in                   |   43 +++++++++++++++++++++++++++++++++++----
 3 files changed, 64 insertions(+), 7 deletions(-)

--- 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
+[ ${0##*/}$QUILT_SETUP_FAST = patch1 ] && exit 0
+
 if [ -n "$inputfile" ]
 then
        exec ${0##*/} "$@"
--- 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
 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" \
--- 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 sp
 
 --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 sp
        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

-- 
Jean Delvare
SUSE L3 Support




reply via email to

[Prev in Thread] Current Thread [Next in Thread]