summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/guilt/files/guilt.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/guilt/files/guilt.patch')
-rw-r--r--meta/recipes-devtools/guilt/files/guilt.patch317
1 files changed, 317 insertions, 0 deletions
diff --git a/meta/recipes-devtools/guilt/files/guilt.patch b/meta/recipes-devtools/guilt/files/guilt.patch
new file mode 100644
index 0000000000..a3352cf810
--- /dev/null
+++ b/meta/recipes-devtools/guilt/files/guilt.patch
@@ -0,0 +1,317 @@
+guilt: enhanced patch queue management
+
+guilt prefers to track the status and series of patches
+under .git/patches. But this location doesn't allow the
+status of a quilt queue to be committed to a secondary
+repository and later restored.
+
+This change does three things:
+
+ - allows GUILT_BASE to be changed (with a default to "wrs")
+ - allows shadow tracking of the patches (for rebase)
+ - enhances the header detection and creation of patches
+ as they are pushed onto the tree.
+
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+
+---
+ guilt | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 159 insertions(+), 24 deletions(-)
+
+--- a/guilt
++++ b/guilt
+@@ -153,14 +153,16 @@ get_branch()
+
+ verify_branch()
+ {
+- [ ! -d "$GIT_DIR/patches" ] &&
++ [ ! -d "$GUILT_DIR" ] &&
+ die "Patches directory doesn't exist, try guilt-init"
+- [ ! -d "$GIT_DIR/patches/$branch" ] &&
++ [ ! -d "$GUILT_DIR/$branch" ] &&
+ die "Branch $branch is not initialized, try guilt-init"
+- [ ! -f "$GIT_DIR/patches/$branch/series" ] &&
++ [ ! -f "$GUILT_DIR/$branch/series" ] &&
+ die "Branch $branch does not have a series file"
+- [ ! -f "$GIT_DIR/patches/$branch/status" ] &&
++ [ ! -f "$GUILT_DIR/$branch/status" ] &&
+ die "Branch $branch does not have a status file"
++ [ -f "$GUILT_DIR/$branch/applied" ] &&
++ die "Warning: Branch $branch has 'applied' file - guilt is not compatible with stgit"
+ [ -f "$GIT_DIR/patches/$branch/applied" ] &&
+ die "Warning: Branch $branch has 'applied' file - guilt is not compatible with stgit"
+ }
+@@ -339,6 +341,17 @@ BEGIN{}
+ '
+ }
+
++# usage: do_get_only_patch patchfile
++# similar to do_get_patch except everything leading up to
++# the first diff line and after the last chunk are removed
++do_get_only_patch()
++{
++ cat "$1" | awk '
++BEGIN{}
++/^(diff )/,/^(-- |END{})/
++' | sed '/^-- *$/D'
++}
++
+ # usage: do_get_header patchfile
+ do_get_header()
+ {
+@@ -352,8 +365,13 @@ do_get_header()
+ BEGIN{skip=0}
+ /^Subject:/ && (NR==1){print substr($0, 10); next}
+ /^From:/{skip=1; next}
++/^Author:/{skip=1; next}
++/^Date:/{skip=1; next}
++/^commit/{skip=1; next}
+ /^[ \t\f\n\r\v]*$/ && (skip==1){skip=0; next}
+ /^(diff |---$|--- )/{exit}
++/^diff --git/{exit}
++/^Index: /{exit}
+ {print $0}
+ END{}
+ '
+@@ -415,6 +433,15 @@ series_insert_patch()
+ mv "$series.tmp" "$series"
+ }
+
++series_append_patch()
++{
++ # unlike series_insert_patch, which inserts the passed
++ # patch after the current top patch, this function always
++ # appends the patch to the series
++
++ echo $1 >> "$series"
++}
++
+ # usage: series_remove_patch <patchname>
+ series_remove_patch()
+ {
+@@ -473,8 +500,7 @@ remove_patch_refs()
+ # usage: pop_many_patches <commitish> <number of patches>
+ pop_many_patches()
+ {
+- assert_head_check
+-
++ head_check "`tail -1 < "$applied" | cut -d: -f 1`"
+ (
+ cd_to_toplevel
+
+@@ -508,50 +534,149 @@ remove_ref()
+ )
+ }
+
++prep_patch()
++{
++ patch=$1;
++ tgt=$2;
++
++ if test -f $patch; then
++ case $patch in
++ *.gz) gzip -dc $patch > $tgt ;;
++ *.bz2) bzip2 -dc $patch > $tgt ;;
++ *) cp $patch $tgt ;;
++ esac;
++ fi;
++}
++
+ # usage: commit patchname parent
+ commit()
+ {
+ (
+ TMP_MSG=`get_tmp_file msg`
++ TMP_PATCH=`get_tmp_file patch`
++ TMP_PATCH_OUT=`get_tmp_file patch_out`
++ TMP_INFO=`get_tmp_file info`
+
+ p="$GUILT_DIR/$branch/$1"
+ pname="$1"
++ prep_patch "$p" "$TMP_PATCH"
++ p=$TMP_PATCH
++
+ cd_to_toplevel
+
+ git diff-files --name-only | (while read n; do git update-index "$n" ; done)
+
++ # borrowed from git-am
++ header_type=git
++ git mailinfo "$TMP_MSG" "$TMP_PATCH_OUT" \
++ <"$p" >"$TMP_INFO";
++
++ # skip pine's internal folder data
++ grep '^Author: Mail System Internal Data$' \
++ <"$TMP_INFO" >/dev/null
++
++ git stripspace < "$TMP_MSG" > "$TMP_MSG.clean"
++ mv "$TMP_MSG.clean" "$TMP_MSG"
++ git stripspace < "$TMP_INFO" > "$TMP_INFO.clean"
++ mv "$TMP_INFO.clean" "$TMP_INFO"
++
++ # If mailinfo couldn't get something , try another way
+ # grab a commit message out of the patch
+- do_get_header "$p" > "$TMP_MSG"
++ if [ ! -s "$TMP_MSG" ] || [ ! -s "$TMP_INFO" ]; then
++ do_get_header "$p" > "$TMP_MSG"
++ header_type=guilt
++ fi
+
+- # make a default commit message if patch doesn't contain one
+- [ ! -s "$TMP_MSG" ] && echo "patch $pname" > "$TMP_MSG"
++ # last try: make a default commit message if patch doesn't contain one
++ [ ! -s "$TMP_MSG" ] && echo "auto_msg: patch $pname" > "$TMP_MSG"
+
+- # extract a From line from the patch header, and set
+- # GIT_AUTHOR_{NAME,EMAIL}
+- author_str=`sed -n -e '/^From:/ { s/^From: //; p; q; }; /^(diff |---$|--- )/ q' "$p"`
+- if [ ! -z "$author_str" ]; then
++
++ if [ "$header_type" = "guilt" ]; then
++
++ # extract a From line from the patch header, and set
++ # GIT_AUTHOR_{NAME,EMAIL}
++ author_str=`sed -n -e '/^From:/ { s/^From: //; p; q }; /^(diff |---)/ q' "$p"`
++ if [ ! -z "$author_str" ]; then
+ GIT_AUTHOR_NAME=`echo $author_str | sed -e 's/ *<.*$//'`
+ export GIT_AUTHOR_NAME="${GIT_AUTHOR_NAME:-" "}"
+ export GIT_AUTHOR_EMAIL="`echo $author_str | sed -e 's/[^<]*//'`"
+- fi
++ fi
++
++
++ # check in the patch for a subject
++ SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' "$p")"
++ if [ -z "$SUBJECT" ]; then
++ # if we can't find a subject in the patch, then let's construct
++ # one from the header of the patch itself
++ SUBJECT=`cat "$TMP_MSG" | head -n 1`
++ if [ ${#SUBJECT} -gt 60 ]; then
++ SUBJECT=${SUBJECT: -60}
++ fi
++ fi
++
++ if [ -z "$SUBJECT" ]; then
++ # if we are *still* without a subject, then just use
++ # the patch name
++ SUBJECT=`echo $1 | sed 's%^patch *%%'`
++
++ if [ ${#SUBJECT} -gt 60 ]; then
++ SUBJECT=${SUBJECT: -60}
++ fi
++ fi
+
+- # must strip nano-second part otherwise git gets very
+- # confused, and makes up strange timestamps from the past
+- # (chances are it decides to interpret it as a unix
+- # timestamp).
+- export GIT_AUTHOR_DATE="`stat -c %y "$p" | sed -e '
++ SUBJECT=`echo $SUBJECT | sed s'%^ *%%'`
++
++ if [ ! -z "$SUBJECT" ]; then
++ echo "$SUBJECT" >> $TMP_MSG.subject
++ echo "" >> $TMP_MSG.subject
++ cat "$TMP_MSG" >> $TMP_MSG.subject
++ mv "$TMP_MSG.subject" "$TMP_MSG"
++ fi
++
++ # must strip nano-second part otherwise git gets very
++ # confused, and makes up strange timestamps from the past
++ # (chances are it decides to interpret it as a unix
++ # timestamp).
++ export GIT_AUTHOR_DATE="`stat -c %y "$p" | sed -e '\
+ s/^\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\) \([0-9]\{2\}\):\([0-9]\{2\}\):\([0-9]\{2\}\)\.[0-9]* \(.*\)$/\1-\2-\3 \4:\5:\6 \7/'`"
+- export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
++ export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
++ else
++ # using git headers, closely related to git-am
++
++ GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' "$TMP_INFO")"
++ GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' "$TMP_INFO")"
++ GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$TMP_INFO")"
++ if test -z "$GIT_AUTHOR_EMAIL"
++ then
++ echo "Warning: patch does not have a valid e-mail address."
++ GIT_AUTHOR_EMAIL=$GIT_AUTHOR_NAME
++ fi
++
++ SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' "$TMP_INFO")"
++ if [ ! -z "$SUBJECT" ]; then
++ echo "$SUBJECT" >> $TMP_MSG.subject
++ echo "" >> $TMP_MSG.subject
++ cat "$TMP_MSG" >> $TMP_MSG.subject
++ mv "$TMP_MSG.subject" "$TMP_MSG"
++ fi
++ export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
++ fi
+
+ # commit
+ treeish=`git write-tree`
+ commitish=`git commit-tree $treeish -p $2 < "$TMP_MSG"`
++ if [ ! $? -eq 0 ]; then
++ echo "ERROR. Could not commit tree"
++ git-reset --hard HEAD^
++ exit 1
++ fi
+ git update-ref HEAD $commitish
+
+ # mark patch as applied
+ git update-ref "refs/patches/$branch/$pname" HEAD
+
+- rm -f "$TMP_MSG"
++ rm -f "$TMP_MSG" "$TMP_LOG" "$TMP_PATCH" "$TMP_INFO" "$TMP_PATCH_OUT"
++
+ )
+ }
+
+@@ -568,7 +693,7 @@ push_patch()
+ bail_action="$2"
+ reject="--reject"
+
+- assert_head_check
++ head_check "`tail -1 < "$applied" | cut -d: -f 1`"
+ cd_to_toplevel
+
+ # apply the patch if and only if there is something to apply
+@@ -671,7 +796,7 @@ refresh_patch()
+ # incldiffstat
+ __refresh_patch()
+ {
+- assert_head_check
++ head_check "`tail -1 < "$applied" | cut -d: -f 1`"
+
+ (
+ TMP_DIFF=`get_tmp_file diff`
+@@ -711,6 +836,10 @@ __refresh_patch()
+
+ head -n "-$N" < "$applied" > "$applied.tmp"
+ mv "$applied.tmp" "$applied"
++
++ # update the shadow status.
++ ref=`cat $GIT_DIR/refs/tags/${branch}_top`
++ echo "$ref:$1" >> $applied_shadow
+ )
+ }
+
+@@ -791,7 +920,12 @@ diffstat=`git config --bool guilt.diffst
+ # The following gets run every time this file is source'd
+ #
+
+-GUILT_DIR="$GIT_DIR/patches"
++
++# GUILT_DIR="$GIT_DIR/patches"
++if [ -z "$GUILT_BASE" ]; then
++ GUILT_BASE=wrs
++fi
++GUILT_DIR="$GUILT_BASE/patches"
+
+ branch=`get_branch`
+
+@@ -814,6 +948,7 @@ fi
+ # very useful files
+ series="$GUILT_DIR/$branch/series"
+ applied="$GUILT_DIR/$branch/status"
++applied_shadow="$GUILT_DIR/$branch/shadow_status"
+ guards_file="$GUILT_DIR/$branch/guards"
+
+ # determine a pager to use for anything interactive (fall back to more)