mkgitrel: introduce phases
[releases.git] / mkgitrel
1 #! /bin/bash
2
3 reldir=$HOME/linux-libre/releases
4
5 key=474402C8C582DAFBE389C427BCB7CF877E7D47A7
6
7 success=:
8 for rel
9 do
10
11 rup=$(echo "$rel" | sed 's,-gnu[0-9]*$,,')
12 cbr=$(echo "$rup" | sed 's,\(\.\|-rc\)[0-9]*$,,')
13
14 if test -d $reldir/$rel; then
15   echo $reldir/$rel exists >&2
16   continue
17 fi
18
19 if test -h $reldir/LATEST-$cbr.0; then
20   prev0=$(readlink $reldir/LATEST-$cbr.0)
21   prevn=$(readlink $reldir/LATEST-$cbr.N)
22 else
23   cbr=$rup
24   prev0=$(readlink $reldir/LATEST-$cbr.0)
25   prevn=$(readlink $reldir/LATEST-$cbr.N)
26 fi
27
28 for up in linus stable; do
29   git rev-parse --verify -q $up/v$rup && break
30 done
31
32 git verify-tag $up/v$rup &&
33
34 { test -d scripts/v$rel ||
35   git worktree add --detach scripts/v$rel scripts/$cbr
36 } &&
37
38 git worktree add --detach sources/v$rel $up/v$rup &&
39
40 git worktree add --detach logs/v$rel public/logs/v$prevn &&
41
42 (cd logs/v$rel && git rm -f linux-*) &&
43
44 (
45   cd sources/v$rel &&
46   ../../scripts/v$rel/deblob-$cbr >& ../../logs/v$rel/linux-libre-$rel.log &&
47   git commit -m "GNU Linux-libre v$rel incremental" -a &&
48   git tag incr/v$rel
49 ) &&
50
51 DATE=$(git cat-file -p incr/v$rel |
52        gawk '/^(author|tagger)/ {
53                print strftime(PROCINFO["strftime"], $(NF-1))
54              }') &&
55 export GIT_COMMITTER_DATE=$DATE GIT_AUTHOR_DATE=$DATE &&
56
57 (
58   cd sources/v$rel &&
59   git reset --soft -q public/sources/v$prevn &&
60   git commit --amend --reset-author -S$key \
61       -m "GNU Linux-libre $rel" &&
62   git tag -m "GNU Linux-libre $rel" -s -u $key sources/v$rel &&
63
64   git reset --hard incr/v$rel^ &&
65   { git merge --no-commit incr/v$prevn || :; } &&
66   git diff incr/v$rel > ../../linux-libre-$rel.patckT &&
67   mv -v ../../linux-libre-$rel.patckT ../../linux-libre-$rel.patck
68  ) &&
69
70 git archive --format tar --prefix=linux-$rup/ -o linux-libre-$rel.tar sources/v$rel &&
71 gpg --armor --detach-sign linux-libre-$rel.tar &&
72 mv linux-libre-$rel.tar.asc logs/v$rel/linux-libre-$rel.tar.sign &&
73
74 for f in linux-libre-; do
75   if cmp logs/v$rel/$f$rel.log $reldir/$prevn/$f$prevn.log; then
76     ln -vf $reldir/$prevn/$f$prevn.log logs/v$rel/$f$rel.log &&
77     ln -vf $reldir/$prevn/$f$prevn.log.sign logs/v$rel/$f$rel.log.sign
78   else
79     gpg --armor --detach-sign logs/v$rel/$f$rel.log &&
80     mv -v logs/v$rel/$f$rel.log.asc logs/v$rel/$f$rel.log.sign
81   fi
82 done &&
83
84 (
85   cd logs/v$rel &&
86   git add linux* &&
87   git commit --amend --reset-author -S$key -m "GNU Linux-libre $rel logs" &&
88   git tag -m "GNU Linux-libre $rel logs" -s -u $key logs/v$rel
89 ) &&
90
91 git diff --src-prefix=linux-libre-$prev0/ --dst-prefix=linux-libre-$rel/ \
92   public/sources/v$prev0 sources/v$rel -- > patch-$prev0-$rel &&
93
94 if test "$prev0" != "$prevn"; then
95   git diff --src-prefix=linux-libre-$prevn/ --dst-prefix=linux-libre-$rel/ \
96     public/sources/v$prevn sources/v$rel -- > patch-$prevn-$rel
97 fi &&
98
99 { scripts/v$rel/deblob-check --use-awk linux-libre-$rel.tar ||
100     scripts/v$rel/deblob-check --use-awk -C linux-libre-$rel.tar \
101       > linux-libre-$rel.check ||
102     { success=false; continue; }; }
103
104 done &&
105
106 $success && echo all revs cleaned up, awaiting manual check results... &&
107
108 for rel
109 do
110     
111 rup=$(echo "$rel" | sed 's,-gnu[0-9]*$,,')
112 cbr=$(echo "$rup" | sed 's,\(\.\|-rc\)[0-9]*$,,')
113
114 if test -d $reldir/$rel; then
115   echo $reldir/$rel exists >&2
116   continue
117 fi
118
119 if test -h $reldir/LATEST-$cbr.0; then
120   prev0=$(readlink $reldir/LATEST-$cbr.0)
121   prevn=$(readlink $reldir/LATEST-$cbr.N)
122 else
123   cbr=$rup
124   prev0=$(readlink $reldir/LATEST-$cbr.0)
125   prevn=$(readlink $reldir/LATEST-$cbr.N)
126 fi
127
128 DATE=$(git cat-file -p incr/v$rel |
129        gawk '/^(author|tagger)/ {
130                print strftime(PROCINFO["strftime"], $(NF-1))
131              }') &&
132 export GIT_COMMITTER_DATE=$DATE GIT_AUTHOR_DATE=$DATE &&
133
134 while test -f linux-libre-$rel.patck; do
135   echo please verify linux-libre-$rel.patck and move it away to complete the release
136   sleep 30
137 done &&
138
139 (
140   cd scripts/v$rel &&
141   git reset --soft -q scripts/$cbr &&
142   otop=$(git rev-parse --verify -q HEAD) &&
143   { git commit -a -S$key -m "GNU Linux-libre $rel scripts" ||
144     if git status -su | grep .; then
145       success=false
146       continue
147     fi; } &&
148   case $rup:$(git rev-parse --verify -q HEAD) in
149   *-rc*:* | "$cbr":*) forcetag=: ;;
150   *:"$otop") forcetag=false ;;
151   *) forcetag=: ;;
152   esac &&
153   if $forcetag; then
154     git tag -m "GNU Linux-libre $rel scripts" -s -u $key \
155         -f \
156       scripts/v$rel &&
157     git checkout scripts/$cbr &&
158     git reset --hard scripts/v$rel &&
159     git checkout HEAD
160   fi
161 ) &&
162
163 for x in scripts sources logs; do
164   if git rev-parse --verify -q $x/v$rel > /dev/null ; then
165     git tag public/$x/v$rel $x/v$rel &&
166     git tag -d $x/v$rel
167   fi
168 done
169
170 done &&
171
172 $success && echo all git tagging done, now compressing... &&
173
174 for rel
175 do
176     
177 rup=$(echo "$rel" | sed 's,-gnu[0-9]*$,,')
178 cbr=$(echo "$rup" | sed 's,\(\.\|-rc\)[0-9]*$,,')
179
180 if test -d $reldir/$rel; then
181   echo $reldir/$rel exists >&2
182   continue
183 fi
184
185 if test -h $reldir/LATEST-$cbr.0; then
186   prev0=$(readlink $reldir/LATEST-$cbr.0)
187   prevn=$(readlink $reldir/LATEST-$cbr.N)
188 else
189   cbr=$rup
190   prev0=$(readlink $reldir/LATEST-$cbr.0)
191   prevn=$(readlink $reldir/LATEST-$cbr.N)
192 fi
193
194 DATE=$(git cat-file -p incr/v$rel |
195        gawk '/^(author|tagger)/ {
196                print strftime(PROCINFO["strftime"], $(NF-1))
197              }') &&
198 export GIT_COMMITTER_DATE=$DATE GIT_AUTHOR_DATE=$DATE &&
199
200 plist="patch-$prev0-$rel" &&
201 if test "$prev0" != "$prevn"; then
202   plist="$plist patch-$prevn-$rel"
203 fi &&
204
205 list="linux-libre-$rel.tar $plist" &&
206
207 bzip2 -k9 $list &&
208 xz -k9 $list &&
209 lzip -k9s64MiB $list &&
210
211 mkdir -v $rel &&
212
213 for f in $(ls scripts/v$rel); do
214   if cmp scripts/v$rel/$f $reldir/$prevn/$f; then
215     ln -v $reldir/$prevn/$f $reldir/$prevn/$f.sign $rel/
216   else
217     ln -v scripts/v$rel/$f $rel/ &&
218     gpg --armor --detach-sign $rel/$f &&
219     mv -v $rel/$f.asc $rel/$f.sign
220   fi
221 done &&
222
223 ln -v logs/v$rel/linux-libre-$rel.* $rel/ &&
224
225 for f in $plist; do
226   gpg --armor --detach-sign $f &&
227   mv -v $f.asc $rel/$f.sign
228 done &&
229
230 for ext in .bz2 .xz .lz; do
231   for f in $list; do
232     mv -v $f$ext $rel/ &&
233     gpg --armor --detach-sign $rel/$f$ext &&
234     mv -v $rel/$f$ext.asc $rel/$f$ext.sign
235   done
236 done &&
237
238 rm -vf $list &&
239
240 mv -v $rel $reldir/$rel &&
241 ln -snfv $rel $reldir/LATEST-$cbr.N &&
242 if test "$rup" = "$cbr"; then
243   ln -nfv $reldir/LATEST-$cbr.N $reldir/LATEST-$cbr.0 &&
244   ln -nfv $reldir/LATEST-$cbr.N $reldir/LATEST-${cbr%.*}.N
245 fi &&
246
247 git worktree remove logs/v$rel &&
248 git worktree remove scripts/v$rel &&
249 git worktree remove --force sources/v$rel
250
251 done
252
253 $success
254 exit