| #!/bin/bash |
| set -e |
| |
| # stg-fold-files-from - picks changes to one file from another patch. |
| # Only supports picking from one file pattern, but allows to select any range |
| # of hunks from the file, using the -# flag to filterdiff. |
| # Use together with "filterdiff --annotate" in your diff pager, to |
| # identify hunk numbers easily. |
| # Use "-O -U<n>" to get finer hunk granularity for -#<n>. |
| |
| # usage: stg-fold-files-from <patch> [-n] [-O <stg-show-flags>] [-#<n>[-<n>][,<n>]...] <file-pattern> |
| |
| # Copyright (c) 2006-2007 Yann Dirson <ydirson@altern.org> |
| # Subject to the GNU GPL, version 2. |
| |
| PATCH="$1" |
| shift |
| |
| filtercmd=cat |
| hunks= |
| foldflags= |
| showflags=() |
| noact=0 |
| while [ "$#" -gt 0 ]; do |
| case "$1" in |
| -\#*) hunks="$1" ;; |
| -t) foldflags="-t" ;; |
| -n) noact=1 ;; |
| -O) showflags+=(-O "$2"); shift ;; |
| -*) { echo >&2 "unknown flag '$1'"; exit 1; } ;; |
| *) break ;; |
| esac |
| shift |
| done |
| [ "$#" = 1 ] || { echo >&2 "supports one file only"; exit 1; } |
| |
| getpatch() |
| { |
| stg show "${showflags[@]}" "$PATCH" | filterdiff -p1 $hunks -i "$1" |
| } |
| |
| if [ $noact = 1 ]; then |
| getpatch "$1" |
| else |
| getpatch "$1" | stg fold $foldflags |
| fi |