mkgitrel.cln: run single check pass and refuse --force releases
[releases.git] / mkgitrel.cln
1 #! /bin/bash
2
3 # Copyright 2021-2023 Alexandre Oliva <lxoliva@fsfla.org>
4 #
5 # This program is part of GNU Linux-libre, a GNU project that
6 # publishes scripts to clean up Linux so as to make it suitable for
7 # use in the GNU Project and in Free System Distributions.
8 #
9 # This program is free software; you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation; either version 3 of the License, or
12 # (at your option) any later version.
13 #
14 # This program is distributed in the hope that it will be useful, but
15 # WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 # General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program; if not, write to the Free Software
21 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
22 # USA
23
24 scriptdir=$(dirname "$0")
25 . $scriptdir/mkgitrel.gcfg
26
27 force= && case $1 in --force) force=$1; shift;; esac
28
29 success=:
30 for rel
31 do
32
33 . $scriptdir/mkgitrel.setprev &&
34
35 for up in linus stable; do
36   git rev-parse --verify -q $up/v$rup && break
37 done &&
38
39 git verify-tag $up/v$rup &&
40
41 { test -d scripts/v$rel ||
42   git worktree add --detach scripts/v$rel scripts/$cbr
43 } &&
44
45 case $(sed -n 's,^kver=\(.*\) extra=\(.*\),\1-gnu\2,p' \
46            scripts/v$rel/deblob-$cbr) in
47 "$cbr$(echo $rel | sed -n 's,.*\(-gnu\),\1,p')") ;;
48 *) echo $rel mismatches release implied by scripts/v$rel/deblob-$cbr >&2
49    echo "$cbr$(echo $rel | sed -n 's,.*\(-gnu\),\1,p')" vs \
50         $(sed -n 's,^kver=\(.*\) extra=\(.*\),\1-gnu\2,p' \
51            scripts/v$rel/deblob-$cbr) >&2
52    continue;;
53 esac &&
54
55 git worktree add --detach sources/v$rel $up/v$rup &&
56
57 git worktree add --detach logs/v$rel public/logs/v$prevn &&
58
59 (cd logs/v$rel && git rm -f linux-*) &&
60
61 if (cd sources/v$rel && ../../scripts/v$rel/deblob-$cbr $force) \
62        >& logs/v$rel/linux-libre-$rel.log &&
63    { test -z "$force" ||
64        test $(grep -i error logs/v$rel/linux-libre-$rel.log |
65                 grep -c -v force) = 0; }; then
66   :
67 else
68   grep -i error logs/v$rel/linux-libre-$rel.log > linux-libre-$rel.check
69   success=false; continue
70 fi &&
71
72 (
73   cd sources/v$rel &&
74   git commit -m "GNU Linux-libre v$rel incremental" -a &&
75   git tag incr/v$rel
76 ) &&
77
78 . $scriptdir/mkgitrel.setdate &&
79
80 (
81   cd sources/v$rel &&
82   git reset --soft -q public/sources/v$prevn &&
83   git commit --amend --reset-author -S$key \
84       -m "GNU Linux-libre $rel" &&
85   git tag -m "GNU Linux-libre $rel" -s -u $key sources/v$rel &&
86
87   git reset --hard incr/v$rel^ &&
88   { git merge --no-commit incr/v$prevn || :; } &&
89   git diff incr/v$rel > ../../linux-libre-$rel.patckT &&
90   mv -v ../../linux-libre-$rel.patckT ../../linux-libre-$rel.patck
91  ) &&
92
93 git archive --format tar --prefix=linux-$rup/ -o linux-libre-$rel.tar sources/v$rel &&
94 gpg --armor --detach-sign linux-libre-$rel.tar &&
95 mv linux-libre-$rel.tar.asc logs/v$rel/linux-libre-$rel.tar.sign &&
96
97 for f in linux-libre-; do
98   if cmp logs/v$rel/$f$rel.log $reldir/$prevn/$f$prevn.log; then
99     ln -vf $reldir/$prevn/$f$prevn.log logs/v$rel/$f$rel.log &&
100     ln -vf $reldir/$prevn/$f$prevn.log.sign logs/v$rel/$f$rel.log.sign
101   else
102     gpg --armor --detach-sign logs/v$rel/$f$rel.log &&
103     mv -v logs/v$rel/$f$rel.log.asc logs/v$rel/$f$rel.log.sign
104   fi
105 done &&
106
107 (
108   cd logs/v$rel &&
109   git add linux* &&
110   git commit --amend --reset-author -S$key -m "GNU Linux-libre $rel logs" &&
111   git tag -m "GNU Linux-libre $rel logs" -s -u $key logs/v$rel
112 ) &&
113
114 git diff --src-prefix=linux-libre-$prev0/ --dst-prefix=linux-libre-$rel/ \
115   public/sources/v$prev0 sources/v$rel -- > patch-$prev0-$rel &&
116
117 if test "$prev0" != "$prevn"; then
118   git diff --src-prefix=linux-libre-$prevn/ --dst-prefix=linux-libre-$rel/ \
119     public/sources/v$prevn sources/v$rel -- > patch-$prevn-$rel
120 fi &&
121
122 { { test -z "$force" &&
123       scripts/v$rel/deblob-check --use-awk linux-libre-$rel.tar; } ||
124     scripts/v$rel/deblob-check --use-awk -C linux-libre-$rel.tar \
125       > linux-libre-$rel.check ||
126     { success=false; continue; }; } &&
127
128 if test -n "$force"; then
129   echo aborting, --force is for testing only >> linux-libre-$rel.check
130   success=false
131 fi &&
132
133 continue
134
135 echo something went wrong > linux-libre-$rel.check
136 success=false
137
138 done &&
139
140 : $success