Start git-tracking the release packaging and checking scripts
[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 while test -f linux-libre-$rel.patck; do
105   echo please verify linux-libre-$rel.patck and move it away to complete the release
106   sleep 30
107 done &&
108
109 (
110   cd scripts/v$rel &&
111   git reset --soft -q scripts/$cbr &&
112   otop=$(git rev-parse --verify -q HEAD) &&
113   { git commit -a -S$key -m "GNU Linux-libre $rel scripts" ||
114     if git status -su | grep .; then
115       success=false
116       continue
117     fi; } &&
118   case $rup:$(git rev-parse --verify -q HEAD) in
119   *-rc*:* | "$cbr":*) forcetag=: ;;
120   *:"$otop") forcetag=false ;;
121   *) forcetag=: ;;
122   esac &&
123   if $forcetag; then
124     git tag -m "GNU Linux-libre $rel scripts" -s -u $key \
125         -f \
126       scripts/v$rel &&
127     git checkout scripts/$cbr &&
128     git reset --hard scripts/v$rel &&
129     git checkout HEAD
130   fi
131 ) &&
132
133 for x in scripts sources logs; do
134   if git rev-parse --verify -q $x/v$rel > /dev/null ; then
135     git tag public/$x/v$rel $x/v$rel &&
136     git tag -d $x/v$rel
137   fi
138 done &&
139
140 plist="patch-$prev0-$rel" &&
141 if test "$prev0" != "$prevn"; then
142   plist="$plist patch-$prevn-$rel"
143 fi &&
144
145 list="linux-libre-$rel.tar $plist" &&
146
147 bzip2 -k9 $list &&
148 xz -k9 $list &&
149 lzip -k9s64MiB $list &&
150
151 mkdir -v $rel &&
152
153 for f in $(ls scripts/v$rel); do
154   if cmp scripts/v$rel/$f $reldir/$prevn/$f; then
155     ln -v $reldir/$prevn/$f $reldir/$prevn/$f.sign $rel/
156   else
157     ln -v scripts/v$rel/$f $rel/ &&
158     gpg --armor --detach-sign $rel/$f &&
159     mv -v $rel/$f.asc $rel/$f.sign
160   fi
161 done &&
162
163 ln -v logs/v$rel/linux-libre-$rel.* $rel/ &&
164
165 for f in $plist; do
166   gpg --armor --detach-sign $f &&
167   mv -v $f.asc $rel/$f.sign
168 done &&
169
170 for ext in .bz2 .xz .lz; do
171   for f in $list; do
172     mv -v $f$ext $rel/ &&
173     gpg --armor --detach-sign $rel/$f$ext &&
174     mv -v $rel/$f$ext.asc $rel/$f$ext.sign
175   done
176 done &&
177
178 rm -vf $list &&
179
180 mv -v $rel $reldir/$rel &&
181 ln -snfv $rel $reldir/LATEST-$cbr.N &&
182 if test "$rup" = "$cbr"; then
183   ln -nfv $reldir/LATEST-$cbr.N $reldir/LATEST-$cbr.0 &&
184   ln -nfv $reldir/LATEST-$cbr.N $reldir/LATEST-${cbr%.*}.N
185 fi &&
186
187 git worktree remove logs/v$rel &&
188 git worktree remove scripts/v$rel &&
189 git worktree remove --force sources/v$rel
190
191 done
192
193 $success
194 exit