X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;ds=sidebyside;f=mkgitrel;h=38a9b9957ccfd36f56b02bdb722d0a382deb2e24;hb=3f0619138956aaeda44b26e2bf6c338fe7eac8d1;hp=42a50d34b26b3f034dba485c726dc14c365fff50;hpb=648ec8999546b41676ef245041f845ed40be2b41;p=releases.git diff --git a/mkgitrel b/mkgitrel index 42a50d34b26b..38a9b9957ccf 100755 --- a/mkgitrel +++ b/mkgitrel @@ -1,255 +1,65 @@ #! /bin/bash -reldir=$HOME/linux-libre/releases - -key=474402C8C582DAFBE389C427BCB7CF877E7D47A7 +# Copyright 2021 Alexandre Oliva +# +# 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 + + +# usage: mkgitrel 5.5.5-gnu 5.4.3-gnu 5.0.111-gnu1 ... + +# 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. + +# 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. success=: for rel do + case $rel in + v*) + echo $rel starts with v, that is unexpected >&2 + success=false + ;; + *.*-gnu*) + ;; + *) + echo $rel does not end with -gnu, that is unexpected >&2 + success=false + ;; + esac +done && $success && -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 - -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 && 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 - gpg --verify $reldir/$prevn/$f.sign && - 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 && +$0.cln "$@" && -rm -vf $list && +echo all revs cleaned up, awaiting manual check results... && -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 && +$0.pub "$@" && -git worktree remove logs/v$rel && -git worktree remove scripts/v$rel && -git worktree remove --force sources/v$rel +echo all git tagging done, now compressing... && -done +$0.rel "$@" -$success exit