--- /dev/null
+#! /bin/bash
+
+reldir=$HOME/linux-libre/releases
+
+key=474402C8C582DAFBE389C427BCB7CF877E7D47A7
+
+success=:
+for rel
+do
+
+rup=$(echo "$rel" | sed 's,-gnu[0-9]*$,,')
+cbr=$(echo "$rup" | sed 's,\(\.\|-rc\)[0-9]*$,,')
+
+if test -d $reldir/$rel; then
+ echo $reldir/$rel exists >&2
+ continue
+fi
+
+if test -h $reldir/LATEST-$cbr.0; then
+ prev0=$(readlink $reldir/LATEST-$cbr.0)
+ prevn=$(readlink $reldir/LATEST-$cbr.N)
+elif test -h $reldir/LATEST-$rup.N; then
+ cbr=$rup
+ prev0=$(readlink $reldir/LATEST-$cbr.0)
+ prevn=$(readlink $reldir/LATEST-$cbr.N)
+else
+ echo Neither $reldir/LATEST-$cbr.0 nor $reldir/LATEST-$rup.N exist >&2
+ exit 1
+fi
+
+for up in linus stable; do
+ git rev-parse --verify -q $up/v$rup && break
+done
+
+git verify-tag $up/v$rup &&
+
+{ test -d scripts/v$rel ||
+ git worktree add --detach scripts/v$rel scripts/$cbr
+} &&
+
+git worktree add --detach sources/v$rel $up/v$rup &&
+
+git worktree add --detach logs/v$rel public/logs/v$prevn &&
+
+(cd logs/v$rel && git rm -f linux-*) &&
+
+(
+ cd sources/v$rel &&
+ ../../scripts/v$rel/deblob-$cbr >& ../../logs/v$rel/linux-libre-$rel.log &&
+ git commit -m "GNU Linux-libre v$rel incremental" -a &&
+ git tag incr/v$rel
+) &&
+
+DATE=$(git cat-file -p incr/v$rel |
+ gawk '/^(author|tagger)/ {
+ print strftime(PROCINFO["strftime"], $(NF-1))
+ }') &&
+export GIT_COMMITTER_DATE=$DATE GIT_AUTHOR_DATE=$DATE &&
+
+(
+ cd sources/v$rel &&
+ git reset --soft -q public/sources/v$prevn &&
+ git commit --amend --reset-author -S$key \
+ -m "GNU Linux-libre $rel" &&
+ git tag -m "GNU Linux-libre $rel" -s -u $key sources/v$rel &&
+
+ git reset --hard incr/v$rel^ &&
+ { git merge --no-commit incr/v$prevn || :; } &&
+ git diff incr/v$rel > ../../linux-libre-$rel.patckT &&
+ mv -v ../../linux-libre-$rel.patckT ../../linux-libre-$rel.patck
+ ) &&
+
+git archive --format tar --prefix=linux-$rup/ -o linux-libre-$rel.tar sources/v$rel &&
+gpg --armor --detach-sign linux-libre-$rel.tar &&
+mv linux-libre-$rel.tar.asc logs/v$rel/linux-libre-$rel.tar.sign &&
+
+for f in linux-libre-; do
+ if cmp logs/v$rel/$f$rel.log $reldir/$prevn/$f$prevn.log; then
+ ln -vf $reldir/$prevn/$f$prevn.log logs/v$rel/$f$rel.log &&
+ ln -vf $reldir/$prevn/$f$prevn.log.sign logs/v$rel/$f$rel.log.sign
+ else
+ gpg --armor --detach-sign logs/v$rel/$f$rel.log &&
+ mv -v logs/v$rel/$f$rel.log.asc logs/v$rel/$f$rel.log.sign
+ fi
+done &&
+
+(
+ cd logs/v$rel &&
+ git add linux* &&
+ git commit --amend --reset-author -S$key -m "GNU Linux-libre $rel logs" &&
+ git tag -m "GNU Linux-libre $rel logs" -s -u $key logs/v$rel
+) &&
+
+git diff --src-prefix=linux-libre-$prev0/ --dst-prefix=linux-libre-$rel/ \
+ public/sources/v$prev0 sources/v$rel -- > patch-$prev0-$rel &&
+
+if test "$prev0" != "$prevn"; then
+ git diff --src-prefix=linux-libre-$prevn/ --dst-prefix=linux-libre-$rel/ \
+ public/sources/v$prevn sources/v$rel -- > patch-$prevn-$rel
+fi &&
+
+{ scripts/v$rel/deblob-check --use-awk linux-libre-$rel.tar ||
+ scripts/v$rel/deblob-check --use-awk -C linux-libre-$rel.tar \
+ > linux-libre-$rel.check ||
+ { success=false; continue; }; }
+
+done &&
+
+$success