ef48f418e0908e99433419a07bd5b415183cc2c0
[geeqie.git] / scripts / new-release.sh
1 #!/bin/bash
2
3 ## @file
4 ## @brief Create a new release
5 ##
6 ## new-release.sh [option]...\n
7 ## Where:\n
8 ## -v \<a.b\> is a major.minor version number\n
9 ## -s \<c\> is the start hash number for a new major.minor release - if omitted, HEAD is used\n
10 ## -p \<d\> is the patch version if a major.minor.patch release is being created\n
11 ## -r Push the release to the repo. If omitted a test run is made (run from a temp. clone folder)\n
12 ## -h Print Help
13 ##
14 ## Will create a new release off the master branch, or will create a new
15 ## patch version off an existing major.minor release branch.
16 ##
17 ## It is expected that the first line of NEWS is in the form "Geeqie \<a.b[.d]\>
18 ##
19
20 error_handler ()
21 {
22         echo "Error on line: $1"
23         exit 1
24 }
25 trap 'error_handler ${LINENO}' ERR
26
27
28 version=
29 start=
30 patch=
31 push=
32 while getopts "v:s:p:hr" option
33 do
34         case $option in
35                 h)
36                         printf '%s\n%s\n%s\n%s\n%s\n' "-v <a.b> release major.minor e.g 1.9" "-s <c> start hash e.g. 728172681 (optional)" "-p <d> release patch version e.g. 2 for 1.6.2" "-r push to repo." "-h help"
37                         exit 0
38                         ;;
39                 v) version="$OPTARG" ;;
40                 s) start="$OPTARG" ;;
41                 p) patch="$OPTARG" ;;
42                 r) push=true ;;
43                 *) exit 1 ;;
44         esac
45 done
46
47 if [ ! -d .git ]
48 then
49         printf '%s\n' "Directory .git does not exist"
50         exit 1
51 fi
52
53 if ! zenity --title="NEW RELEASE" --question --text "Edit the following files before running\n this  script:\n\nNEWS\norg.geeqie.Geeqie.appdata.xml.in\n\nContinue?" --width=300
54 then
55         exit 0
56 fi
57
58 if [ -n "$start" ] && [ -n "$patch" ]
59 then
60         printf '%s\n' "Cannot have start-hash and patch number together"
61         exit 1
62 fi
63
64 if [ "$(printf '%s\n' "$version" | awk -F"." '{print NF-1}')" -ne 1 ]
65 then
66         printf '%s\n' "Version major.minor $version is not valid"
67         exit 1
68 fi
69
70 if [ -n "$start" ]
71 then
72         if ! git branch master --contains "$start" > /dev/null 2>&1
73         then
74                 printf '%s\n' "Start hash is not in master branch"
75                 exit 1
76         fi
77 fi
78
79 if [ -n "$patch" ]
80 then
81         if ! git rev-parse stable/"$version" > /dev/null 2>&1
82         then
83                 printf '%s\n' "Version $version does not exist"
84                 exit 1
85         fi
86
87         if ! [ "$patch" -ge 0 ] 2> /dev/null
88         then
89                 printf '%s\n' "Patch $patch is not an integer"
90                 exit 1
91         fi
92 else
93         if git rev-parse stable/"$version" > /dev/null 2>&1
94         then
95                 printf '%s\n' "Version $version already exists"
96                 exit 1
97         fi
98 fi
99
100 if [ -z "$patch" ]
101 then
102         revision="$version"
103 else
104         revision="$version.$patch"
105 fi
106
107 if [ -z "$patch" ]
108 then
109         if [ -z "$start" ]
110         then
111                 git checkout -b stable/"$version"
112         else
113                 git checkout -b stable/"$version" "$start"
114         fi
115
116         if [ "$push" = true ]
117         then
118                 git push git@geeqie.org:geeqie stable/"$version"
119         fi
120 else
121         git checkout stable/"$version"
122 fi
123
124 # Regenerate to get the new version number in the man page
125 rm -rf build
126 meson setup build
127 ninja -C build
128
129 if ! ./scripts/generate-man-page.sh
130 then
131         printf '%s\n' "generate-man-page.sh failed"
132         exit 1
133 fi
134 if ! ./doc/create-shortcuts-xml.sh
135 then
136         printf '%s\n' "create-shortcuts-xml.sh failed"
137         exit 1
138 fi
139
140 git add NEWS
141 git add org.geeqie.Geeqie.appdata.xml.in
142 git add geeqie.1
143 git add doc/docbook/CommandLineOptions.xml
144 git commit --message="Preparing for release v$revision"
145
146 if [ "$push" = true ]
147 then
148         git push git@geeqie.org:geeqie
149 fi
150
151 git tag --sign "v$revision" --message="Release v$revision"
152
153 if [ "$push" = true ]
154 then
155         git push git@geeqie.org:geeqie "v$revision"
156 fi
157
158 rm -rf /tmp/geeqie-"$revision".tar.xz
159 rm -rf /tmp/geeqie-"$revision".tar.xz.asc
160 rm -rf build
161
162 # shellcheck disable=SC2140
163 tar --create --xz --file=/tmp/geeqie-"$revision".tar.xz --exclude=".git" --exclude="configure" --exclude="web" --transform s/"\bgeeqie\b"/"geeqie-$revision"/ ../geeqie
164 gpg --armor --detach-sign --output /tmp/geeqie-"$revision".tar.xz.asc /tmp/geeqie-"$revision".tar.xz
165
166 git checkout master
167
168 git checkout stable/"$version" NEWS
169 git checkout stable/"$version" geeqie.1
170 git checkout stable/"$version" doc/docbook/CommandLineOptions.xml
171 git checkout stable/"$version" org.geeqie.Geeqie.appdata.xml.in
172
173 git add NEWS
174 git add org.geeqie.Geeqie.appdata.xml.in
175 git add geeqie.1
176 git add doc/docbook/CommandLineOptions.xml
177 git commit --message="Release v$revision files"
178
179 if [ "$push" = true ]
180 then
181         git push git@geeqie.org:geeqie
182 fi
183
184 zenity --info --window-icon="info" --text="Upload files:\n\n/tmp/geeqie-$revision.tar.xz\n/tmp/geeqie-$revision.tar.xz.asc\n\nto https://github.com/BestImageViewer/geeqie/releases" --width=400