summaryrefslogtreecommitdiffstats
path: root/buildrepo.in
blob: 0fb7c12193154b169900b9de5db40e743173c470 (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
#!/bin/sh

program=${0##*/}

aportsdir=${APORTSDIR:-$HOME/aports}
repodir=${REPODIR:-$HOME/packages}


usage() {
	echo "usage: $program [-a APORTSDIR] [-d REPODIR] [-hp] [-l LOGPREFIX ]"
	echo "                [-r DEPREPO] REPOSITORY..."
	
	echo "options:"
	echo " -a  Set the aports base dir to APORTSDIR instead of $aportsdir"
	echo " -d  Set destination repository base dir to REPODIR instead of $repodir"
	echo " -h  Show this help and exit"
	echo " -l  Send build to logfile, prefixed by LOGPREFIX"
	echo " -p  Purge obsolete packages from REPODIR after build"
	echo " -r  Dependencies are found in DEPREPO"
	exit 1
}


listpackages() {
	cd "$aportsdir/$1"
	for i in */APKBUILD; do
		APKBUILD=$i abuild listpkg
	done
}

all_exist() {
	while [ $# -gt 0 ]; do
		[ -e "$1" ] || return 1
		shift 1
	done
	return 0
}
	
build() {
	local repo="$1" i needbuild

	cd "$aportsdir/$repo" || return 0

	# first we try copy everything possible and find out which we need
	# to rebuild. By doing this we might save us for rebuilding 
	# needed when running 'abuild -R'
	for i in */APKBUILD; do
		[ -f "$aportsdir/$repo/$i" ] || continue
		export REPODEST="$repodir"
		cd "$aportsdir/$repo"/${i%/*} || return 1
		if abuild -k -q up2date 2>/dev/null; then
			continue
		fi

		# try link or copy the files if they are in the ports dir
		pkgs=$(abuild listpkg)
		if all_exist $pkgs; then
			echo ">>> Copying " $pkgs
			cp -p -l $pkgs "$repodir/$repo"/ 2>/dev/null \
				|| cp -p $pkgs "$repodir/$repo"/ \
				|| needbuild="$needbuild $i"
		else
			needbuild="$needbuild $i"
		fi
	done

	# build the postponed packages if any
	if [ -n "$needbuild" ]; then
		for i in $needbuild; do
			cd "$aportsdir/$repo"/${i%/*} || return 1
			abuild -k -R || return 1
		done
	fi

	# kill old packages in repo
	if [ -n "$dopurge" ]; then
		local tmp=$(mktemp /tmp/$program-XXXXXX)
		local purgefiles
		cd "$repodir/$1" || return 1
		trap 'rm -f "$tmp"; exit 1' INT
		( listpackages "$1") >$tmp
		purge=$(ls *.apk 2>/dev/null | grep -v -w -f $tmp)
		if [ -n "$purge" ]; then
			rm -f $purge
		fi
		rm -f "$tmp"
	fi

	# generate the repository index
	echo ">>> Generating Index for $repo..."
	cd "$repodir/$repo"
	local deps
	for i in $deprepo; do
		deps="--repo $repodir/$i"
	done
	oldindex=
	if [ -f APKINDEX.tar.gz ]; then
		oldindex="--index APKINDEX.tar.gz"
	fi
	tmpindex=$(mktemp).tar.gz
	apk index $oldindex -o $tmpindex \
		--description "$repo $(cd $aportsdir && git describe)" \
		*.apk
	abuild-sign $tmpindex && mv $tmpindex APKINDEX.tar.gz
	chmod 644 APKINDEX.tar.gz
	rm -f tmp.*
}

while getopts "a:d:hl:pr:" opt; do
	case "$opt" in
		a) aportsdir=$OPTARG;;
		d) repodir=$OPTARG;;
		h) usage >&2;;
		l) logprefix=$OPTARG;;
		p) dopurge=1;;
		r) deprepo="$deprepo $OPTARG";;
	esac
done
shift $(($OPTIND - 1))

[ $# -eq 0 ] && usage >&2

while [ $# -gt 0 ]; do
	if [ -n "$logprefix" ]; then
		build $1  >$logprefix.$1.log 2>&1 || exit 1
	else
		build $1 || exit 1
	fi
	deprepo="$deprepo $1"
	shift
done