diff options
Diffstat (limited to 'meta/recipes-devtools/guilt')
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 |