summaryrefslogtreecommitdiff
path: root/drain
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@sbcglobal.net>2017-01-28 01:28:49 -0500
committerLuke Shumaker <lukeshu@sbcglobal.net>2017-01-28 01:31:49 -0500
commit8b6b170f763a27ff7fa5bff3fb66d09eb3b7a102 (patch)
tree6eebd66653914709173ee76234fcd883c42dc903 /drain
parentc05d5042ce2fcb5174e808e6439b624edcc28fb4 (diff)
Initial commit of holo-files integration.
Diffstat (limited to 'drain')
-rwxr-xr-xdrain65
1 files changed, 43 insertions, 22 deletions
diff --git a/drain b/drain
index c739b12..c557823 100755
--- a/drain
+++ b/drain
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
-# Copyright 2016 Luke Shumaker
+# Copyright 2016-2017 Luke Shumaker
# This work is free. You can redistribute it and/or modify it under the
# terms of the Do What The Fuck You Want To Public License, Version 2,
# as published by Sam Hocevar. See the COPYING file for more details.
@@ -8,48 +8,69 @@
declare -r workdir=/var/lib/pristine-etc
-pacman-etc-name-ver() {
- LC_ALL=C pacman -Qo /etc | sed 's|^/etc/ is owned by ||'
+watchdirs=(
+ /etc
+ /usr/share/holo/files
+)
+readonly dirs
+
+pacman-watched-name-ver-dirs() {
+ local dir dirs
+ dirs=()
+ for dir in "${watchdirs[@]}"; do
+ if [[ -d "$dir" ]]; then
+ dirs+=("$dir")
+ fi
+ done
+ LC_ALL=C pacman -Qo "${dirs[@]}" | sed -r 's| is owned by | |' |
+ awk '{i=$2" "$3; a[i]=a[i]" "$1} END{for(i in a){print i " " a[i]}}'
}
pacman-all-name-arch() {
LC_ALL=C pacman -Qni | tr $'\n' $'\r' | sed 's/\r\r/\n/g' | sed -r 's|(.*\r)?Name\s*:\s*(\S+)(\r.*)?\rArchitecture\s*:\s*(\S+)\r.*|\2 \4|'
}
+pacman-watched-name-arch-ver-dirs() {
+ join <(pacman-all-name-arch|sort) <(pacman-watched-name-ver-dirs|sort)
+}
+
commit() (
- local msg="$1"
+ msg="$1"
cd "$workdir"
if ! [[ -d etc.git ]]; then
- mkdir -p etc
- (cd etc && etckeeper init -d "$PWD")
- mv etc/.git etc.git
+ mkdir -p chroot/etc
+ (cd chroot/etc && etckeeper init -d "$PWD")
+ mv chroot/etc/.git etc.git
ln -sr etc.git etc/.git
fi
-
- rm -rf etc/
-
- local err=false
- local files=()
- while IFS=' ' read -r pkgname pkgver arch; do
- local file=("/var/cache/pacman/pkg/$pkgname-$pkgver-$arch".pkg.tar.*)
+ rm -rf chroot
+ mkdir chroot
+ cd chroot
+
+ err=false
+ files=()
+ while IFS=' ' read -r pkgname arch pkgver dirs; do
+ file=("/var/cache/pacman/pkg/$pkgname-$pkgver-$arch".pkg.tar.*)
if ! test -f "$file"; then
printf "ERROR: no cached package for %s %s %s\n" "$pkgname" "$pkgver" "$arch"
err=true
fi
- files+=("$file")
- done < <(join <(pacman-etc-name-ver|sort) <(pacman-all-name-arch|sort))
+ files+=("$file $dirs")
+ done < <(pacman-watched-name-arch-ver-dirs
if $err; then
return 1
fi
- local file
- for file in "${files[@]}"; do
+ for filespec in "${files[@]}"; do
+ read file dirs_str <<<"$filespec"
+ read -a dirs <<<"$dirs_str"
printf " -> %s\n" "$file"
- bsdtar xpvf "$file" etc
+ bsdtar xpvf "$file" "${dirs[@]#/}"
done
- ln -sr etc.git etc/.git
+ ln -sr ../etc.git etc/.git
+ HOLO_ROOT_DIR=. holo apply
cd etc/
etckeeper update-ignore -d "$PWD"
if etckeeper unclean -d "$PWD"; then
@@ -59,7 +80,7 @@ commit() (
pull() (
cd /etc
- git remote add pristine "${workdir}/etc" &>/dev/null || true
+ git remote add pristine "${workdir}/chroot/etc" &>/dev/null || true
git fetch pristine
)
@@ -79,7 +100,7 @@ main() {
set -e -o pipefail
umask 0022
- if ! lock 7 "${workdir}/etc.lock" -n; then
+ if ! lock 7 "${workdir}/chroot.lock" -n; then
return 0
fi
while true; do