feat(git): Use Ediff

This commit is contained in:
Madeleine Sydney
2025-05-06 11:35:47 -06:00
parent f173ab4c0b
commit 6b26b5c47f
2 changed files with 72 additions and 0 deletions

View File

@@ -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 = {

59
scripts/ediff/ediff Normal file
View File

@@ -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