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

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

if (( $# < 3 )); then
	msg "usage: %s <repo-from> <repo-to> <pkgname|pkgbase> ..." "${0##*/}"
	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 %s to %s" "$repo_from" "$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
arch_svn checkout -q -N "${SVNREPO}" "${WORKDIR}/svn" >/dev/null
for pkgbase in "${args[@]:2}"; do
	arch_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[@]} < 1 )); then
				die "Could not read pkgname"
			fi

			pkgver=$(. "${svnrepo_from}/PKGBUILD"; get_full_version)
			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}"${PKGEXTS} >/dev/null
				done
			done
			continue 2
		fi
	done
	die "%s not found in %s" "$pkgbase" "$repo_from"
done

msg "Moving packages from [%s] to [%s]..." "$repo_from" "$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 "%s (%s)" "$pkgbase" "${tarches[*]}"
			pkgnames=($(. "${svnrepo_from}/PKGBUILD"; echo "${pkgname[@]}"))
			pkgver=$(. "${svnrepo_from}/PKGBUILD"; get_full_version)

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

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

			for pkgname in "${pkgnames[@]}"; do
				for tarch in "${tarches[@]}"; do
					pkgpath=$(getpkgfile "${ftppath_from}/${tarch}/${pkgname}-${pkgver}-${pkgarch}"${PKGEXTS})
					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
	tag_list="${tag_list#, }"
	arch_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_modify add "${repo_to}" "${tarch}" ${add_pkgs[${tarch}]}
		arch_repo_modify 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