]> CyberLeo.Net >> Repos - CDN/cdn-ports-overlay.git/blob - update
Split this up later
[CDN/cdn-ports-overlay.git] / update
1 #!/bin/sh
2
3 # Run as root
4 [ "$(id -u)" -eq 0 ] || exec sudo "${0}" "${@}"
5 cd "$(dirname "${0}")"
6
7 meh() { printf " \033[1;32m*\033[0m %s\n" "${*}"; }
8 omg() { printf " \033[1;33m*\033[0m %s\n" "${*}"; }
9 wtf() { printf " \033[1;31m*\033[0m %s\n" "${*}"; kill $$; exit 1; }
10
11 sync="rsync://paka/freebsd-ports"
12
13 ports=alba/ports
14 upstream=alba/srcs/freebsd/ports/upstream
15 prepare=alba/srcs/freebsd/ports/prepare
16
17 today="$(date +%Y-%m-%d)"
18 ports_origin="$(zfs get -H -o value origin "${ports}")"
19 ports_origin="${ports_origin%%@*}"
20 ports_fs="$(zfs get -H -o value mountpoint "${ports}")"
21 upstream_fs="$(zfs get -H -o value mountpoint "${upstream}")"
22
23 # Make sure the ports tree is a descendent of the ports upstream
24 [ "${ports_origin}" = "${upstream}" ] || wtf "Target ${ports} is not a child of ${upstream}
25   (is ${ports_origin})"
26
27 # Compute the next available snapshot
28 last_snapshot="$(zfs list -rHt snapshot -o name "${upstream}" | grep "@${today}_" | sort | tail -n 1 | sed -e 's/^.*_\([0-9]\{2\}\)$/\1/')"
29 if [ "${last_snapshot}" ]
30 then
31   snapshot="$(printf "${today}_%02u" "$(( ${last_snapshot} + 1 ))")"
32   echo "${today}_${last_snapshot} -> ${snapshot}"
33 else
34   snapshot="${today}_00"
35   echo "None -> ${snapshot}"
36 fi
37
38 # Bail out if anything is /
39 [ -z "${ports_fs}"  -o -z "${upstream_fs}" ] && wtf "Writing to /? Are you nuts?"
40
41 meh "Update"
42 rsync --archive --compress --delete --hard-links --sparse --stats --verbose "${sync}/" "${upstream_fs}/" || wtf "update failed"
43
44 meh "Snapshot"
45 zfs snapshot "${upstream}@${snapshot}" || wtf "snapshot failed"
46
47 meh "Clone"
48 zfs clone "${upstream}@${snapshot}" "${prepare}" || wtf "clone failed"
49
50 # Resolve filesystem mountpoints, now that everything should exist
51 prepare_fs="$(zfs get -H -o value mountpoint "${prepare}")"
52
53 meh "Overlay"
54 ( cd ports; find * | cpio -p "${prepare_fs}" ) || wtf "overlay failed"
55
56 meh "Patch"
57 for patch in patch/*.patch
58 do
59   meh "... ${patch}"
60   ( cd "${prepare_fs}"; patch -p0 ) < "${patch}" || wtf "patch failed"
61 done
62
63 meh "Install"
64 zfs rename "${ports}" "${ports}-bak" || wtf "backup rename failed"
65 zfs rename "${prepare}" "${ports}" || wtf "rename prepare -> ports failed"
66 zfs inherit mountpoint "${ports}-bak" || wtf "inherit failed"
67 zfs set mountpoint="${ports_fs}" "${ports}" || wtf "mountpoint failed"
68 zfs destroy "${ports}-bak" || wtf "destroy failed"
69
70 meh "All done"