-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathgit-mch
More file actions
executable file
·111 lines (99 loc) · 2.64 KB
/
Copy pathgit-mch
File metadata and controls
executable file
·111 lines (99 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/bin/bash
set -e
GIT_COMMON_DIR=$(git rev-parse --git-common-dir)
GIT_WORKTREE_DIR=$(git rev-parse --git-dir)
HELPERS_DIR="$GIT_COMMON_DIR/merge-conflict-helpers"
check_conflict_state() {
if [ ! -f "$GIT_WORKTREE_DIR/MERGE_HEAD" ] && [ ! -f "$GIT_WORKTREE_DIR/REBASE_HEAD" ]; then
echo "Not in a merge or rebase conflict state."
exit 1
fi
}
start_helper() {
local name="$1"
if [ -z "$name" ]; then
echo "Usage: $0 start <name>"
exit 1
fi
check_conflict_state
local orig_dir="$HELPERS_DIR/$name/orig"
# Get conflicted files
git status --porcelain | grep '^UU\|^AA\|^DD' | awk '{print $2}' | while read -r file; do
# Copy preserving directory
mkdir -p "$orig_dir/$(dirname "$file")"
cp "$file" "$orig_dir/$file"
done
echo "Started conflict helper for $name"
}
save_helper() {
local name="$1"
if [ -z "$name" ]; then
echo "Usage: $0 save <name>"
exit 1
fi
local orig_dir="$HELPERS_DIR/$name/orig"
mkdir -p "$orig_dir"
local diff_file="$HELPERS_DIR/$name/diff.patch"
if [ ! -d "$orig_dir" ]; then
echo "No orig directory for $name"
exit 1
fi
# Clear diff file
> "$diff_file"
find "$orig_dir" -type f | while read -r orig_file; do
local rel_file="${orig_file#$orig_dir/}"
if [ -f "$rel_file" ]; then
# Create diff
diff -u "$orig_file" "$rel_file" | removal-of-hashes-from-diff-3-hunks >> "$diff_file" || true
fi
done
echo "Saved diff for $name"
}
removal-of-hashes-from-diff-3-hunks() {
sed -E 's#^-[|][|][|][|][|][|][|] [a-f0-9]+$#-|||||||#g'
}
apply_helper() {
local name="$1"
if [ -z "$name" ]; then
echo "Usage: $0 apply <name>"
exit 1
fi
local diff_file="$HELPERS_DIR/$name/diff.patch"
if [ ! -f "$diff_file" ]; then
echo "No diff file for $name"
exit 1
fi
echo "Applying $diff_file"
cat "$diff_file" | removal-of-hashes-from-diff-3-hunks | patch -p0
echo "Applied diff for $name"
}
list_helper() {
local i
for i in $HELPERS_DIR/*/diff.patch; do
date=$(stat "$i" | grep Modify | cut -c9-18)
i=${i#"$HELPERS_DIR"/}
i=${i%/diff.patch}
echo "${date} ${i}"
done
}
main() {
case "$1" in
start)
start_helper "$2"
;;
save)
save_helper "$2"
;;
apply)
apply_helper "$2"
;;
list)
list_helper "$2"
;;
*)
echo "Usage: $0 {start|save|apply} <name>"
exit 1
;;
esac
}
main "$@"