summaryrefslogtreecommitdiffstats
path: root/db-move
blob: 2bb2ea84702e80543202df3a090a4666d61007ec (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
#!/bin/bash

. "$(dirname $0)/config"
. "$(dirname $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 svn and ftp dir
/usr/bin/svn checkout -q -N "${SVNREPO}" "${WORKDIR}/svn" >/dev/null
for pkgbase in ${args[@]:2}; do
	/usr/bin/svn up -q "${WORKDIR}/svn/${pkgbase}" >/dev/null
	for pkgarch in ${ARCHES[@]} 'any'; do
		svnrepo_from="${WORKDIR}/svn/${pkgbase}/repos/${repo_from}-${pkgarch}"
		if [ -r "${svnrepo_from}/PKGBUILD" ]; then
			pkgnames=($(. "${svnrepo_from}/PKGBUILD"; echo ${pkgname[@]}))
			if [ ${#pkgnames[@]} -lt 1 ]; then
				die "Could not read pkgname"
			fi

			pkgver=$(. "${svnrepo_from}/PKGBUILD"; echo $(get_full_version ${epoch:-0} ${pkgver} ${pkgrel}))
			if [ -z "${pkgver}" ]; then
				die "Could not read pkgver"
			fi

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

			for pkgname in ${pkgnames[@]}; do
				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
	tag_list=""
	for pkgarch in ${ARCHES[@]} 'any'; do
		svnrepo_from="${WORKDIR}/svn/${pkgbase}/repos/${repo_from}-${pkgarch}"
		svnrepo_to="${WORKDIR}/svn/${pkgbase}/repos/${repo_to}-${pkgarch}"

		if [ -f "${svnrepo_from}/PKGBUILD" ]; then
			if [ "${pkgarch}" == 'any' ]; then
				tarches=(${ARCHES[@]})
			else
				tarches=("${pkgarch}")
			fi
			msg2 "${pkgbase} ($(echo ${tarches[@]}))"
			pkgnames=($(. "${svnrepo_from}/PKGBUILD"; echo ${pkgname[@]}))
			pkgver=$(. "${svnrepo_from}/PKGBUILD"; echo $(get_full_version ${epoch:-0} ${pkgver} ${pkgrel}))

			if [ -d "${svnrepo_to}" ]; then
				for file in $(/usr/bin/svn ls "${svnrepo_to}"); do
					/usr/bin/svn rm -q "${svnrepo_to}/$file"
				done
			else
				mkdir "${svnrepo_to}"
				/usr/bin/svn add -q "${svnrepo_to}"
			fi

			for file in $(svn ls "${svnrepo_from}"); do
				/usr/bin/svn mv -q -r HEAD "${svnrepo_from}/$file" "${svnrepo_to}/"
			done
			/usr/bin/svn rm --force -q "${svnrepo_from}"
			tag_list="$tag_list,  $pkgarch"

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

					# copy package to pool if needed
					# TODO: can be removed once every package has been moved to the package pool
					if [ ! -f ${FTP_BASE}/${PKGPOOL}/${pkgfile} ]; then
						cp ${pkgpath} ${FTP_BASE}/${PKGPOOL}
					fi
					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
	tag_list="${tag_list#, }"
	/usr/bin/svn commit -q "${WORKDIR}/svn/${pkgbase}" -m "${0##*/}: moved ${pkgbase} from [${repo_from}] to [${repo_to}] (${tag_list})"
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