summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/guilt/files/guilt.patch
diff options
context:
space:
mode:
authorRichard Purdie <rpurdie@linux.intel.com>2010-08-27 15:14:24 +0100
committerRichard Purdie <rpurdie@linux.intel.com>2010-08-27 15:29:45 +0100
commit29d6678fd546377459ef75cf54abeef5b969b5cf (patch)
tree8edd65790e37a00d01c3f203f773fe4b5012db18 /meta/recipes-devtools/guilt/files/guilt.patch
parentda49de6885ee1bc424e70bc02f21f6ab920efb55 (diff)
downloadpoky-29d6678fd546377459ef75cf54abeef5b969b5cf.tar.gz
Major layout change to the packages directory
Having one monolithic packages directory makes it hard to find things and is generally overwhelming. This commit splits it into several logical sections roughly based on function, recipes.txt gives more information about the classifications used. The opportunity is also used to switch from "packages" to "recipes" as used in OpenEmbedded as the term "packages" can be confusing to people and has many different meanings. Not all recipes have been classified yet, this is just a first pass at separating things out. Some packages are moved to meta-extras as they're no longer actively used or maintained. Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
Diffstat (limited to 'meta/recipes-devtools/guilt/files/guilt.patch')
-rw-r--r--meta/recipes-devtools/guilt/files/guilt.patch317
1 files changed, 317 insertions, 0 deletions
diff --git a/meta/recipes-devtools/guilt/files/guilt.patch b/meta/recipes-devtools/guilt/files/guilt.patch
new file mode 100644
index 0000000000..a3352cf810
--- /dev/null
+++ b/meta/recipes-devtools/guilt/files/guilt.patch
@@ -0,0 +1,317 @@
1guilt: enhanced patch queue management
2
3guilt prefers to track the status and series of patches
4under .git/patches. But this location doesn't allow the
5status of a quilt queue to be committed to a secondary
6repository and later restored.
7
8This change does three things:
9
10 - allows GUILT_BASE to be changed (with a default to "wrs")
11 - allows shadow tracking of the patches (for rebase)
12 - enhances the header detection and creation of patches
13 as they are pushed onto the tree.
14
15Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
16
17---
18 guilt | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
19 1 file changed, 159 insertions(+), 24 deletions(-)
20
21--- a/guilt
22+++ b/guilt
23@@ -153,14 +153,16 @@ get_branch()
24
25 verify_branch()
26 {
27- [ ! -d "$GIT_DIR/patches" ] &&
28+ [ ! -d "$GUILT_DIR" ] &&
29 die "Patches directory doesn't exist, try guilt-init"
30- [ ! -d "$GIT_DIR/patches/$branch" ] &&
31+ [ ! -d "$GUILT_DIR/$branch" ] &&
32 die "Branch $branch is not initialized, try guilt-init"
33- [ ! -f "$GIT_DIR/patches/$branch/series" ] &&
34+ [ ! -f "$GUILT_DIR/$branch/series" ] &&
35 die "Branch $branch does not have a series file"
36- [ ! -f "$GIT_DIR/patches/$branch/status" ] &&
37+ [ ! -f "$GUILT_DIR/$branch/status" ] &&
38 die "Branch $branch does not have a status file"
39+ [ -f "$GUILT_DIR/$branch/applied" ] &&
40+ die "Warning: Branch $branch has 'applied' file - guilt is not compatible with stgit"
41 [ -f "$GIT_DIR/patches/$branch/applied" ] &&
42 die "Warning: Branch $branch has 'applied' file - guilt is not compatible with stgit"
43 }
44@@ -339,6 +341,17 @@ BEGIN{}
45 '
46 }
47
48+# usage: do_get_only_patch patchfile
49+# similar to do_get_patch except everything leading up to
50+# the first diff line and after the last chunk are removed
51+do_get_only_patch()
52+{
53+ cat "$1" | awk '
54+BEGIN{}
55+/^(diff )/,/^(-- |END{})/
56+' | sed '/^-- *$/D'
57+}
58+
59 # usage: do_get_header patchfile
60 do_get_header()
61 {
62@@ -352,8 +365,13 @@ do_get_header()
63 BEGIN{skip=0}
64 /^Subject:/ && (NR==1){print substr($0, 10); next}
65 /^From:/{skip=1; next}
66+/^Author:/{skip=1; next}
67+/^Date:/{skip=1; next}
68+/^commit/{skip=1; next}
69 /^[ \t\f\n\r\v]*$/ && (skip==1){skip=0; next}
70 /^(diff |---$|--- )/{exit}
71+/^diff --git/{exit}
72+/^Index: /{exit}
73 {print $0}
74 END{}
75 '
76@@ -415,6 +433,15 @@ series_insert_patch()
77 mv "$series.tmp" "$series"
78 }
79
80+series_append_patch()
81+{
82+ # unlike series_insert_patch, which inserts the passed
83+ # patch after the current top patch, this function always
84+ # appends the patch to the series
85+
86+ echo $1 >> "$series"
87+}
88+
89 # usage: series_remove_patch <patchname>
90 series_remove_patch()
91 {
92@@ -473,8 +500,7 @@ remove_patch_refs()
93 # usage: pop_many_patches <commitish> <number of patches>
94 pop_many_patches()
95 {
96- assert_head_check
97-
98+ head_check "`tail -1 < "$applied" | cut -d: -f 1`"
99 (
100 cd_to_toplevel
101
102@@ -508,50 +534,149 @@ remove_ref()
103 )
104 }
105
106+prep_patch()
107+{
108+ patch=$1;
109+ tgt=$2;
110+
111+ if test -f $patch; then
112+ case $patch in
113+ *.gz) gzip -dc $patch > $tgt ;;
114+ *.bz2) bzip2 -dc $patch > $tgt ;;
115+ *) cp $patch $tgt ;;
116+ esac;
117+ fi;
118+}
119+
120 # usage: commit patchname parent
121 commit()
122 {
123 (
124 TMP_MSG=`get_tmp_file msg`
125+ TMP_PATCH=`get_tmp_file patch`
126+ TMP_PATCH_OUT=`get_tmp_file patch_out`
127+ TMP_INFO=`get_tmp_file info`
128
129 p="$GUILT_DIR/$branch/$1"
130 pname="$1"
131+ prep_patch "$p" "$TMP_PATCH"
132+ p=$TMP_PATCH
133+
134 cd_to_toplevel
135
136 git diff-files --name-only | (while read n; do git update-index "$n" ; done)
137
138+ # borrowed from git-am
139+ header_type=git
140+ git mailinfo "$TMP_MSG" "$TMP_PATCH_OUT" \
141+ <"$p" >"$TMP_INFO";
142+
143+ # skip pine's internal folder data
144+ grep '^Author: Mail System Internal Data$' \
145+ <"$TMP_INFO" >/dev/null
146+
147+ git stripspace < "$TMP_MSG" > "$TMP_MSG.clean"
148+ mv "$TMP_MSG.clean" "$TMP_MSG"
149+ git stripspace < "$TMP_INFO" > "$TMP_INFO.clean"
150+ mv "$TMP_INFO.clean" "$TMP_INFO"
151+
152+ # If mailinfo couldn't get something , try another way
153 # grab a commit message out of the patch
154- do_get_header "$p" > "$TMP_MSG"
155+ if [ ! -s "$TMP_MSG" ] || [ ! -s "$TMP_INFO" ]; then
156+ do_get_header "$p" > "$TMP_MSG"
157+ header_type=guilt
158+ fi
159
160- # make a default commit message if patch doesn't contain one
161- [ ! -s "$TMP_MSG" ] && echo "patch $pname" > "$TMP_MSG"
162+ # last try: make a default commit message if patch doesn't contain one
163+ [ ! -s "$TMP_MSG" ] && echo "auto_msg: patch $pname" > "$TMP_MSG"
164
165- # extract a From line from the patch header, and set
166- # GIT_AUTHOR_{NAME,EMAIL}
167- author_str=`sed -n -e '/^From:/ { s/^From: //; p; q; }; /^(diff |---$|--- )/ q' "$p"`
168- if [ ! -z "$author_str" ]; then
169+
170+ if [ "$header_type" = "guilt" ]; then
171+
172+ # extract a From line from the patch header, and set
173+ # GIT_AUTHOR_{NAME,EMAIL}
174+ author_str=`sed -n -e '/^From:/ { s/^From: //; p; q }; /^(diff |---)/ q' "$p"`
175+ if [ ! -z "$author_str" ]; then
176 GIT_AUTHOR_NAME=`echo $author_str | sed -e 's/ *<.*$//'`
177 export GIT_AUTHOR_NAME="${GIT_AUTHOR_NAME:-" "}"
178 export GIT_AUTHOR_EMAIL="`echo $author_str | sed -e 's/[^<]*//'`"
179- fi
180+ fi
181+
182+
183+ # check in the patch for a subject
184+ SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' "$p")"
185+ if [ -z "$SUBJECT" ]; then
186+ # if we can't find a subject in the patch, then let's construct
187+ # one from the header of the patch itself
188+ SUBJECT=`cat "$TMP_MSG" | head -n 1`
189+ if [ ${#SUBJECT} -gt 60 ]; then
190+ SUBJECT=${SUBJECT: -60}
191+ fi
192+ fi
193+
194+ if [ -z "$SUBJECT" ]; then
195+ # if we are *still* without a subject, then just use
196+ # the patch name
197+ SUBJECT=`echo $1 | sed 's%^patch *%%'`
198+
199+ if [ ${#SUBJECT} -gt 60 ]; then
200+ SUBJECT=${SUBJECT: -60}
201+ fi
202+ fi
203
204- # must strip nano-second part otherwise git gets very
205- # confused, and makes up strange timestamps from the past
206- # (chances are it decides to interpret it as a unix
207- # timestamp).
208- export GIT_AUTHOR_DATE="`stat -c %y "$p" | sed -e '
209+ SUBJECT=`echo $SUBJECT | sed s'%^ *%%'`
210+
211+ if [ ! -z "$SUBJECT" ]; then
212+ echo "$SUBJECT" >> $TMP_MSG.subject
213+ echo "" >> $TMP_MSG.subject
214+ cat "$TMP_MSG" >> $TMP_MSG.subject
215+ mv "$TMP_MSG.subject" "$TMP_MSG"
216+ fi
217+
218+ # must strip nano-second part otherwise git gets very
219+ # confused, and makes up strange timestamps from the past
220+ # (chances are it decides to interpret it as a unix
221+ # timestamp).
222+ export GIT_AUTHOR_DATE="`stat -c %y "$p" | sed -e '\
223 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/'`"
224- export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
225+ export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
226+ else
227+ # using git headers, closely related to git-am
228+
229+ GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' "$TMP_INFO")"
230+ GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' "$TMP_INFO")"
231+ GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$TMP_INFO")"
232+ if test -z "$GIT_AUTHOR_EMAIL"
233+ then
234+ echo "Warning: patch does not have a valid e-mail address."
235+ GIT_AUTHOR_EMAIL=$GIT_AUTHOR_NAME
236+ fi
237+
238+ SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' "$TMP_INFO")"
239+ if [ ! -z "$SUBJECT" ]; then
240+ echo "$SUBJECT" >> $TMP_MSG.subject
241+ echo "" >> $TMP_MSG.subject
242+ cat "$TMP_MSG" >> $TMP_MSG.subject
243+ mv "$TMP_MSG.subject" "$TMP_MSG"
244+ fi
245+ export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
246+ fi
247
248 # commit
249 treeish=`git write-tree`
250 commitish=`git commit-tree $treeish -p $2 < "$TMP_MSG"`
251+ if [ ! $? -eq 0 ]; then
252+ echo "ERROR. Could not commit tree"
253+ git-reset --hard HEAD^
254+ exit 1
255+ fi
256 git update-ref HEAD $commitish
257
258 # mark patch as applied
259 git update-ref "refs/patches/$branch/$pname" HEAD
260
261- rm -f "$TMP_MSG"
262+ rm -f "$TMP_MSG" "$TMP_LOG" "$TMP_PATCH" "$TMP_INFO" "$TMP_PATCH_OUT"
263+
264 )
265 }
266
267@@ -568,7 +693,7 @@ push_patch()
268 bail_action="$2"
269 reject="--reject"
270
271- assert_head_check
272+ head_check "`tail -1 < "$applied" | cut -d: -f 1`"
273 cd_to_toplevel
274
275 # apply the patch if and only if there is something to apply
276@@ -671,7 +796,7 @@ refresh_patch()
277 # incldiffstat
278 __refresh_patch()
279 {
280- assert_head_check
281+ head_check "`tail -1 < "$applied" | cut -d: -f 1`"
282
283 (
284 TMP_DIFF=`get_tmp_file diff`
285@@ -711,6 +836,10 @@ __refresh_patch()
286
287 head -n "-$N" < "$applied" > "$applied.tmp"
288 mv "$applied.tmp" "$applied"
289+
290+ # update the shadow status.
291+ ref=`cat $GIT_DIR/refs/tags/${branch}_top`
292+ echo "$ref:$1" >> $applied_shadow
293 )
294 }
295
296@@ -791,7 +920,12 @@ diffstat=`git config --bool guilt.diffst
297 # The following gets run every time this file is source'd
298 #
299
300-GUILT_DIR="$GIT_DIR/patches"
301+
302+# GUILT_DIR="$GIT_DIR/patches"
303+if [ -z "$GUILT_BASE" ]; then
304+ GUILT_BASE=wrs
305+fi
306+GUILT_DIR="$GUILT_BASE/patches"
307
308 branch=`get_branch`
309
310@@ -814,6 +948,7 @@ fi
311 # very useful files
312 series="$GUILT_DIR/$branch/series"
313 applied="$GUILT_DIR/$branch/status"
314+applied_shadow="$GUILT_DIR/$branch/shadow_status"
315 guards_file="$GUILT_DIR/$branch/guards"
316
317 # determine a pager to use for anything interactive (fall back to more)