summaryrefslogtreecommitdiff
path: root/src/chroot-tools/libremakepkg.gpl2
blob: 6b7180b7e556bebc636fef572c291878a6a4add8 (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
#!/bin/bash
# Contains code derived from devtools' "makechrootpkg"

# Copyright 2011-2012 The Arch Linux Development Team
# Copyright 2012 Luke Shumaker
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

chroot_init() {
	# make sure the chroot exists
	librechroot -n "$CHROOT" -l "$CHROOTCOPY" -m

	if [[ -r "$LIBREHOME/.gnupg/pubring.gpg" ]]; then
		install -D "$LIBREHOME/.gnupg/pubring.gpg" "$copydir/build/.gnupg/pubring.gpg"
	fi
	rm -f "$copydir/build/.makepkg.conf"

	mkdir -p "$copydir/pkgdest"
	mkdir -p "$copydir/srcdest"

	MAKEPKG_CONF=$copydir/etc/makepkg.conf set_conf_makepkg PKGDEST /pkgdest
	MAKEPKG_CONF=$copydir/etc/makepkg.conf set_conf_makepkg SRCDEST /srcdest

	cat > "$copydir/etc/sudoers.d/nobody-pacman" <<EOF
Defaults env_keep += "HOME"
nobody ALL = NOPASSWD: /usr/bin/pacman
EOF
	chmod 440 "$copydir/etc/sudoers.d/nobody-pacman"
}


chroot_copy_in() {
	rm -rf "$copydir"/build/*
	cp PKGBUILD "$copydir/build/"
	(
		set +euE
		source PKGBUILD

		# Copy source files
		for file in "${source[@]}"; do
			file="${file%%::*}"
			file="${file##*://*/}"
			if [[ -f $file ]]; then
				cp "$file" "$copydir/srcdest/"
			elif [[ -f $SRCDEST/$file ]]; then
				cp "$SRCDEST/$file" "$copydir/srcdest/"
			fi
		done

		# Find all changelog and install files, even inside functions
		for i in 'changelog' 'install'; do
			while read -r file; do
				# evaluate any bash variables used
				eval file=\"$(sed 's/^\(['\''"]\)\(.*\)\1$/\2/' <<< "$file")\"
				if [[ -f $file ]]; then
					cp "$file" "$copydir/build/"
				fi
			done < <(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
		done
	)

	chown -R nobody "$copydir"/{build,pkgdest,srcdest}
}

chroot_exec() {
	local HASNET=true
	[[ $1 == -N ]] && { HASNET=false; shift; }

	local cmd="$*"
	cat >"$copydir/chrootexec" <<EOF
#!/bin/bash
. /etc/profile
${INCHROOT} || export HOME=/build
${INCHROOT} || cd /build

${cmd}
EOF
	chmod 755 "$copydir/chrootexec"

	local flags=''
	if $INCHROOT; then
		$HASNET || flags='-n'
		unshare $flags -- /chrootexec
	else
		$HASNET || flags='-N'
		librechroot $flags -n "$CHROOT" -l "$CHROOTCOPY" -r /chrootexec
	fi
}

add_to_local_repo() {
	for pkgfile in "$copydir"/pkgdest/*.pkg.tar*; do
		mkdir -p "$copydir/repo"
		pushd "$copydir/repo" >/dev/null
		cp "$pkgfile" .
		repo-add repo.db.tar.gz "${pkgfile##*/}"
		popd >/dev/null
	done
}
chroot_copy_out() {
	for pkgfile in "$copydir"/pkgdest/*.pkg.tar*; do
		chown "$LIBREUSER" "$pkgfile"
		mv "$pkgfile" "$PKGDEST"
		if [[ $PKGDEST != . ]]; then
			ln -s "$PKGDEST/${pkgfile##*/}" .
		fi
	done
	copy_logs
}