summaryrefslogtreecommitdiff
path: root/meta/recipes-devtools/guilt
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/guilt')
-rw-r--r--meta/recipes-devtools/guilt/files/guilt-bash.patch286
-rw-r--r--meta/recipes-devtools/guilt/files/guilt-import-commit.patch94
-rw-r--r--meta/recipes-devtools/guilt/files/guilt-init.patch23
-rw-r--r--meta/recipes-devtools/guilt/files/guilt-pop.patch71
-rw-r--r--meta/recipes-devtools/guilt/files/guilt-push-no-series.patch27
-rw-r--r--meta/recipes-devtools/guilt/files/guilt-push.patch40
-rw-r--r--meta/recipes-devtools/guilt/files/guilt-set-git_exec_path.patch27
-rw-r--r--meta/recipes-devtools/guilt/files/guilt.patch317
-rw-r--r--meta/recipes-devtools/guilt/files/improve_auto_header_gen.patch69
-rw-r--r--meta/recipes-devtools/guilt/files/make_git_commands_conditional.patch46
-rw-r--r--meta/recipes-devtools/guilt/files/optional_head_check.patch58
-rw-r--r--meta/recipes-devtools/guilt/files/uninstall_force.patch12
-rw-r--r--meta/recipes-devtools/guilt/guilt-native_0.33.bb30
13 files changed, 1100 insertions, 0 deletions
diff --git a/meta/recipes-devtools/guilt/files/guilt-bash.patch b/meta/recipes-devtools/guilt/files/guilt-bash.patch
new file mode 100644
index 000000000..d2058e8cf
--- /dev/null
+++ b/meta/recipes-devtools/guilt/files/guilt-bash.patch
@@ -0,0 +1,286 @@
+guilt: explicitly call for bash
+
+Running complex guilt stacks of patches/commits can cause interesting
+failures after ~20m of processing, with errors like "Bad substitution".
+
+These have been traced back to having /bin/sh --> /bin/dash on Ubuntu
+systems. Putting a shell that actually *works* (such as /bin/bash)
+in as /bin/sh makes the problem go away. So here we change the guilt
+scripts to explicitly call for bash to ensure we don't have a similar
+issue after deployment.
+
+Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
+
+---
+ guilt | 2 +-
+ guilt-add | 2 +-
+ guilt-applied | 2 +-
+ guilt-branch | 2 +-
+ guilt-delete | 2 +-
+ guilt-diff | 2 +-
+ guilt-export | 2 +-
+ guilt-files | 2 +-
+ guilt-fold | 2 +-
+ guilt-fork | 2 +-
+ guilt-graph | 2 +-
+ guilt-header | 2 +-
+ guilt-help | 2 +-
+ guilt-import | 2 +-
+ guilt-import-commit | 2 +-
+ guilt-init | 4 ++--
+ guilt-new | 2 +-
+ guilt-next | 2 +-
+ guilt-patchbomb | 2 +-
+ guilt-pop | 2 +-
+ guilt-prev | 2 +-
+ guilt-push | 2 +-
+ guilt-rebase | 2 +-
+ guilt-refresh | 2 +-
+ guilt-rm | 2 +-
+ guilt-series | 2 +-
+ guilt-status | 2 +-
+ guilt-top | 2 +-
+ guilt-unapplied | 2 +-
+ 29 files changed, 30 insertions(+), 30 deletions(-)
+
+--- a/guilt
++++ b/guilt
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006-2010
+ #
+--- a/guilt-add
++++ b/guilt-add
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-applied
++++ b/guilt-applied
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-branch
++++ b/guilt-branch
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2007-2008
+ #
+--- a/guilt-delete
++++ b/guilt-delete
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-diff
++++ b/guilt-diff
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (C) 2007 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
+ #
+--- a/guilt-export
++++ b/guilt-export
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Pierre Habouzit, 2007
+ #
+--- a/guilt-files
++++ b/guilt-files
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (C) 2007 Yasushi SHOJI <yashi@atmark-techno.com>
+ #
+--- a/guilt-fold
++++ b/guilt-fold
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-fork
++++ b/guilt-fork
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2007
+ #
+--- a/guilt-graph
++++ b/guilt-graph
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2007
+ #
+--- a/guilt-header
++++ b/guilt-header
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006-2010
+ #
+--- a/guilt-help
++++ b/guilt-help
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2007
+ #
+--- a/guilt-import
++++ b/guilt-import
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2007
+ #
+--- a/guilt-import-commit
++++ b/guilt-import-commit
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2007
+ #
+--- a/guilt-init
++++ b/guilt-init
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+@@ -31,7 +31,7 @@ touch "$GUILT_DIR/$branch/status"
+
+ mkdir -p "$GIT_DIR/hooks/guilt"
+ cat > "$GIT_DIR/hooks/guilt/delete" <<EOF
+-#!/bin/sh
++#!/bin/bash
+ # Usage: <script> <patch being removed>
+
+ echo "Removing patch '\$1'..."
+--- a/guilt-new
++++ b/guilt-new
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-next
++++ b/guilt-next
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-patchbomb
++++ b/guilt-patchbomb
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2007
+ #
+--- a/guilt-pop
++++ b/guilt-pop
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-prev
++++ b/guilt-prev
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-push
++++ b/guilt-push
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-rebase
++++ b/guilt-rebase
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2007
+ #
+--- a/guilt-refresh
++++ b/guilt-refresh
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-rm
++++ b/guilt-rm
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-series
++++ b/guilt-series
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-status
++++ b/guilt-status
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-top
++++ b/guilt-top
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
+--- a/guilt-unapplied
++++ b/guilt-unapplied
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/bin/bash
+ #
+ # Copyright (c) Josef "Jeff" Sipek, 2006, 2007
+ #
diff --git a/meta/recipes-devtools/guilt/files/guilt-import-commit.patch b/meta/recipes-devtools/guilt/files/guilt-import-commit.patch
new file mode 100644
index 000000000..78cc93e5d
--- /dev/null
+++ b/meta/recipes-devtools/guilt/files/guilt-import-commit.patch
@@ -0,0 +1,94 @@
+guilt: import commits via git format-patch
+
+Rather than attempting to process commits directly, it
+is preferable to try dumping the change via git format-patch
+to take advantage of the proper header/subject/from lines that
+are generated.
+
+If patches cannot be exported, fall back to importing
+commits via a more custom method.
+
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+
+---
+ guilt-import-commit | 40 +++++++++++++++++++++++++++++-----------
+ 1 file changed, 29 insertions(+), 11 deletions(-)
+
+--- a/guilt-import-commit
++++ b/guilt-import-commit
+@@ -20,46 +20,64 @@ fi
+ disp "About to begin conversion..." >&2
+ disp "Current head: `cat $GIT_DIR/refs/heads/$branch`" >&2
+
++# try git-format-patch first, if it fails fall back to internal
++# methods.
++patches=`git-format-patch -o $GUILT_DIR/$branch $rhash`
++if [ -z "$patches" ]; then
++ need_custom_patches="1"
++fi
++
+ for rev in `git rev-list $rhash`; do
++ if [ ! -z "$need_custom_patches" ]; then
+ s=`git log --pretty=oneline -1 $rev | cut -c 42-`
+
+ fname=`echo $s | sed -e "s/&/and/g" -e "s/[ :]/_/g" -e "s,[/\\],-,g" \
+- -e "s/['\\[{}]//g" -e 's/]//g' -e 's/\*/-/g' \
++ -e "s/['\\()<>[{}]//g" -e 's/]//g' -e 's/\*/-/g' \
+ -e 's/\?/-/g' | tr A-Z a-z`
+
+- disp "Converting `echo $rev | cut -c 1-8` as $fname"
++ disp "Converting `echo $rev | cut -c 1-8` as $fname.patch"
+
+ mangle_prefix=1
+ fname_base=$fname
+- while [ -f "$GUILT_DIR/$branch/$fname" ]; do
++ while [ -f "$GUILT_DIR/$branch/$fname.patch" ]; do
+ fname="$fname_base-$mangle_prefix"
+ mangle_prefix=`expr $mangle_prefix + 1`
+- disp "Patch under that name exists...trying '$fname'"
++ disp "Patch under that name exists...trying '$fname.patch'"
+ done
+
+ (
+ do_make_header $rev
+ echo ""
+ git diff --binary $rev^..$rev
+- ) > $GUILT_DIR/$branch/$fname
++ ) > $GUILT_DIR/$branch/$fname.patch
+
+ # FIXME: grab the GIT_AUTHOR_DATE from the commit object and set the
+ # timestamp on the patch
+
+- # insert the patch name into the series file
+- series_insert_patch $fname
++ patches="$patches $fname.patch"
++ fi
+
+- # Only reset if the commit was on this branch
+- if head_check $rev 2> /dev/null; then
++ # Only reset if the commit was on this branch
++ if head_check $rev 2> /dev/null; then
+ # BEWARE: "git reset" ahead! Is there a way to verify that
+ # we really created a patch? - We don't want to lose any
+ # history.
+ git reset --hard $rev^ > /dev/null
+- elif [ -z "$warned" ]; then
++ elif [ -z "$warned" ]; then
+ disp "Warning: commit $rev is not the HEAD...preserving commit" >&2
+ disp "Warning: (this message is displayed only once)" >&2
+ warned=t
+- fi
++ fi
++done
++
++rpatches=`echo "$patches" | sed 's% %\n%g' | tac`
++for patch in $rpatches; do
++
++ iname=`echo $patch | sed s%$GUILT_DIR/$branch/%%`
++ echo "Inserting $iname"
++
++ # insert the patch name into the series file
++ series_insert_patch $iname
+ done
+
+ disp "Done." >&2
diff --git a/meta/recipes-devtools/guilt/files/guilt-init.patch b/meta/recipes-devtools/guilt/files/guilt-init.patch
new file mode 100644
index 000000000..a06da5bf7
--- /dev/null
+++ b/meta/recipes-devtools/guilt/files/guilt-init.patch
@@ -0,0 +1,23 @@
+guilt: allow previously initialized branches to be re-initialized
+
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+
+---
+ guilt-init | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/guilt-init
++++ b/guilt-init
+@@ -20,9 +20,9 @@ while case $# in 0) break ;; esac; do
+ shift
+ done
+
+-if [ -d "$GUILT_DIR/$branch" ]; then
+- die "Branch $branch appears to be already initialized (GIT_DIR=$GIT_DIR)"
+-fi
++# if [ -d "$GUILT_DIR/$branch" ]; then
++# die "Branch $branch appears to be already initialized (GIT_DIR=$GIT_DIR)"
++# fi
+
+ [ ! -d "$GUILT_DIR" ] && mkdir "$GUILT_DIR"
+ mkdir -p "$GUILT_DIR/$branch"
diff --git a/meta/recipes-devtools/guilt/files/guilt-pop.patch b/meta/recipes-devtools/guilt/files/guilt-pop.patch
new file mode 100644
index 000000000..c26b324cc
--- /dev/null
+++ b/meta/recipes-devtools/guilt/files/guilt-pop.patch
@@ -0,0 +1,71 @@
+guilt: pop and delete tags
+
+Add support for popping to a tag and the ability to delete
+a tag while popping from the tree
+
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+
+---
+ guilt-pop | 28 ++++++++++++++++++++++++++--
+ 1 file changed, 26 insertions(+), 2 deletions(-)
+
+--- a/guilt-pop
++++ b/guilt-pop
+@@ -17,6 +17,13 @@ while [ $# -gt 0 ]; do
+ -n)
+ num=t
+ ;;
++ -t|--t)
++ tag=$2
++ shift
++ ;;
++ -d|--d) # can only be used with --t
++ delete_tag=t
++ ;;
+ *)
+ break
+ ;;
+@@ -24,7 +31,7 @@ while [ $# -gt 0 ]; do
+ shift
+ done
+
+-# "guilt-pop" or "guilt-pop foo" or "guilt-pop -n foo"
++# "guilt-pop" or "guilt-pop foo" or "guilt-pop -n foo" or "guilt-pop -t <tag>"
+ if [ -z "$all" ] && [ $# -gt 1 ]; then
+ usage
+ fi
+@@ -44,12 +51,26 @@ fi
+ patch="$1"
+ [ ! -z "$all" ] && patch="-a"
+
++
++# tag processing will just roll into another one of
++# the pop types, number or patch name
++if [ ! -z "$tag" ]; then
++ git-rev-list HEAD ^$tag > /dev/null 2>/dev/null
++ if [ $? -eq 0 ]; then
++ revs="`git-rev-list HEAD ^$tag`"
++ num=`echo "$revs" | wc -l`
++ patch=$num
++ else
++ echo "Cannot find tag $tag";
++ exit 0
++ fi
++fi
++
+ if [ ! -s "$applied" ]; then
+ disp "No patches applied."
+ exit 0
+ elif [ "$patch" = "-a" ]; then
+ # we are supposed to pop all patches
+-
+ sidx=`wc -l < $applied`
+ eidx=0
+ elif [ ! -z "$num" ]; then
+@@ -96,3 +117,6 @@ pop_many_patches `git rev-parse refs/pat
+ p=`get_top`
+ [ ! -z "$p" ] && disp "Now at $p." || disp "All patches popped."
+
++if [ ! -z "$delete_tag" ]; then
++ git tag -d $tag
++fi;
diff --git a/meta/recipes-devtools/guilt/files/guilt-push-no-series.patch b/meta/recipes-devtools/guilt/files/guilt-push-no-series.patch
new file mode 100644
index 000000000..d40119c71
--- /dev/null
+++ b/meta/recipes-devtools/guilt/files/guilt-push-no-series.patch
@@ -0,0 +1,27 @@
+guilt-push: Avoid duplicate hits in a series
+
+If a series file becomes mangled and a patch name appears in there
+more than once, then the guilt-push will fail a horrible and
+incomprehensible death. Make it fail in a sensible way.
+
+Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
+
+---
+
+ guilt-push | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/guilt-push
++++ b/guilt-push
+@@ -90,6 +90,11 @@ else
+ if [ -z "$eidx" ]; then
+ die "Patch $patch is not in the series or is guarded."
+ fi
++
++ matches=`echo $eidx | wc -w`
++ if [ $matches -gt 1 ]; then
++ die "Patch $patch is in the series multiple times"
++ fi
+ fi
+
+ # make sure that there are no unapplied changes
diff --git a/meta/recipes-devtools/guilt/files/guilt-push.patch b/meta/recipes-devtools/guilt/files/guilt-push.patch
new file mode 100644
index 000000000..218432959
--- /dev/null
+++ b/meta/recipes-devtools/guilt/files/guilt-push.patch
@@ -0,0 +1,40 @@
+guilt: add support for pushing and tagging
+
+It can be handy to push AND tag at the same time.
+
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+
+---
+
+ guilt-push | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+--- a/guilt-push
++++ b/guilt-push
+@@ -19,7 +19,11 @@ while [ $# -gt 0 ]; do
+ -n)
+ num=t
+ ;;
+- *)
++ -t|--t)
++ tag=$2
++ shift
++ ;;
++ *)
+ break
+ ;;
+ esac
+@@ -126,3 +130,13 @@ do
+ fi
+ done
+
++ret=$?
++if [ $ret -ne 0 ]; then
++ exit $ret
++fi
++
++# if a tag was specified, tag the tree now.
++if [ -n "$tag" ]; then
++ git-rev-parse HEAD > "$GIT_DIR/refs/tags/$tag"
++fi
++
diff --git a/meta/recipes-devtools/guilt/files/guilt-set-git_exec_path.patch b/meta/recipes-devtools/guilt/files/guilt-set-git_exec_path.patch
new file mode 100644
index 000000000..92e75f29e
--- /dev/null
+++ b/meta/recipes-devtools/guilt/files/guilt-set-git_exec_path.patch
@@ -0,0 +1,27 @@
+guilt: set GIT_EXEC_PATH in guilt wrapper
+
+git has the habit of tracking the directory where it was
+installed. If you build git, relocate git and then remove
+the old directory --exec-path will return that original
+(now non-existent) directory. We insist that git and
+guilt be in the same directory to ensure they are matched,
+so we use the environment variable GIT_EXEC_PATH to
+force the issue.
+
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+
+---
+ guilt | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/guilt
++++ b/guilt
+@@ -23,6 +23,8 @@ esac
+ # we change directories ourselves
+ SUBDIRECTORY_OK=1
+
++export GIT_EXEC_PATH=`dirname $0`/../libexec/git-core
++
+ if [ -z "$DO_NOT_USE_GITREPO_COMMANDS" ]; then
+ . "$(git --exec-path)/git-sh-setup"
+ fi
diff --git a/meta/recipes-devtools/guilt/files/guilt.patch b/meta/recipes-devtools/guilt/files/guilt.patch
new file mode 100644
index 000000000..a3352cf81
--- /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)
diff --git a/meta/recipes-devtools/guilt/files/improve_auto_header_gen.patch b/meta/recipes-devtools/guilt/files/improve_auto_header_gen.patch
new file mode 100644
index 000000000..b98ec5e9f
--- /dev/null
+++ b/meta/recipes-devtools/guilt/files/improve_auto_header_gen.patch
@@ -0,0 +1,69 @@
+guilt: improve the generation of an automatic header
+
+Patches that do not have a proper header are encountered when generating
+a tree. This improves the detection of these patches and generates a sane
+header so the eventual commit will be coherent
+
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+
+---
+
+ guilt | 24 ++++++++++++++++++------
+ 1 file changed, 18 insertions(+), 6 deletions(-)
+
+--- a/guilt
++++ b/guilt
+@@ -591,7 +591,12 @@ commit()
+ fi
+
+ # last try: make a default commit message if patch doesn't contain one
+- [ ! -s "$TMP_MSG" ] && echo "auto_msg: patch $pname" > "$TMP_MSG"
++ if [ ! -s "$TMP_MSG" ]; then
++ echo "auto_msg: importing `basename $pname`" > "$TMP_MSG"
++ echo "" >> "$TMP_MSG"
++ echo "This is an automatic import of patch $pname, no headers were" >> "$TMP_MSG"
++ echo "detected and a default message was constructed" >> "$TMP_MSG"
++ fi
+
+
+ if [ "$header_type" = "guilt" ]; then
+@@ -599,12 +604,14 @@ commit()
+ # 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/[^<]*//'`"
++ if [ -z "$author_str" ]; then
++ author_str="auto commit <unknown@unknown>"
+ fi
+
++ 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/[^<]*//'`"
++
+
+ # check in the patch for a subject
+ SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' "$p")"
+@@ -615,6 +622,11 @@ commit()
+ if [ ${#SUBJECT} -gt 60 ]; then
+ SUBJECT=${SUBJECT: -60}
+ fi
++
++ # remove the line from the tmp msg
++ mv "$TMP_MSG" "$TMP_MSG.work"
++ cat "$TMP_MSG.work" | grep -v -E ".*$SUBJECT.*" > "$TMP_MSG"
++ rm "$TMP_MSG.work"
+ fi
+
+ if [ -z "$SUBJECT" ]; then
+@@ -629,7 +641,7 @@ commit()
+
+ SUBJECT=`echo $SUBJECT | sed s'%^ *%%'`
+
+- if [ ! -z "$SUBJECT" ]; then
++ if [ -n "$SUBJECT" ]; then
+ echo "$SUBJECT" >> $TMP_MSG.subject
+ echo "" >> $TMP_MSG.subject
+ cat "$TMP_MSG" >> $TMP_MSG.subject
diff --git a/meta/recipes-devtools/guilt/files/make_git_commands_conditional.patch b/meta/recipes-devtools/guilt/files/make_git_commands_conditional.patch
new file mode 100644
index 000000000..b6d40dbc9
--- /dev/null
+++ b/meta/recipes-devtools/guilt/files/make_git_commands_conditional.patch
@@ -0,0 +1,46 @@
+guilt: allow operation outside of git repos
+
+Sometimes guilt is sourced when there isn't a containing git repository.
+Some of the git commands that are always called will report errors
+unecesarility in this scenario. This adds a variable that will inhibit
+those problematic calls
+
+Signed-off-by <bruce.ashfield@windriver.com>
+
+---
+
+ guilt | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+
+--- a/guilt
++++ b/guilt
+@@ -23,7 +23,9 @@ esac
+ # we change directories ourselves
+ SUBDIRECTORY_OK=1
+
+-. "$(git --exec-path)/git-sh-setup"
++if [ -z "$DO_NOT_USE_GITREPO_COMMANDS" ]; then
++ . "$(git --exec-path)/git-sh-setup"
++fi
+
+ #
+ # Git version check
+@@ -921,14 +923,15 @@ diffstat=`git config --bool guilt.diffst
+ # The following gets run every time this file is source'd
+ #
+
+-
+ # GUILT_DIR="$GIT_DIR/patches"
+ if [ -z "$GUILT_BASE" ]; then
+ GUILT_BASE=wrs
+ fi
+ GUILT_DIR="$GUILT_BASE/patches"
+
+-branch=`get_branch`
++if [ -z "$DO_NOT_USE_GITREPO_COMMANDS" ]; then
++ branch=`get_branch`
++fi
+
+ # most of the time we want to verify that the repo's branch has been
+ # initialized, but every once in a blue moon (e.g., we want to run guilt-init),
diff --git a/meta/recipes-devtools/guilt/files/optional_head_check.patch b/meta/recipes-devtools/guilt/files/optional_head_check.patch
new file mode 100644
index 000000000..368d63b6a
--- /dev/null
+++ b/meta/recipes-devtools/guilt/files/optional_head_check.patch
@@ -0,0 +1,58 @@
+guilt: allow guilt-push to opt out of head checking
+
+Depending on the method used to construct a tree, it is entirely
+possible that branches are not only made up of guilt created commits.
+This mixed mode is valid, and in particular is valid when applying
+patches to a tree.
+
+In the default mode of operation, you will see a warning such as
+this when working on a branch:
+
+Expected HEAD commit dbd5861f81a92b8b329561f94b8575c7ee6768b6
+ got 3e8e6f6bd9f1772b91fc1fe9949f541d0560b487
+
+This looks severe, but is harmless during tree construction,
+since even if the HEAD commit was expected, you can still run into
+issues pushing a patch. This is particularly seen when templates are
+adding patches to a kernel.
+
+To make this look less ominous, we make the head check for patch
+pushing opt-in. Which means that by default, you'll no longer see
+this warning if you work with a mixed mode branch during tree
+construction.
+
+Other modes such as pop or refresh can run into problems when
+the HEAD commit isn't tracked or expected, so they should remained
+checked.
+
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+
+---
+ guilt | 3 +++
+ guilt-push | 3 +++
+ 2 files changed, 6 insertions(+)
+
+--- a/guilt
++++ b/guilt
+@@ -417,6 +417,9 @@ head_check()
+ return 0 ;;
+ esac
+
++ # If do_head_check isn't set, bail, we are "opt-in"
++ [ -z "$do_head_check" ] && return 0
++
+ if [ "`git rev-parse refs/heads/$branch`" != "`git rev-parse $1`" ]; then
+ disp "Expected HEAD commit $1" >&2
+ disp " got `git rev-parse refs/heads/$branch`" >&2
+--- a/guilt-push
++++ b/guilt-push
+@@ -23,6 +23,9 @@ while [ $# -gt 0 ]; do
+ tag=$2
+ shift
+ ;;
++ --head_check)
++ do_head_check=t
++ ;;
+ *)
+ break
+ ;;
diff --git a/meta/recipes-devtools/guilt/files/uninstall_force.patch b/meta/recipes-devtools/guilt/files/uninstall_force.patch
new file mode 100644
index 000000000..8c9067dd4
--- /dev/null
+++ b/meta/recipes-devtools/guilt/files/uninstall_force.patch
@@ -0,0 +1,12 @@
+guilt: force removal when uninstalling
+
+Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
+
+--- a/uninstall.orig
++++ b/uninstall
+@@ -12,4 +12,4 @@
+
+ shift
+
+-(cd $PRE; rm "$@")
++(cd $PRE; rm -f "$@")
diff --git a/meta/recipes-devtools/guilt/guilt-native_0.33.bb b/meta/recipes-devtools/guilt/guilt-native_0.33.bb
new file mode 100644
index 000000000..62d91f695
--- /dev/null
+++ b/meta/recipes-devtools/guilt/guilt-native_0.33.bb
@@ -0,0 +1,30 @@
+DESCRIPTION = "guilt is quilt like tool for git"
+LICENSE = "GPL"
+
+PR = r0
+PV = "0.33"
+
+inherit native
+
+SRC_URI = "http://www.kernel.org/pub/linux/kernel/people/jsipek/guilt/guilt-${PV}.tar.gz\
+ file://guilt-push.patch \
+ file://guilt-pop.patch \
+ file://guilt.patch \
+ file://guilt-init.patch \
+ file://guilt-import-commit.patch \
+ file://uninstall_force.patch \
+ file://guilt-push-no-series.patch \
+ file://make_git_commands_conditional.patch \
+ file://improve_auto_header_gen.patch \
+ file://guilt-set-git_exec_path.patch \
+ file://guilt-bash.patch \
+ file://optional_head_check.patch"
+
+# we don't compile, we just install
+do_compile() {
+ :
+}
+
+do_install() {
+ oe_runmake PREFIX=${D}/${base_prefix}/usr install
+} \ No newline at end of file