From 6b26b5c47fa3c382cd728f9ccb7c05f423f2f567 Mon Sep 17 00:00:00 2001 From: Madeleine Sydney Date: Tue, 6 May 2025 11:35:47 -0600 Subject: [PATCH] feat(git): Use Ediff --- modules/home/users/crumb/git.nix | 13 +++++++ scripts/ediff/ediff | 59 ++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 scripts/ediff/ediff diff --git a/modules/home/users/crumb/git.nix b/modules/home/users/crumb/git.nix index 76da003..93e396f 100644 --- a/modules/home/users/crumb/git.nix +++ b/modules/home/users/crumb/git.nix @@ -21,6 +21,19 @@ in { enable = true; userEmail = my-email; userName = my-name; + extraConfig = { + diff = { + tool = "ediff"; + guitool = "ediff"; + }; + difftool.ediff.cmd = + "${../../../../scripts/ediff/ediff} $LOCAL $REMOTE $MERGED"; + merge.tool = "ediff"; + mergetool.ediff = { + cmd = "${../../../../scripts/ediff/ediff} $LOCAL $REMOTE $MERGED"; + trustExitCode = true; + }; + }; }; home.shellAliases = { diff --git a/scripts/ediff/ediff b/scripts/ediff/ediff new file mode 100644 index 0000000..ff89984 --- /dev/null +++ b/scripts/ediff/ediff @@ -0,0 +1,59 @@ +#!/usr/bin/env bash + +# Modified from https://github.com/paulotome/emacstool + +# test args +if [ ! ${#} -ge 2 ]; then + echo 1>&2 "Usage: ${0} LOCAL REMOTE [MERGED BASE]" + echo 1>&2 " (LOCAL, REMOTE, MERGED, BASE can be provided by \`git mergetool'.)" + exit 1 +fi + +# tools +emacsclient=$(which emacsclient) +basename=$(which basename) +cp=$(which cp) +mktemp=$(which mktemp) + +# args +_LOCAL=${1} +_REMOTE=${2} +if [ "${3}" ] ; then + _MERGED=${3} +else + _MERGED=${_REMOTE} +fi +if [ "${4}" ] && [ -r "${4}" ] ; then + _BASE=${4} + _EDIFF=ediff-merge-files-with-ancestor + _EVAL="${_EDIFF} \"${_LOCAL}\" \"${_REMOTE}\" \"${_BASE}\" nil \"${_MERGED}\"" +elif [ "${_REMOTE}" = "${_MERGED}" ] ; then + _EDIFF=ediff + _EVAL="${_EDIFF} \"${_LOCAL}\" \"${_REMOTE}\"" +else + _EDIFF=ediff-merge-files + _EVAL="${_EDIFF} \"${_LOCAL}\" \"${_REMOTE}\" nil \"${_MERGED}\"" +fi + +# console vs. X +if [ "${TERM}" = "linux" ]; then + unset DISPLAY + emacsclientOPTS="-t" +else + emacsclientOPTS="-c" +fi + +# run emacsclient +${emacsclient} ${emacsclientOPTS} -a "" -e "(${_EVAL})" 2>&1 + +# check modified file +if [ ! "$(grep -Ec '^(<<<<<<<|=======|>>>>>>>|####### Ancestor)' "${_MERGED}")" = 0 ]; then + _MERGEDSAVE=$(${mktemp} --tmpdir "$(${basename} "${_MERGED}")".XXXXXXXXXX) + ${cp} "${_MERGED}" "${_MERGEDSAVE}" + echo 1>&2 "Oops! Conflict markers detected in $_MERGED." + echo 1>&2 "Saved your changes to ${_MERGEDSAVE}" + echo 1>&2 "Exiting with code 1." + exit 1 +fi + +exit 0