Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / autopkg.sh @ 30761818

History | View | Annotate | Download (5.8 kB)

1 0ac84a9a Dimitris Aragiorgis
#!/bin/bash
2 0ac84a9a Dimitris Aragiorgis
3 0ac84a9a Dimitris Aragiorgis
usage(){
4 0ac84a9a Dimitris Aragiorgis
5 0ac84a9a Dimitris Aragiorgis
  echo "
6 0ac84a9a Dimitris Aragiorgis
Usage: $0: [options]
7 0ac84a9a Dimitris Aragiorgis
  -h, --help          Prints this help message
8 0ac84a9a Dimitris Aragiorgis
  --debian [branch]   Local debian branch to use (default debian)
9 0ac84a9a Dimitris Aragiorgis
  --upstream [branch] Local upstream branch to use (default master)
10 0ac84a9a Dimitris Aragiorgis
  --remote [repo]     Remote repo to use (default origin)
11 0ac84a9a Dimitris Aragiorgis
  --packages [dir]    Where to store the created packages (default ~/packages)
12 0ac84a9a Dimitris Aragiorgis
  --validate          Fetch remote repo branches and
13 0ac84a9a Dimitris Aragiorgis
                      check if local are up-to-date (default false)
14 0ac84a9a Dimitris Aragiorgis
  --push              Whether to push upstream (default false)
15 0ac84a9a Dimitris Aragiorgis
"
16 0ac84a9a Dimitris Aragiorgis
  exit 1
17 0ac84a9a Dimitris Aragiorgis
}
18 0ac84a9a Dimitris Aragiorgis
19 0ac84a9a Dimitris Aragiorgis
parse_git_branch()
20 0ac84a9a Dimitris Aragiorgis
{
21 0ac84a9a Dimitris Aragiorgis
    git branch 2> /dev/null | grep '^*' | sed 's/^*\ //g'
22 0ac84a9a Dimitris Aragiorgis
}
23 0ac84a9a Dimitris Aragiorgis
24 0ac84a9a Dimitris Aragiorgis
die()
25 0ac84a9a Dimitris Aragiorgis
{
26 0ac84a9a Dimitris Aragiorgis
    echo -e $* 1>&2
27 0ac84a9a Dimitris Aragiorgis
    echo Aborting.
28 0ac84a9a Dimitris Aragiorgis
    exit 1
29 0ac84a9a Dimitris Aragiorgis
}
30 0ac84a9a Dimitris Aragiorgis
31 0ac84a9a Dimitris Aragiorgis
cleanup()
32 0ac84a9a Dimitris Aragiorgis
{
33 0ac84a9a Dimitris Aragiorgis
    trap - EXIT
34 0ac84a9a Dimitris Aragiorgis
35 0ac84a9a Dimitris Aragiorgis
    echo -n Cleaning up...
36 0ac84a9a Dimitris Aragiorgis
    if [ ${#CLEANUP[*]} -gt 0 ]; then
37 0ac84a9a Dimitris Aragiorgis
        LAST_ELEMENT=$((${#CLEANUP[*]}-1))
38 0ac84a9a Dimitris Aragiorgis
        REVERSE_INDEXES=$(seq ${LAST_ELEMENT} -1 0)
39 0ac84a9a Dimitris Aragiorgis
        for i in $REVERSE_INDEXES; do
40 0ac84a9a Dimitris Aragiorgis
            local cmd=${CLEANUP[$i]}
41 0ac84a9a Dimitris Aragiorgis
            $cmd
42 0ac84a9a Dimitris Aragiorgis
        done
43 0ac84a9a Dimitris Aragiorgis
    fi
44 0ac84a9a Dimitris Aragiorgis
    echo "done"
45 0ac84a9a Dimitris Aragiorgis
}
46 0ac84a9a Dimitris Aragiorgis
47 0ac84a9a Dimitris Aragiorgis
add_cleanup() {
48 0ac84a9a Dimitris Aragiorgis
    local cmd=""
49 0ac84a9a Dimitris Aragiorgis
    for arg; do cmd+=$(printf "%q " "$arg"); done
50 0ac84a9a Dimitris Aragiorgis
    CLEANUP+=("$cmd")
51 0ac84a9a Dimitris Aragiorgis
}
52 0ac84a9a Dimitris Aragiorgis
53 0ac84a9a Dimitris Aragiorgis
54 0ac84a9a Dimitris Aragiorgis
add_checkpoint()
55 0ac84a9a Dimitris Aragiorgis
{
56 0ac84a9a Dimitris Aragiorgis
    commit=$(git reflog | head -n1 | cut -f 1 -d " ")
57 0ac84a9a Dimitris Aragiorgis
    add_cleanup git reset --hard $commit
58 0ac84a9a Dimitris Aragiorgis
    LASTCHECKPOINT=$commit
59 0ac84a9a Dimitris Aragiorgis
}
60 0ac84a9a Dimitris Aragiorgis
61 0ac84a9a Dimitris Aragiorgis
CLEANUP=( )
62 0ac84a9a Dimitris Aragiorgis
63 0ac84a9a Dimitris Aragiorgis
64 0ac84a9a Dimitris Aragiorgis
TEMP=$(getopt -o h --long help,validate,push,packages:,upstream:,debian:,remote: -n 'autopkg.sh' -- "$@")
65 0ac84a9a Dimitris Aragiorgis
66 0ac84a9a Dimitris Aragiorgis
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
67 0ac84a9a Dimitris Aragiorgis
68 0ac84a9a Dimitris Aragiorgis
eval set -- "$TEMP"
69 0ac84a9a Dimitris Aragiorgis
70 0ac84a9a Dimitris Aragiorgis
while true ; do
71 0ac84a9a Dimitris Aragiorgis
  case "$1" in
72 0ac84a9a Dimitris Aragiorgis
    -h|--help) usage ;;
73 0ac84a9a Dimitris Aragiorgis
    --upstream) LOCALUPSTREAM=$2 ; shift 2 ;;
74 0ac84a9a Dimitris Aragiorgis
    --debian) LOCALDEBIAN=$2 ; shift 2 ;;
75 0ac84a9a Dimitris Aragiorgis
    --remote) REMOTE=$2 ; shift 2 ;;
76 0ac84a9a Dimitris Aragiorgis
    --packages) PKGAREA=$2 ; shift 2 ;;
77 0ac84a9a Dimitris Aragiorgis
    --validate) VALIDATE=true ; shift ;;
78 0ac84a9a Dimitris Aragiorgis
    --push) PUSH=true ; shift ;;
79 0ac84a9a Dimitris Aragiorgis
    --) shift ; break ;;
80 0ac84a9a Dimitris Aragiorgis
    *) echo "Internal error!" ; usage ;;
81 0ac84a9a Dimitris Aragiorgis
  esac
82 0ac84a9a Dimitris Aragiorgis
done
83 0ac84a9a Dimitris Aragiorgis
84 0ac84a9a Dimitris Aragiorgis
# The root of the git repository, no matter where we're called from
85 0ac84a9a Dimitris Aragiorgis
TOPLEVEL="$(git rev-parse --show-toplevel)"
86 0ac84a9a Dimitris Aragiorgis
87 0ac84a9a Dimitris Aragiorgis
: ${LOCALUPSTREAM:=$(parse_git_branch)}
88 0ac84a9a Dimitris Aragiorgis
: ${LOCALDEBIAN:=debian}
89 0ac84a9a Dimitris Aragiorgis
: ${REMOTE:=origin}
90 0ac84a9a Dimitris Aragiorgis
: ${VALIDATE:=false}
91 0ac84a9a Dimitris Aragiorgis
: ${PUSH:=false}
92 0ac84a9a Dimitris Aragiorgis
93 0ac84a9a Dimitris Aragiorgis
: ${PKGAREA:=~/packages}
94 0ac84a9a Dimitris Aragiorgis
: ${BACKUPAREA:=~/backup}
95 0ac84a9a Dimitris Aragiorgis
96 0ac84a9a Dimitris Aragiorgis
cd "$TOPLEVEL"
97 0ac84a9a Dimitris Aragiorgis
98 0ac84a9a Dimitris Aragiorgis
# Prerequisites: Test all important directories exist
99 0ac84a9a Dimitris Aragiorgis
test -d "$PKGAREA" || die "Package area directory $PKGAREA missing"
100 0ac84a9a Dimitris Aragiorgis
test -d "$BACKUPAREA" || die "Backup area directory $BACKUPAREA missing"
101 0ac84a9a Dimitris Aragiorgis
102 0ac84a9a Dimitris Aragiorgis
# Prerequisite: Test the dialog utility is available
103 0ac84a9a Dimitris Aragiorgis
dialog --help &>/dev/null || die "Could not run the 'dialog' utility"
104 0ac84a9a Dimitris Aragiorgis
105 0ac84a9a Dimitris Aragiorgis
BUILDAREA=$(mktemp -d --tmpdir=/tmp build-area.XXX)
106 0ac84a9a Dimitris Aragiorgis
add_cleanup rm -r $BUILDAREA
107 0ac84a9a Dimitris Aragiorgis
108 0ac84a9a Dimitris Aragiorgis
echo "############################################################################"
109 0ac84a9a Dimitris Aragiorgis
echo "Will build packages under $BUILDAREA"
110 0ac84a9a Dimitris Aragiorgis
echo "Local upstream branch: $LOCALUPSTREAM"
111 0ac84a9a Dimitris Aragiorgis
echo "Local debian branch: $LOCALDEBIAN"
112 0ac84a9a Dimitris Aragiorgis
$VALIDATE && echo "Will fetch $REMOTE and check if $LOCALUPSTREAM and $LOCALDEBIAN are up-to-date"
113 0ac84a9a Dimitris Aragiorgis
echo "############################################################################"
114 0ac84a9a Dimitris Aragiorgis
echo "Press Enter to continue..."
115 0ac84a9a Dimitris Aragiorgis
read
116 0ac84a9a Dimitris Aragiorgis
117 0ac84a9a Dimitris Aragiorgis
MODIFIED=$(git status --short | grep -v "??")
118 0ac84a9a Dimitris Aragiorgis
test -z "$MODIFIED" || die "error: Repository is dirty. Commit your local changes:\n $MODIFIED"
119 0ac84a9a Dimitris Aragiorgis
120 0ac84a9a Dimitris Aragiorgis
set -e
121 0ac84a9a Dimitris Aragiorgis
trap cleanup EXIT
122 0ac84a9a Dimitris Aragiorgis
123 0ac84a9a Dimitris Aragiorgis
add_checkpoint
124 0ac84a9a Dimitris Aragiorgis
125 0ac84a9a Dimitris Aragiorgis
# Create a temporary debian branch to do everything
126 0ac84a9a Dimitris Aragiorgis
TMPDEBIAN=$(mktemp -u debian.XXX)
127 0ac84a9a Dimitris Aragiorgis
git branch --track $TMPDEBIAN  $LOCALDEBIAN
128 0ac84a9a Dimitris Aragiorgis
add_cleanup git branch -D $TMPDEBIAN
129 0ac84a9a Dimitris Aragiorgis
130 0ac84a9a Dimitris Aragiorgis
git checkout $TMPDEBIAN
131 0ac84a9a Dimitris Aragiorgis
add_cleanup git checkout $LOCALUPSTREAM
132 0ac84a9a Dimitris Aragiorgis
133 0ac84a9a Dimitris Aragiorgis
# Whether we are in snapshot or release mode
134 0ac84a9a Dimitris Aragiorgis
snap=false
135 0ac84a9a Dimitris Aragiorgis
mrgextra=-m
136 0ac84a9a Dimitris Aragiorgis
dchextra=-R
137 0ac84a9a Dimitris Aragiorgis
mrgmsg="Merge branch '$LOCALUPSTREAM' into $LOCALDEBIAN"
138 0ac84a9a Dimitris Aragiorgis
dialog --yesno "Create Snapshot?" 5 20 && snap=true  && dchextra=-S && mrgextra= && mrgmsg=
139 0ac84a9a Dimitris Aragiorgis
140 0ac84a9a Dimitris Aragiorgis
# merge local branch into tmp branch with a nice commit message,
141 0ac84a9a Dimitris Aragiorgis
# so it can be pushed as is to upstream debian
142 0ac84a9a Dimitris Aragiorgis
export GIT_MERGE_AUTOEDIT=no
143 0ac84a9a Dimitris Aragiorgis
git merge $mrgextra ${mrgextra:+"$mrgmsg"} $LOCALUPSTREAM
144 0ac84a9a Dimitris Aragiorgis
145 0ac84a9a Dimitris Aragiorgis
# auto edit Debian changelog depending on Snapshot or Release mode
146 0ac84a9a Dimitris Aragiorgis
export EDITOR=/usr/bin/vim
147 0ac84a9a Dimitris Aragiorgis
git-dch --debian-branch=$TMPDEBIAN --git-author --ignore-regex=".*" --multimaint-merge --since=HEAD $dchextra
148 0ac84a9a Dimitris Aragiorgis
git add debian/changelog
149 0ac84a9a Dimitris Aragiorgis
150 0ac84a9a Dimitris Aragiorgis
# get version from the changelog
151 0ac84a9a Dimitris Aragiorgis
# we add a git tag here, so setup.py sdist works as expected
152 0ac84a9a Dimitris Aragiorgis
# FIXME: This is a workaround for the way Synnefo packages determine
153 0ac84a9a Dimitris Aragiorgis
#        the versions for their Python packages
154 0ac84a9a Dimitris Aragiorgis
version=$(IFS="()" ; read  x v x < debian/changelog  ; echo $v)
155 0ac84a9a Dimitris Aragiorgis
if ! $snap; then
156 0ac84a9a Dimitris Aragiorgis
  git commit -s -a -m "Bump new upstream version"
157 0ac84a9a Dimitris Aragiorgis
  TAGFILE=$(mktemp -t tag.XXX)
158 0ac84a9a Dimitris Aragiorgis
  add_cleanup rm $TAGFILE
159 0ac84a9a Dimitris Aragiorgis
  dialog --inputbox "New Debian Tag: " 5 30 "debian/$version" 2>$TAGFILE
160 0ac84a9a Dimitris Aragiorgis
  git tag $(<$TAGFILE)
161 0ac84a9a Dimitris Aragiorgis
  add_cleanup git tag -d $(<$TAGFILE)
162 0ac84a9a Dimitris Aragiorgis
fi
163 0ac84a9a Dimitris Aragiorgis
164 0ac84a9a Dimitris Aragiorgis
add_cleanup git reset --hard HEAD
165 0ac84a9a Dimitris Aragiorgis
# Build all packages
166 0ac84a9a Dimitris Aragiorgis
git-buildpackage --git-export-dir="$BUILDAREA" \
167 0ac84a9a Dimitris Aragiorgis
                 --git-upstream-branch=$LOCALUPSTREAM \
168 0ac84a9a Dimitris Aragiorgis
                 --git-debian-branch=$TMPDEBIAN \
169 0ac84a9a Dimitris Aragiorgis
                 --git-export=INDEX \
170 0ac84a9a Dimitris Aragiorgis
                 --git-ignore-new -sa
171 0ac84a9a Dimitris Aragiorgis
172 0ac84a9a Dimitris Aragiorgis
# do some dirty backup
173 0ac84a9a Dimitris Aragiorgis
# pkgarea might be needed by auto-deploy tool
174 0ac84a9a Dimitris Aragiorgis
rm -f "$PKGAREA"/* || true
175 0ac84a9a Dimitris Aragiorgis
cp -v "$BUILDAREA"/* "$PKGAREA"/ || true
176 0ac84a9a Dimitris Aragiorgis
cp -v "$BUILDAREA"/* "$BACKUPAREA"/ || true
177 0ac84a9a Dimitris Aragiorgis
178 0ac84a9a Dimitris Aragiorgis
179 0ac84a9a Dimitris Aragiorgis
180 0ac84a9a Dimitris Aragiorgis
function check_remote(){
181 0ac84a9a Dimitris Aragiorgis
182 0ac84a9a Dimitris Aragiorgis
  git fetch $1 2>/dev/null || die "Could not fetch $1"
183 0ac84a9a Dimitris Aragiorgis
  git fetch $1 $2 2>/dev/null|| die "Could not fetch $1/$2"
184 0ac84a9a Dimitris Aragiorgis
185 0ac84a9a Dimitris Aragiorgis
  commits_behind=$(git rev-list $2..$1/$2 | wc -l)
186 0ac84a9a Dimitris Aragiorgis
  if [ $commits_behind -ne 0 ]; then
187 0ac84a9a Dimitris Aragiorgis
    die "Your local branch is outdated. Please run:\ngit pull --rebase $1/$2"
188 0ac84a9a Dimitris Aragiorgis
  fi
189 0ac84a9a Dimitris Aragiorgis
190 0ac84a9a Dimitris Aragiorgis
191 0ac84a9a Dimitris Aragiorgis
}
192 0ac84a9a Dimitris Aragiorgis
193 0ac84a9a Dimitris Aragiorgis
if $VALIDATE; then
194 0ac84a9a Dimitris Aragiorgis
  check_remote $REMOTE $LOCALUPSTREAM
195 0ac84a9a Dimitris Aragiorgis
  check_remote $REMOTE $LOCALDEBIAN
196 0ac84a9a Dimitris Aragiorgis
fi
197 0ac84a9a Dimitris Aragiorgis
198 0ac84a9a Dimitris Aragiorgis
199 0ac84a9a Dimitris Aragiorgis
  # trap - EXIT
200 0ac84a9a Dimitris Aragiorgis
  # here we can push the commits to the remote debian branch as they are
201 0ac84a9a Dimitris Aragiorgis
echo
202 0ac84a9a Dimitris Aragiorgis
echo "#################################################"
203 0ac84a9a Dimitris Aragiorgis
echo "##                  SUCCESS                    ##"
204 0ac84a9a Dimitris Aragiorgis
echo "#################################################"
205 0ac84a9a Dimitris Aragiorgis
if $PUSH; then
206 0ac84a9a Dimitris Aragiorgis
  git push --tags $REMOTE $TMPDEBIAN:$LOCALDEBIAN
207 0ac84a9a Dimitris Aragiorgis
  git push $REMOTE $LOCALUPSTREAM:$LOCALUPSTREAM
208 0ac84a9a Dimitris Aragiorgis
fi
209 0ac84a9a Dimitris Aragiorgis
210 0ac84a9a Dimitris Aragiorgis
exit 0