diff options
author | Luke Shumaker <lukeshu@sbcglobal.net> | 2017-01-28 01:28:49 -0500 |
---|---|---|
committer | Luke Shumaker <lukeshu@sbcglobal.net> | 2017-01-28 01:31:49 -0500 |
commit | 8b6b170f763a27ff7fa5bff3fb66d09eb3b7a102 (patch) | |
tree | 6eebd66653914709173ee76234fcd883c42dc903 /drain | |
parent | c05d5042ce2fcb5174e808e6439b624edcc28fb4 (diff) |
Initial commit of holo-files integration.
Diffstat (limited to 'drain')
-rwxr-xr-x | drain | 65 |
1 files changed, 43 insertions, 22 deletions
@@ -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 |