What's cooking (2021/06 #06)
[git] / RelSign
1 #!/bin/sh
2
3 # Use agent
4 GPG_TTY=$(tty) &&
5 export GPG_TTY &&
6
7 if AGENT=$(gpg-agent --daemon 2>/dev/null)
8 then
9         eval "$AGENT" &&
10         GPG_AGENT_PID=$(expr "$GPG_AGENT_INFO" : ".*:\([1-9][0-9]*\):[1-9][0-9]*$") &&
11         trap 'kill -0 2>/dev/null $GPG_AGENT_PID && kill $GPG_AGENT_PID' 0 1 2 3 15 &&
12         kill -0 "$GPG_AGENT_PID"
13 else
14         # agent is always on
15         gpgconf --kill gpg-agent
16         GPG_AGENT_PID=
17 fi &&
18 gpg="gpg --use-agent --local-user 96AFE6CB!" || exit
19
20 formats='htmldocs manpages'
21
22 products () {
23         with_sig=: with_src=echo
24         case "$1" in
25         with-sig)
26                 with_sig=echo
27                 shift
28                 ;;
29         only-sig)
30                 with_sig=echo with_src=:
31                 shift
32                 ;;
33         esac
34         version=$1
35         $with_src "git-$version.tar.gz"
36         $with_sig "git-$version.tar.sig"
37         for fmt in $formats
38         do
39                 $with_src "git-$fmt-$version.tar.gz"
40                 $with_sig "git-$fmt-$version.tar.sig"
41         done
42 }
43
44 report () {
45         ls -l "git-$1.sign" $(products with-sig "$1")
46 }
47
48
49 failed=
50 for tar in git-[0-9]*.tar.gz
51 do
52         version=$(expr "$tar" : 'git-\(.*\)\.tar.gz$')
53
54         if test -f "git-$version.tar.sig"
55         then
56                 can_skip=yes
57                 for file in $(products with-sig "$version")
58                 do
59                         if ! test -f "$file"
60                         then
61                                 can_skip=no
62                                 break
63                         fi
64                 done
65                 if test "$can_skip" = yes
66                 then
67                         report "$version"
68                         continue
69                 fi
70         fi
71
72         rm -f $(products only-sig $version)
73
74         files="$tar"
75         missing=
76         for fmt in $formats
77         do
78                 doc="git-$fmt-$version.tar.gz"
79                 if test -f "$doc"
80                 then
81                         files="$files $doc"
82                 else
83                         missing="$missing $doc"
84                 fi
85         done
86         case "$missing" in
87         ?*)
88                 echo >&2 "Missing files: $missing"
89                 failed="$failed $version"
90                 continue
91                 ;;
92         esac
93         sha1sum $files | $gpg --clearsign >git-$version.sign || {
94                 failed="$failed $version"
95                 continue
96         }
97
98         for file in $files
99         do
100                 gzip -dc <"$file" >"${file%.gz}" &&
101                 $gpg -b "${file%.gz}" || {
102                         failed="$failed $version"
103                         rm -f "${file%.gz}.sig"
104                 }
105                 rm -f "${file%.gz}"
106         done
107
108         case " $failed " in
109         *" $version "*)
110                 continue
111                 ;;
112         esac
113
114         report "$version"
115 done
116
117 if test -n "$GPG_AGENT_PID"
118 then
119         kill "$GPG_AGENT_PID"
120 else
121         gpgconf --kill gpg-agent
122 fi