quilt-dev
[Top][All Lists]
Advanced

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

[Quilt-dev] New function: Shift bottom patch to subversion


From: Hugo Mills
Subject: [Quilt-dev] New function: Shift bottom patch to subversion
Date: Tue, 24 Nov 2009 16:05:50 +0000
User-agent: Mutt/1.5.20 (2009-06-14)

   If I'm doing development with quilt, I usually come to the point
where I want to commit the changes to subversion, and find the process
a bit awkward. So I wrote a quilt module to shift the bottom patch of
the stack into svn, taking the patch header as the commit message.

   I've probably made a hash of it, and there's undoubtedly bugs,
infelicities and/or better ways of doing it, but I thought I'd post it
here, just in case anyone finds it useful. Anyway, it Works For Me. :)

   Hugo.


#! /bin/bash

#  This script is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License version 2 as
#  published by the Free Software Foundation.
#
#  See the COPYING and AUTHORS files for more details.

# Read in library functions
if [ "$(type -t patch_file_name)" != function ]
then
        if ! [ -r $QUILT_DIR/scripts/patchfns ]
        then
                echo "Cannot read library $QUILT_DIR/scripts/patchfns" >&2
                exit 1
        fi
        . $QUILT_DIR/scripts/patchfns
fi

setup_colors

usage()
{
        printf $"Usage: quilt svn [-aqv] [patch|num]\n"
        if [ x$1 = x-h ]
        then
                printf $"
Commit patches to subversion.  Without options, the current patch
in the series file is applied, and then removed from the series.
If [num] is provided, commit the [num] patches starting from the
current one.  If [patch] is provided, commit all patches from the
current one to the named patch.

-a      Apply all patches from current one.

-q      Quiet operation.

-v      Verbose operation.
"
                exit 0
        else
                exit 1
        fi
}

interrupt()
{
        rollback_patch $1
        printf $"Interrupted by user; patch %s was not applied.\n" \
               "$(print_patch $patch)" >&2
        exit 1
}

list_patches()
{
        local top=$(top_patch) n=0 patch
        if [ -n "$top" ]
        then
                echo $top
                patches_after $top
        else
                echo >&2 No current patch
                exit 1
        fi \
        | if [ -n "$opt_all" ]
        then
                cat
        else
                while read patch
                do
                        if [ -n "$number" ]
                        then
                                if [ $n -eq $number ]
                                then
                                        break
                                fi
                                n=$[$n+1]
                        fi
                        echo "$patch"
                        if [ -z "$number" -a "$patch" = "$stop_at_patch" ]
                        then
                                break
                        fi
                done
        fi
}

all_paths()
{
        # Read a list of files from stdin, and generate all paths leading
        # up to those
        while read path
        do
                while [ -n "$path" ]
                do
                        echo $path
                        newpath=${path%/*}
                        if [ "$newpath" = "$path" ]
                        then
                                newpath=
                        fi
                        path="$newpath"
                done
        done
}

apply_patch()
{
        # Get the patch file
        local patch=$1
        local patch_file=$(patch_file_name $patch)

        # Get the header
        [ -e "$patch_file" ] || exit 0

        cat_file "$patch_file" \
                | patch_header > svn.commit

        # Get the list of files to modify and check that they're all in svn
        for file in $(files_in_patch $patch | all_paths | sort | uniq)
        do
                if ! svn add -q $file
                then
                        echo >&2 Failed to add $file to svn control
                        exit 1
                fi
        done

        # Pop the top patch (the one to commit)
        if ! quilt pop
        then
                exit $?
        fi

        # Apply the patch outside quilt
        cat_file "$patch_file" \
                | patch -p1

        # Check in the changes
        if ! svn ci -F svn.commit
        then
                exit $?
        fi

        # Remove the patch from the patch stack
        if remove_from_series "$patch"
        then
                printf $"Removed patch %s\n" "$(print_patch "$patch")"
        else
                printf $"Failed to remove patch %s\n" "$(print_patch "$patch")" 
>&2
                exit 1
        fi

        if ! quilt push
        then
                exit $?
        fi

        # Clean up
        rm svn.commit
}

options=`getopt -o qvh -- "$@"`

if [ $? -ne 0 ]
then
        usage
fi

eval set -- "$options"

while true
do
  case "$1" in
          -q)
                  opt_quiet=1
                  shift ;;
          -v)
                  opt_verbose=1
                  shift ;;
          -a)
                  opt_all=1
                  shift ;;
          -h)
                  usage -h ;;
          --)
                  shift
                  break ;;
  esac
done

if [ $# -gt 1 -o \( -n "$opt_all" -a $# -ne 0 \) ]
then
        usage
fi

if [ $# -eq 1 ]
then
        if is_numeric $1
        then
                number=$1
        else
                stop_at_patch="$1"
        fi
else
        [ -z "$opt_all" ] && number=1
fi

if [ -n "$stop_at_patch" ]
then
        stop_at_patch=$(find_unapplied_patch "$stop_at_patch") || exit $?
fi

[ -n "$opt_quiet" ] && silent=-s
[ -z "$opt_verbose" ] && silent_unless_verbose=-s

# Get the list of patches to apply (including current)
patches=$(list_patches)
for patch in $patches
do
  [ -n "$opt_verbose" ] && echo "Processing patch $patch"
  if ! apply_patch "$patch"
          then
          echo >&2 Patch FAIL $?
          exit 1
  fi
done

### Local Variables:
### mode: shell-script
### End:
# vim:filetype=sh


-- 
=== Hugo Mills: address@hidden carfax.org.uk | darksatanic.net | lug.org.uk ===
  PGP key: 515C238D from wwwkeys.eu.pgp.net or http://www.carfax.org.uk
  --- The trouble with you, Ibid, is you think you know everything. ---  
                                                                         

Attachment: signature.asc
Description: Digital signature


reply via email to

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