diff options
author | fpi | 2020-07-27 10:11:25 +0200 |
---|---|---|
committer | fpi | 2020-07-27 10:15:59 +0200 |
commit | 71194e54cd50a20d6d1dbe7e883e5a07ec6150e2 (patch) | |
tree | 9335199e066c8da6b70c27ee8a9dce5e9f1ff606 | |
parent | Make tangling of readme silent (diff) |
Add experimental way to reduce amount of tangling
Works by saving the git commit hash upon tangling.
Currently this does not record if tangling fails for some reason.
Diffstat (limited to '')
-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 |