make sure python and gawk are available
[releases.git] / mkgitrel
index bdd71f4fb8a0c0c320e3aad6f41860ae9665eda3..6b4ef1a2706aabf9a6c955ba91237fe6124a8442 100755 (executable)
--- a/mkgitrel
+++ b/mkgitrel
 #! /bin/bash
 
-reldir=$HOME/linux-libre/releases
+# Copyright 2021-2023 Alexandre Oliva <lxoliva@fsfla.org>
+#
+# This program is part of GNU Linux-libre, a GNU project that
+# publishes scripts to clean up Linux so as to make it suitable for
+# use in the GNU Project and in Free System Distributions.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+# USA
 
-key=474402C8C582DAFBE389C427BCB7CF877E7D47A7
 
-success=:
-for rel
-do
+# usage: mkgitrel [--force] 5.5.5-gnu 5.4.3-gnu 5.0.111-gnu1 ...
 
-rup=$(echo "$rel" | sed 's,-gnu[0-9]*$,,')
-cbr=$(echo "$rup" | sed 's,\(\.\|-rc\)[0-9]*$,,')
+# This is our release engineering script.  It's very tied to our
+# internal cleaning-up repository structure, as well as to our public
+# git and download repositories.
 
-if test -d $reldir/$rel; then
-  echo $reldir/$rel exists >&2
-  continue
-fi
+# It checks out upstream sources, finds and checks out cleaning-up
+# scripts, cleans up the sources, commits the changes, creates signed
+# tags for publishing, tarballs and patchfiles for publishing and for
+# manual verification, checks that the tarballs look clean and waits
+# for manual verification before preparing tags and tarballs for
+# publishing.
 
-if test -h $reldir/LATEST-$cbr.0; then
-  prev0=$(readlink $reldir/LATEST-$cbr.0)
-  prevn=$(readlink $reldir/LATEST-$cbr.N)
-else
-  cbr=$rup
-  prev0=$(readlink $reldir/LATEST-$cbr.0)
-  prevn=$(readlink $reldir/LATEST-$cbr.N)
-fi
+force= && case $1 in --force) force=$1; shift;; esac
 
-for up in linus stable; do
-  git rev-parse --verify -q $up/v$rup && break
-done
+$0.pre "$@" &&
 
-git verify-tag $up/v$rup &&
+$0.cln $force "$@" &&
 
-{ test -d scripts/v$rel ||
-  git worktree add --detach scripts/v$rel scripts/$cbr
-} &&
+echo all revs cleaned up, awaiting manual check results... &&
 
-git worktree add --detach sources/v$rel $up/v$rup &&
+$0.pub "$@" &&
 
-git worktree add --detach logs/v$rel public/logs/v$prevn &&
+echo all git tagging done, now compressing... &&
 
-(cd logs/v$rel && git rm -f linux-*) &&
+$0.rel "$@"
 
-(
-  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 && echo all revs cleaned up, awaiting manual check results... &&
-
-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)
-else
-  cbr=$rup
-  prev0=$(readlink $reldir/LATEST-$cbr.0)
-  prevn=$(readlink $reldir/LATEST-$cbr.N)
-fi
-
-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 &&
-
-while test -f linux-libre-$rel.patck; do
-  echo please verify linux-libre-$rel.patck and move it away to complete the release
-  sleep 30
-done &&
-
-(
-  cd scripts/v$rel &&
-  git reset --soft -q scripts/$cbr &&
-  otop=$(git rev-parse --verify -q HEAD) &&
-  { git commit -a -S$key -m "GNU Linux-libre $rel scripts" ||
-    if git status -su | grep .; then
-      success=false
-      continue
-    fi; } &&
-  case $rup:$(git rev-parse --verify -q HEAD) in
-  *-rc*:* | "$cbr":*) forcetag=: ;;
-  *:"$otop") forcetag=false ;;
-  *) forcetag=: ;;
-  esac &&
-  if $forcetag; then
-    git tag -m "GNU Linux-libre $rel scripts" -s -u $key \
-       -f \
-      scripts/v$rel &&
-    git checkout scripts/$cbr &&
-    git reset --hard scripts/v$rel &&
-    git checkout HEAD
-  fi
-) &&
-
-for x in scripts sources logs; do
-  if git rev-parse --verify -q $x/v$rel > /dev/null ; then
-    git tag public/$x/v$rel $x/v$rel &&
-    git tag -d $x/v$rel
-  fi
-done
-
-done &&
-
-$success && echo all git tagging done, now compressing... &&
-
-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)
-else
-  cbr=$rup
-  prev0=$(readlink $reldir/LATEST-$cbr.0)
-  prevn=$(readlink $reldir/LATEST-$cbr.N)
-fi
-
-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 &&
-
-plist="patch-$prev0-$rel" &&
-if test "$prev0" != "$prevn"; then
-  plist="$plist patch-$prevn-$rel"
-fi &&
-
-list="linux-libre-$rel.tar $plist" &&
-
-bzip2 -k9 $list &&
-xz -k9 $list &&
-lzip -k9s64MiB $list &&
-
-mkdir -v $rel &&
-
-for f in $(ls scripts/v$rel); do
-  if cmp scripts/v$rel/$f $reldir/$prevn/$f; then
-    ln -v $reldir/$prevn/$f $reldir/$prevn/$f.sign $rel/
-  else
-    ln -v scripts/v$rel/$f $rel/ &&
-    gpg --armor --detach-sign $rel/$f &&
-    mv -v $rel/$f.asc $rel/$f.sign
-  fi
-done &&
-
-ln -v logs/v$rel/linux-libre-$rel.* $rel/ &&
-
-for f in $plist; do
-  gpg --armor --detach-sign $f &&
-  mv -v $f.asc $rel/$f.sign
-done &&
-
-for ext in .bz2 .xz .lz; do
-  for f in $list; do
-    mv -v $f$ext $rel/ &&
-    gpg --armor --detach-sign $rel/$f$ext &&
-    mv -v $rel/$f$ext.asc $rel/$f$ext.sign
-  done
-done &&
-
-rm -vf $list &&
-
-mv -v $rel $reldir/$rel &&
-ln -snfv $rel $reldir/LATEST-$cbr.N &&
-if test "$rup" = "$cbr"; then
-  ln -nfv $reldir/LATEST-$cbr.N $reldir/LATEST-$cbr.0 &&
-  ln -nfv $reldir/LATEST-$cbr.N $reldir/LATEST-${cbr%.*}.N
-fi &&
-
-git worktree remove logs/v$rel &&
-git worktree remove scripts/v$rel &&
-git worktree remove --force sources/v$rel
-
-done
-
-$success
 exit