Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add resolve-adjacent-conflicts script #220

Merged
merged 2 commits into from
Oct 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions src/scripts/merge_tools/resolve-adjacent-conflicts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#!/bin/bash
# bash, not POSIX sh, because of "readarray".

# This script edits files in place to resolve conflict markers due to edits on
# adjacent lines. (This is like the behavior of SVN and darcs, but different
# than the default behavior of Git, Mercurial, and Bazaar.) This script leaves
# other conflict markers untouched.
# Usage:
# resolve-adjacent-conflicts [file ...]
#
# The script works on all files given on the command line.
# If none are given, the script works on all files in or under the current directory.
#
# The status code is 0 (success) if all conflicts are resolved.
# The status code is 1 (failure) if any conflict remains.
#
# This is not a git mergetool. A git mergetool is given the base, parent 1, and
# parent 2 files, all without conflict markers.
# However, this can be run after a git mergetool that leaves conflict markers
# in files, as the default git mergetool does.

# Comparison to other tools
#
# git-hires-merge does more than this script: it resolves non-overlapping
# changes at the character level rather than just the line level. Also,
# git-hires-merge is a mergetool whereas this script is not.
#
# kdiff3 can resolve some conflicts that are on adjacent lines (but not as many
# as this script does). kdiff3 has no way of outputting a file containing
# conflict markers. Invoked like this, it still goes into a GUI if there are
# any merge conflicts that a human must resolve:
# kdiff3 --auto --cs "ShowInfoDialogs=0" base.txt parent1.txt parent2.txt -o merged.txt
# Also, the `--auto` option is ignored for folder comparison.

DEBUG=1

if [ "$#" -eq 0 ] ; then
readarray -t files < <(grep -l -r '^<<<<<<< HEAD' .)
else
files=("$@")
fi

SCRIPTDIR="$(cd "$(dirname "$0")" && pwd -P)"

status=0

for file in "${files[@]}" ; do
if [ "$DEBUG" ] ; then
echo "before resolve-conflicts.py: $(sha256sum "$file")"
cat "$file"
fi
if ! "${SCRIPTDIR}"/resolve-conflicts.py --adjacent_lines "$file" ; then
status=1
fi
if [ "$DEBUG" ] ; then
echo "after resolve-conflicts.py: (status=$status: $(sha256sum "$file")"
cat "$file"
fi
done

exit $status
2 changes: 1 addition & 1 deletion src/scripts/merge_tools/resolve-conflicts.py
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ def is_subsequence(s1: Sequence[T], s2: Sequence[T]) -> bool:

def debug_print(*args):
"""If debugging is enabled, pass the arguments to `print`."""
if True:
if debug:
print(*args)


Expand Down
Loading