From 2cf104f7e09d620b9c04122d15ce347db34f9577 Mon Sep 17 00:00:00 2001 From: Bruce Ashfield Date: Tue, 10 Aug 2010 15:01:37 -0400 Subject: guilt: import guilt for kernel patch management The Wind River kernel is "patched" via guilt to provide both git integration and quilt like patch management (if that is of interest). This is a modified 0.33 guilt with some changes to streamline interactions with the way that the Wind River kernel is constructed. That being said, the common semantics of guilt are not changed, and it can be used for other purposes. Signed-off-by: Bruce Ashfield --- meta/packages/guilt/files/guilt-bash.patch | 286 +++++++++++++++++++ .../packages/guilt/files/guilt-import-commit.patch | 94 ++++++ meta/packages/guilt/files/guilt-init.patch | 23 ++ meta/packages/guilt/files/guilt-pop.patch | 71 +++++ .../guilt/files/guilt-push-no-series.patch | 27 ++ meta/packages/guilt/files/guilt-push.patch | 40 +++ .../guilt/files/guilt-set-git_exec_path.patch | 27 ++ meta/packages/guilt/files/guilt.patch | 317 +++++++++++++++++++++ .../guilt/files/improve_auto_header_gen.patch | 69 +++++ .../files/make_git_commands_conditional.patch | 46 +++ .../packages/guilt/files/optional_head_check.patch | 58 ++++ meta/packages/guilt/files/uninstall_force.patch | 12 + meta/packages/guilt/guilt-native_0.33.bb | 30 ++ 13 files changed, 1100 insertions(+) create mode 100644 meta/packages/guilt/files/guilt-bash.patch create mode 100644 meta/packages/guilt/files/guilt-import-commit.patch create mode 100644 meta/packages/guilt/files/guilt-init.patch create mode 100644 meta/packages/guilt/files/guilt-pop.patch create mode 100644 meta/packages/guilt/files/guilt-push-no-series.patch create mode 100644 meta/packages/guilt/files/guilt-push.patch create mode 100644 meta/packages/guilt/files/guilt-set-git_exec_path.patch create mode 100644 meta/packages/guilt/files/guilt.patch create mode 100644 meta/packages/guilt/files/improve_auto_header_gen.patch create mode 100644 meta/packages/guilt/files/make_git_commands_conditional.patch create mode 100644 meta/packages/guilt/files/optional_head_check.patch create mode 100644 meta/packages/guilt/files/uninstall_force.patch create mode 100644 meta/packages/guilt/guilt-native_0.33.bb (limited to 'meta') diff --git a/meta/packages/guilt/files/guilt-bash.patch b/meta/packages/guilt/files/guilt-bash.patch new file mode 100644 index 000000000..d2058e8cf --- /dev/null +++ b/meta/packages/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 + +--- + 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 + # +--- 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 + # +--- 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" < + + 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/packages/guilt/files/guilt-import-commit.patch b/meta/packages/guilt/files/guilt-import-commit.patch new file mode 100644 index 000000000..78cc93e5d --- /dev/null +++ b/meta/packages/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 + +--- + 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/packages/guilt/files/guilt-init.patch b/meta/packages/guilt/files/guilt-init.patch new file mode 100644 index 000000000..a06da5bf7 --- /dev/null +++ b/meta/packages/guilt/files/guilt-init.patch @@ -0,0 +1,23 @@ +guilt: allow previously initialized branches to be re-initialized + +Signed-off-by: Bruce Ashfield + +--- + 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/packages/guilt/files/guilt-pop.patch b/meta/packages/guilt/files/guilt-pop.patch new file mode 100644 index 000000000..c26b324cc --- /dev/null +++ b/meta/packages/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 + +--- + 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 " + 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/packages/guilt/files/guilt-push-no-series.patch b/meta/packages/guilt/files/guilt-push-no-series.patch new file mode 100644 index 000000000..d40119c71 --- /dev/null +++ b/meta/packages/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 + +--- + + 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/packages/guilt/files/guilt-push.patch b/meta/packages/guilt/files/guilt-push.patch new file mode 100644 index 000000000..218432959 --- /dev/null +++ b/meta/packages/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 + +--- + + 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/packages/guilt/files/guilt-set-git_exec_path.patch b/meta/packages/guilt/files/guilt-set-git_exec_path.patch new file mode 100644 index 000000000..92e75f29e --- /dev/null +++ b/meta/packages/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 + +--- + 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/packages/guilt/files/guilt.patch b/meta/packages/guilt/files/guilt.patch new file mode 100644 index 000000000..a3352cf81 --- /dev/null +++ b/meta/packages/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 + +--- + 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 + series_remove_patch() + { +@@ -473,8 +500,7 @@ remove_patch_refs() + # usage: pop_many_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/packages/guilt/files/improve_auto_header_gen.patch b/meta/packages/guilt/files/improve_auto_header_gen.patch new file mode 100644 index 000000000..b98ec5e9f --- /dev/null +++ b/meta/packages/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 + +--- + + 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 " + 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/packages/guilt/files/make_git_commands_conditional.patch b/meta/packages/guilt/files/make_git_commands_conditional.patch new file mode 100644 index 000000000..b6d40dbc9 --- /dev/null +++ b/meta/packages/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 + +--- + + 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/packages/guilt/files/optional_head_check.patch b/meta/packages/guilt/files/optional_head_check.patch new file mode 100644 index 000000000..368d63b6a --- /dev/null +++ b/meta/packages/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 + +--- + 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/packages/guilt/files/uninstall_force.patch b/meta/packages/guilt/files/uninstall_force.patch new file mode 100644 index 000000000..8c9067dd4 --- /dev/null +++ b/meta/packages/guilt/files/uninstall_force.patch @@ -0,0 +1,12 @@ +guilt: force removal when uninstalling + +Signed-off-by: Bruce Ashfield + +--- a/uninstall.orig ++++ b/uninstall +@@ -12,4 +12,4 @@ + + shift + +-(cd $PRE; rm "$@") ++(cd $PRE; rm -f "$@") diff --git a/meta/packages/guilt/guilt-native_0.33.bb b/meta/packages/guilt/guilt-native_0.33.bb new file mode 100644 index 000000000..62d91f695 --- /dev/null +++ b/meta/packages/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 -- cgit v1.2.3