deal with missing LATEST symlinks. split up mkgitrel
[releases.git] / mkgitrel.cln
diff --git a/mkgitrel.cln b/mkgitrel.cln
new file mode 100755 (executable)
index 0000000..875afa0
--- /dev/null
@@ -0,0 +1,109 @@
+#! /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