summaryrefslogtreecommitdiffstats
path: root/commitpkg
blob: ab57a61df0a961cc368f9723b79ac7154347c42c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/bin/bash

abort() {
	echo ${1:-'Cancelled'}
	exit 1
}

getpkgfile() {
	if [[ ${#} -ne 1 ]]; then
		echo 'ERROR: No canonical package found!' >&2
		exit 1
	elif [ ! -f "${1}" ]; then
		echo "ERROR: Package ${1} not found!" >&2
		exit 1
	fi

	echo ${1}
}

# Source makepkg.conf; fail if it is not found
if [ -r '/etc/makepkg.conf' ]; then
	source '/etc/makepkg.conf'
else
	abort '/etc/makepkg.conf not found!'
fi

# Source user-specific makepkg.conf overrides
if [ -r ~/.makepkg.conf ]; then
	. ~/.makepkg.conf
fi

cmd=$(basename "$0")

if [ ! -f PKGBUILD ]; then
	abort 'No PKGBUILD file'
fi

. PKGBUILD
pkgbase=${pkgbase:-$pkgname}

# set up repo-specific opts depending on how we were called
server='gerolde.archlinux.org'
if [ "$cmd" == 'extrapkg' ]; then
	repo='extra'
elif [ "$cmd" == 'corepkg' ]; then
	repo='core'
elif [ "$cmd" == 'testingpkg' ]; then
	repo='testing'
elif [ "$cmd" == 'stagingpkg' ]; then
	repo='staging'
elif [ "$cmd" == 'communitypkg' ]; then
	repo='community'
	server='aur.archlinux.org'
elif [ "$cmd" == 'community-testingpkg' ]; then
	repo='community-testing'
	server='aur.archlinux.org'
elif [ "$cmd" == 'community-stagingpkg' ]; then
	repo='community-staging'
	server='aur.archlinux.org'
elif [ "$cmd" == 'multilibpkg' ]; then
	repo='multilib'
	server='aur.archlinux.org'
elif [ "$cmd" == 'multilib-testingpkg' ]; then
	repo='multilib-testing'
	server='aur.archlinux.org'
else
	if [ $# -eq 0 ]; then
		abort 'usage: commitpkg <reponame> [-l limit] [commit message]'
	fi
	repo="$1"
	shift
fi

# check if all local source files are under version control
(for s in ${source[@]}; do
	echo $s | grep -vq '://' && \
	svn status $s | grep -q '?' && \
	abort "$s is not under version control"
done) || true

# check if changelog and install files are under version control
(for i in 'changelog' 'install'; do
	filelist=$(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
	for file in $filelist; do
		# evaluate any bash variables used
		eval file=${file}
		if svn status ${file} | grep -q '?'; then
			abort "${file} is not under version control"
		fi
	done
done) || true

# see if any limit options were passed, we'll send them to rsync
unset rsyncopts
if [ "$1" = '-l' ]; then
	rsyncopts="--bwlimit=$2"
	shift 2
fi

echo -n 'committing changes to trunk...'
if [ -n "$1" ]; then
	svn commit -q -m "upgpkg: $pkgbase $pkgver-$pkgrel
$1" || abort
else
	svn commit -q || abort
fi
echo 'done'

for _arch in ${arch[@]}; do
	for _pkgname in ${pkgname[@]}; do
		pkgfile=$(getpkgfile "$_pkgname-$pkgver-$pkgrel-${_arch}".pkg.tar.* 2>/dev/null)
		pkgdestfile=$(getpkgfile "$PKGDEST/$_pkgname-$pkgver-$pkgrel-${_arch}".pkg.tar.* 2>/dev/null)

		if [ ! -f "$pkgfile" -a -f "$pkgdestfile" ]; then
			pkgfile="$pkgdestfile"
		elif [ ! -f "$pkgfile" ]; then
			echo "skipping ${_arch}"
			continue 2
		fi

		echo -n 'uploading '
		rsync -p --chmod 'ug=rw,o=r' -c -h -L --progress $rsyncopts --partial "${pkgfile}" -e ssh "$server:staging/$repo/${pkgfile##*/}" || abort
	done
	archrelease $repo-${_arch} || abort
done

if [ "${arch[*]}" == 'any' ]; then
	if [ -d ../repos/$repo-i686 -a -d ../repos/$repo-x86_64 ]; then
		pushd ../repos/ >/dev/null
		echo "removing $repo-i686 and $repo-x86_64..."
		svn rm $repo-i686
		svn rm $repo-x86_64
		svn commit -q -m "removed $repo-i686 and $repo-x86_64 for $pkgname"
		echo 'done'
		popd >/dev/null
	fi
fi