]> arthur.barton.de Git - Autobuilder.git/blob - bin/autobuilder
Fix some shellcheck(1) warnings ...
[Autobuilder.git] / bin / autobuilder
1 #!/bin/sh
2 #
3 # 2012-01-22, alex@barton.de
4 #
5
6 MYNAME=$(basename "$0")
7
8 # options
9 FORCE=""
10 QUIETCMD=">/dev/null"
11
12 export LC_ALL=C
13
14 while [ $# -gt 0 ]; do
15         case "$1" in
16           "-f"|"--force")
17                 FORCE=1
18                 ;;
19           "-v"|"--verbose")
20                 QUIETCMD=
21                 ;;
22           *)
23                 echo "Usage: $MYNAME [--force|-f]" >&2
24                 exit 1
25         esac
26         shift
27 done
28
29 # defaults
30 AUTOBUILDER_D_DIR="/usr/local/etc/autobuilder/autobuild.d"
31 CACHE_DIR="/usr/local/var/cache/autobuilder"
32 MSG_PREFIX=" * "
33 ERR_PREFIX=" ! "
34
35 msg() {
36         echo "$MSG_PREFIX[$(date +%H:%M:%S)] $MYNAME: $*"
37 }
38
39 err() {
40         echo "$ERR_PREFIX[$(date +%H:%M:%S)] $MYNAME: $*" >&2
41 }
42
43 prepare_git() {
44         cd "$BASE_DIR" || return 1
45         if [ ! -d ".git" ]; then
46                 git clone "$REPOSITORY" .
47         else
48                 git pull --ff-only | grep "Already up-to-date." >/dev/null
49                 [ $? -eq 0 ] && return 9
50                 echo
51                 git shortlog ORIG_HEAD..
52         fi
53 }
54
55 build() {
56         msg "Building \"$NAME\" ..."
57         cd "$BASE_DIR" || return 1
58         date >"$BASE_DIR/.$MYNAME.dirty" || return 1
59
60         if [ -x "./autogen.sh" ]; then
61                 eval make $MAKE_ARGS_MAINTAINERCLEAN $QUIETCMD 2>&1
62                 eval ./autogen.sh $QUIETCMD
63         fi
64         if [ -x "./configure" ]; then
65                 eval ./configure $QUIETCMD
66         fi
67         eval make $MAKE_ARGS_BUILD $QUIETCMD
68         return $?
69 }
70
71 check() {
72         msg "Checking \"$NAME\" ..."
73         cd "$BASE_DIR" || return 1
74
75         eval make $MAKE_ARGS_CHECK $QUIETCMD
76 }
77
78 archive() {
79         msg "Archiving \"$NAME\" ..."
80         cd "$BASE_DIR" || return 1
81
82         eval make $MAKE_ARGS_DIST $QUIETCMD
83 }
84
85 publish() {
86         msg "Publishing \"$NAME\" ..."
87         cd "$BASE_DIR" || return 1
88
89         archive=$(ls -1rt -- *.tar.gz | tail -n 1)
90         if [ -z "$archive" ]; then
91                 err "No distribution archive found!?"
92                 return 1
93         fi
94
95         mv "$archive" "$DEST_DIR"/ || return 1
96         chmod a+rX "$DEST_DIR/$(basename "$archive")"
97         rm -f "$archive" "$BASE_DIR/.$MYNAME.dirty"
98
99         msg "New \"$NAME\" archive: \"$(basename "$archive")\""
100
101 }
102
103 # read in configuration
104 [ -r /etc/autobuilder/autobuilder.conf ] \
105         && . /etc/autobuilder/autobuilder.conf
106 [ -r /usr/local/etc/autobuilder/autobuilder.conf ] \
107         && . /usr/local/etc/autobuilder/autobuilder.conf
108
109 # read in and process projects in autobuild.d directory
110 for file in "$AUTOBUILDER_D_DIR"/*; do
111         file_name="$(basename "$file")"
112
113         # defaults
114         NAME=""
115         REPOSITORY=""
116         DEST_DIR=""
117         MAKE_ARGS_MAINTAINERCLEAN="maintainer-clean"
118         MAKE_ARGS_BUILD=""
119         MAKE_ARGS_CHECK="check"
120         MAKE_ARGS_DIST="dist"
121
122         if [ ! -r "$file" ]; then
123                 err "Can't read \"$file\"! Skipping."
124                 continue
125         fi
126
127         . "$file"
128
129         if [ -z "$NAME" ]; then
130                 err "$file_name: NAME no set! Skipping."
131                 continue
132         fi
133
134         if [ -z "$DEST_DIR" ]; then
135                 err "$file_name: DEST_DIR no set! Skipping."
136                 continue
137         fi
138
139         case "$TYPE" in
140           "git")
141                 ;;
142           *)
143                 err "$file_name: TYPE not set or unknown: \"$TYPE\"! Skipping."
144                 continue
145         esac
146
147         BASE_DIR="${CACHE_DIR}/${file_name}"
148         if [ ! -d "$BASE_DIR" ]; then
149                 msg "Creating base directory \"$BASE_DIR\" ..."
150                 mkdir -p "$BASE_DIR"
151                 if [ $? -ne 0 ]; then
152                         err "Failed to create directory \"$BASE_DIR\!"
153                         continue
154                 fi
155         fi
156
157         case "$TYPE" in
158           "git")
159                 prepare_git
160                 if [ $? -eq 9 ] \
161                  && [ -z "$FORCE" ] \
162                  && [ ! -e "$BASE_DIR/.$MYNAME.dirty" ]; then
163                         continue
164                 fi
165                 ;;
166         esac
167
168         build
169         if [ $? -ne 0 ]; then
170                 err "Building of \"$NAME\" FAILED!"
171                 continue
172         fi
173
174         if [ -n "$MAKE_ARGS_CHECK" ]; then
175                 check
176                 if [ $? -ne 0 ]; then
177                         err "Checking of \"$NAME\" FAILED!"
178                         continue
179                 fi
180         fi
181
182         archive
183         if [ $? -ne 0 ]; then
184                 err "Archiving of \"$NAME\" FAILED!"
185                 continue
186         fi
187
188         publish
189         if [ $? -ne 0 ]; then
190                 err "Can't publish \"$NAME\"!"
191                 continue
192         fi
193
194 done
195
196 # -eof-