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