Compare every single tag with a list of valid tags to prevent broken
releases if the user makes a typo. Since the list is used in the ZSH
completion as well, it is moved to "lib/". Also, add a command line
parameter to allow releasing to an unknown repository when necessary.

This is how error output looks like:

    $ ./archrelease foobar
    ==> ERROR: archrelease: Invalid tag: "foobar" (use -f to force release)

Signed-off-by: Lukas Fleischer <archli...@cryptocrack.de>
---
 archrelease.in    |   25 ++++++++++++++++++++++---
 lib/repo-vars.sh  |   17 +++++++++++++++++
 zsh_completion.in |   14 +-------------
 3 files changed, 40 insertions(+), 16 deletions(-)
 create mode 100644 lib/repo-vars.sh

diff --git a/archrelease.in b/archrelease.in
index b9f3378..235262a 100644
--- a/archrelease.in
+++ b/archrelease.in
@@ -1,13 +1,32 @@
 #!/bin/bash
 
 m4_include(lib/common.sh)
+m4_include(lib/repo-vars.sh)
 
-if [[ -z $1 ]]; then
-       echo 'usage: archrelease <repo>...'
+# parse command line options
+FORCE=
+while getopts ':f' flag; do
+       case $flag in
+               f) FORCE=1 ;;
+               :) die "Option requires an argument -- '$OPTARG'" ;;
+               \?) die "Invalid option -- '$OPTARG'" ;;
+       esac
+done
+shift $(( OPTIND - 1 ))
+
+if ! (( $# )); then
+       echo 'usage: archrelease [-f] <repo>...'
        exit 1
 fi
 
-# TODO: validate repo is really repo-arch
+# validate repo is really repo-arch
+if [[ -z $FORCE ]]; then
+       for tag in "$@"; do
+               if ! in_array "$tag" "${_tags[@]}"; then
+                       die 'archrelease: Invalid tag: "'$tag'" (use -f to 
force release)'
+               fi
+       done
+fi
 
 if [[ ! -f PKGBUILD ]]; then
        die 'archrelease: PKGBUILD not found'
diff --git a/lib/repo-vars.sh b/lib/repo-vars.sh
new file mode 100644
index 0000000..75b3e27
--- /dev/null
+++ b/lib/repo-vars.sh
@@ -0,0 +1,17 @@
+_arch=(
+       i686
+       x86_64
+       any
+)
+
+_tags=(
+       core-i686 core-x86_64 core-any
+       extra-i686 extra-x86_64 extra-any
+       multilib-i686 multilib-x86_64 multilib-any
+       staging-i686 staging-x86_64 staging-any
+       testing-i686 testing-x86_64 testing-any
+       multilib-testing-i686 multilib-testing-x86_64 multilib-testing-any
+       community-i686 community-x86_64 community-any
+       community-staging-i686 community-staging-x86_64 community-staging-any
+       community-testing-i686 community-testing-x86_64 community-testing-any
+)
diff --git a/zsh_completion.in b/zsh_completion.in
index d87850a..27217fa 100644
--- a/zsh_completion.in
+++ b/zsh_completion.in
@@ -1,18 +1,6 @@
 #compdef archbuild archco archrelease archrm commitpkg finddeps makechrootpkg 
mkarchroot rebuildpkgs extrapkg=commitpkg corepkg=commitpkg 
testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg 
community-testingpkg=commitpkg community-stagingpkg=commitpkg 
multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-i686-build=archbuild 
extra-x86_64-build=archbuild testing-i686-build=archbuild 
testing-x86_64-build=archbuild staging-i686-build=archbuild 
staging-x86_64-build=archbuild multilib-build=archbuild 
multilib-testing-build=archbuild communityco=archco
 
-_arch=(i686 x86_64 any)
-
-_tags=(
-       core-i686 core-x86_64 core-any
-       extra-i686 extra-x86_64 extra-any
-       multilib-i686 multilib-x86_64 multilib-any
-       staging-i686 staging-x86_64 staging-any
-       testing-i686 testing-x86_64 testing-any
-       multilib-testing-i686 multilib-testing-x86_64 multilib-testing-any
-       community-i686 community-x86_64 community-any
-       community-staging-i686 community-staging-x86_64 community-staging-any
-       community-testing-i686 community-testing-x86_64 community-testing-any
-)
+m4_include(lib/repo-vars.sh)
 
 _archbuild_args=(
        '-c[Recreate the chroot before building]'
-- 
1.7.8

Reply via email to