diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 5 | ||||
-rw-r--r-- | README.org | 60 |
3 files changed, 64 insertions, 2 deletions
@@ -1,2 +1,3 @@ tangle/* +hash/* *.patch
\ No newline at end of file @@ -1,6 +1,6 @@ dst_readme := tangle.sh merge.sh pull.sh link.sh dots.sh -.PHONY: merge install link tangle fetch pull +.PHONY: merge install link tangle fetch pull clean merge: tangle/merge.sh tangle/merge.sh @@ -10,6 +10,9 @@ install: tangle link tangle: tangle/tangle.sh tangle/tangle.sh +clean: + rm hash/* + link: tangle/link.sh tangle/link.sh @@ -1,3 +1,4 @@ +#+PROPERTY: header-args:shell :noweb yes * My dotfiles The config files are organized in [[https://www.gnu.org/software/emacs/][emacs]] [[https://orgmode.org/][org mode]] files. They are tangled and symlinked to the appropriate directories. @@ -60,6 +61,12 @@ configuration files and it also needs to be loaded & setup. For details see [[file:emacs-init.org::org-crypt-tangle-setup][emacs-init.org]]. #+begin_src shell :shebang "#!/bin/bash" :tangle tangle/tangle.sh +files=$(ls *.org *.org.gpg) + +<<checkhashes>> + +echo "Tangling files:$tanglefiles ..." + emacs --batch --eval="\ (progn (require 'org) (require 'org-crypt) @@ -74,7 +81,58 @@ emacs --batch --eval="\ (org-encrypt-entries) (save-without-hook))) (let ((org-confirm-babel-evaluate nil)) - (mapc 'org-babel-tangle-file (split-string \"$(ls *.org *.org.gpg)\"))))" + (mapc 'org-babel-tangle-file (split-string \"$tanglefiles\"))))" +#+end_src + +*** Saving commit hashes to reduce tangling +To reduce the amount of unnecessary tangling, save the commit hash +upon tangling and check it before tangling again. + +Get the commit hash of a file using ~git log~. + +#+NAME: gethash +#+begin_src shell +function gethash { + git log -n 1 --pretty=format:%H -- $1 +} +#+end_src + +We can save all commit hashes by looping over all files. + +#+NAME: savehashes +#+begin_src shell +HASHDIR="hash" +<<gethash>> +for file in $files +do + gethash $file > $HASHDIR/$file +done +#+end_src + +But we really want to check the saved hash against the current hash +first. If they do not match keep the file for tangling. + +#+NAME: checkhashes +#+begin_src shell +HASHDIR="hash" +tanglefiles="" +<<gethash>> + +exec 3>&2 +exec 2> /dev/null # disable stderr + +for file in $files +do + if [ $(cat $HASHDIR/$file) == $(gethash $file) ] + then + : # noop + else # if strings not equal or ~cat~ fails + tanglefiles="$tanglefiles $file" + gethash $file > $HASHDIR/$file # save hash + fi +done + +exec 2>&3 #reset stderr #+end_src ** Creating symlinks |