chiark / gitweb /
Use logging with proper format when warning about improper verbose/quiet usage
[fdroidserver.git] / fd-commit
index e1445a475e4b8e3119c042e84f190b15c15a0ea4..20c84895fd1d8097ab3e3e84e7c52bcada45ae96 100755 (executable)
--- a/fd-commit
+++ b/fd-commit
-#!/bin/bash
-
+#!/bin/sh
+#
+# fd-commit - part of the FDroid server tools
 # Commits updates to apps, allowing you to edit the commit messages
+#
+# Copyright (C) 2013-2014 Daniel Martí <mvdan@mvdan.cc>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+commands=""
 
-commands=()
+if [ ! -d metadata ]; then
+       if [ -d ../metadata ]; then
+               cd ..
+       else
+               echo "No metadata files found!"
+               exit 2
+       fi
+fi
 
 while read line; do
-    if [[ "$line" == *M*metadata/*.txt ]]; then
-        file=${line##* }
-
-        while read l; do
-            [[ "$l" == "Auto Name:"* ]] && name=${l##*:}
-        done < "$file"
-
-        id=${file##*/}
-        id=${id%.txt*}
-        [ -d metadata/$id ] && extra=metadata/$id
-        [ -n "$name" ] && id="$name ($id)"
-
-        newbuild=0
-        while read l; do
-            if [[ "$l" == "+Build:"* ]]; then
-                newbuild=1
-                build=${l#*:}
-                version=${build%%,*}
-                build=${build#*,}
-                vercode=${build%%,*}
-            fi
-        done < <(git diff HEAD -- "$file")
-
-        if [ $newbuild -eq 0 ]
-               then
-                       message="$id:"
+       [ -z "$line" ] && continue
+
+       case "$line" in
+               *\?\?*metadata/*.txt) new=true ;;
+               *M*metadata/*.txt) new=false ;;
+       esac
+
+       file=${line##* }
+       id=${file##*/}
+       id=${id%.txt*}
+
+       if [ $# -gt 0 ]; then
+               case "$@" in
+                       *" $id "*) ;;  # Middle
+                       "$id "*) ;;    # Start
+                       *" $id") ;;    # End
+                       "$id") ;;      # Alone
+                       *) continue ;; # Missing
+               esac
+       fi
+
+       [ -d metadata/$id ] && extra=metadata/$id || extra=
+
+       name= autoname=
+       while read l; do
+               case "$l" in
+                       'Auto Name:'*) autoname=${l#*:} ;;
+                       'Name:'*) name=${l#*:} ;;
+               esac
+       done < "$file"
+
+       if [ -n "$name" ]; then
+               fullname="$name"
+       elif [ -n "$autoname" ]; then
+               fullname="$autoname"
+       else
+               fullname="$id"
+       fi
+
+       if $new; then
+               message="New app: $fullname"
+       else
+               onlybuild=true
+               newbuild=false
+               disable=false
+
+               while read l; do
+                       case "$l" in
+                               *"Maintainer Notes:"*) break ;;
+                               "-Build:"*) onlybuild=false ;;
+                               "+Build:"*)
+                                       $newbuild && onlybuild=false
+                                       newbuild=true
+                                       build=${l#*:}
+                                       version=${build%%,*}
+                                       build=${build#*,}
+                                       vercode=${build%%,*}
+                                       ;;
+                               '+'*"disable="*)
+                                       $newbuild && $onlybuild && disable=true
+                                       ;;
+                       esac
+               done << EOF
+               $(git diff HEAD -- "$file")
+EOF
+
+               if $newbuild && $onlybuild; then
+                       if $disable; then
+                               message="Don't update $fullname to $version ($vercode)"
+                       else
+                               message="Update $fullname to $version ($vercode)"
+                       fi
                else
-                       message="Update $id to $version ($vercode)"
+                       message="$fullname:"
                fi
+       fi
 
-        commands+=("git commit -m '$message' -e -v -- $file $extra")
-    fi
-done < <(git status --porcelain)
+       message=${message//\"/\\\"}
+       commands="$commands%%git add -- $file $extra && git commit -m \"$message\" -e -v"
 
-for cmd in "${commands[@]}"; do
-    eval "$cmd"
-done
+done << EOF
+$(git status --porcelain metadata)
+EOF
+
+[ -z "$commands" ] && exit 0
 
+git reset >/dev/null
+IFS='%%'
+for cmd in $commands; do
+       [ -z "$cmd" ] && continue
+       eval $cmd
+       git reset >/dev/null
+done