summaryrefslogtreecommitdiff
path: root/db-move
blob: 1b344040601d4b8980496f6781707babe13b643e (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
#!/bin/bash

. "$(dirname "$(readlink -e "$0")")/config"
. "$(dirname "$(readlink -e "$0")")/db-functions"

if [ $# -lt 3 ]; then
	msg "usage: ${0##*/} <repo-from> <repo-to> <pkgname|pkgbase> ..."
	exit 1
fi

args=(${@})
repo_from="${args[0]}"
repo_to="${args[1]}"
ftppath_from="${FTP_BASE}/${repo_from}/os/"
ftppath_to="${FTP_BASE}/${repo_to}/os/"

if ! check_repo_permission $repo_to || ! check_repo_permission $repo_from; then
	die "You don't have permission to move packages from ${repo_from} to ${repo_to}"
fi

# TODO: this might lock too much (architectures)
for pkgarch in ${ARCHES[@]}; do
	repo_lock ${repo_to} ${pkgarch} || exit 1
	repo_lock ${repo_from} ${pkgarch} || exit 1
done

# check if packages to be moved exist in xbs and ftp dir
for pkgbase in ${args[@]:2}; do
	for pkgarch in ${ARCHES[@]} 'any'; do
		xbsrepo_from="$(xbs releasepath ${pkgbase} ${repo_from} ${pkgarch})"
		if [ -r "${xbsrepo_from}/PKGBUILD" ]; then
			pkgnames=($(. "${xbsrepo_from}/PKGBUILD"; echo ${pkgname[@]}))
			if [ ${#pkgnames[@]} -lt 1 ]; then
				die "Could not read pkgname"
			fi


			if [ "${pkgarch}" == 'any' ]; then
				tarches=(${ARCHES[@]})
			else
				tarches=("${pkgarch}")
			fi

			for pkgname in ${pkgnames[@]}; do
				pkgver=$(. "${xbsrepo_from}/PKGBUILD"; get_full_version ${pkgname})
				if [ -z "${pkgver}" ]; then
					die "Could not read pkgver"
				fi
				for tarch in ${tarches[@]}; do
					getpkgfile "${ftppath_from}/${tarch}/"${pkgname}-${pkgver}-${pkgarch}${PKGEXT} >/dev/null
				done
			done
			continue 2
		fi
	done
	die "${pkgbase} not found in ${repo_from}"
done

msg "Moving packages from [${repo_from}] to [${repo_to}]..."

declare -A add_pkgs
declare -A remove_pkgs
for pkgbase in ${args[@]:2}; do
	# move the package in xbs
	arches=($(xbs move ${repo_from} ${repo_to} ${pkgbase}))
	# move the package in ftp
	for pkgarch in ${arches[@]}; do
		dir_to="$(xbs releasepath $pkgbase $repo_to $pkgarch)"
		if true; then # to add in indent level to make merging easier
			if [ "${pkgarch}" == 'any' ]; then
				tarches=("${ARCHES[@]}")
			else
				tarches=("${pkgarch}")
			fi
			pkgnames=($(. "${dir_to}/PKGBUILD"; echo ${pkgname[@]}))

			for pkgname in ${pkgnames[@]}; do
				pkgver=$(. "${dir_to}/PKGBUILD"; get_full_version ${pkgname})
				for tarch in ${tarches[@]}; do
					pkgpath=$(getpkgfile "${ftppath_from}/${tarch}/"${pkgname}-${pkgver}-${pkgarch}${PKGEXT})
					pkgfile="${pkgpath##*/}"

					ln -s "../../../${PKGPOOL}/${pkgfile}" ${ftppath_to}/${tarch}/
					if [ -f ${FTP_BASE}/${PKGPOOL}/${pkgfile}.sig ]; then
						ln -s "../../../${PKGPOOL}/${pkgfile}.sig" ${ftppath_to}/${tarch}/
					fi
					add_pkgs[${tarch}]+="${FTP_BASE}/${PKGPOOL}/${pkgfile} "
					remove_pkgs[${tarch}]+="${pkgname} "
				done
			done
		fi
	done
done

for tarch in ${ARCHES[@]}; do
	if [ -n "${add_pkgs[${tarch}]}" ]; then
		arch_repo_add "${repo_to}" "${tarch}" ${add_pkgs[${tarch}]}
		arch_repo_remove "${repo_from}" "${tarch}" ${remove_pkgs[${tarch}]}
	fi
done

for pkgarch in ${ARCHES[@]}; do
	repo_unlock ${repo_from} ${pkgarch}
	repo_unlock ${repo_to} ${pkgarch}
done