@@ -3,16 +3,99 @@ print_verbose "**** START: functions-conflicts.sh"
33conflicts ()
44{
55 if [ " $help " ]; then
6- echo " ${bold} smud conflict(s)${normal} : Scan and list conflicts in yaml-files."
7- return
6+ echo " ${bold} smud conflict(s)${normal} [options]: List conflicts in yaml-files or resolve conflicts in conflictiong files."
7+ echo " "
8+ echo " Options:"
9+ echo " <no-options>: Scan and list conflicts in yaml-files."
10+ echo " --merge-ours=, --ours:"
11+ echo " Merge conflicts with our versions"
12+ echo " --merge-theirs=, --theirs:"
13+ echo " Merge conflicts with their versions"
14+ echo " --merge-union=, --union:"
15+ echo " Merge conflicts with union versions"
16+
17+ fi
18+
19+ exit_if_is_not_a_git_repository
20+
21+ if [ " $merge_ours " ]; then
22+ if [ ! " $conflicts_files " ]; then
23+ conflicts_files=$( git-list-conflict ' files' )
24+ fi
25+ printf " ${white} Resolve conflicts based on ours version.\n"
26+ for file in $conflicts_files ; do
27+ git-resolve-conflict " --ours" " $file "
28+ done
29+ elif [ " $merge_theirs " ]; then
30+ if [ ! " $conflicts_files " ]; then
31+ conflicts_files=$( git-list-conflict ' files' )
32+ fi
33+ printf " ${white} Resolve conflicts based on their version.\n"
34+ for file in $conflicts_files ; do
35+ git-resolve-conflict " --theirs" " $file "
36+ done
37+ elif [ " $merge_union " ]; then
38+ if [ ! " $conflicts_files " ]; then
39+ conflicts_files=$( git-list-conflict ' files' )
40+ fi
41+ printf " ${white} Resolve conflicts based on union version.\n"
42+ for file in $conflicts_files ; do
43+ git-resolve-conflict " --union" " $file "
44+ done
45+ else
46+ git-list-conflict
847 fi
9- if [ ! " $is_repo " ]; then
10- printf " ${red} '$( pwd) ' is not a git repository! ${normal} \n"
48+
49+ }
50+ git-list-conflict () {
51+ if [ " $1 " == " files" ]; then
52+ sh -c " find $find_files_filter -name '*.yaml' -exec grep -H -e '>>>' -e '<<<' {} \;" | awk --field-separator=: ' { print $1}' | uniq
1153 return
1254 fi
55+
1356 printf " ${white} Scan and list conflicts in yaml-files.\n"
1457
1558 sh -c " find $find_files_filter -name '*.yaml' -exec grep -H -e '>>>' -e '<<<' {} \;"
1659}
1760
61+ git-resolve-conflict () {
62+ STRATEGY=" $1 "
63+ FILE_PATH=" $2 "
64+ if [ -z " $FILE_PATH " ] || [ -z " $STRATEGY " ]; then
65+ echo " Usage: smud conflicts <strategy> <file>"
66+ echo " "
67+ echo " Example: git-resolve-conflict --ours package.json"
68+ echo " Example: git-resolve-conflict --union package.json"
69+ echo " Example: git-resolve-conflict --theirs package.json"
70+ return
71+ fi
72+
73+ if [ ! -f " $FILE_PATH " ]; then
74+ echo " $FILE_PATH does not exist; aborting."
75+ return
76+ fi
77+
78+ # remove leading ./ if present, to match the output of git diff --name-only
79+ # (otherwise if user input is './filename.txt' we would not match 'filename.txt')
80+ FILE_PATH_FOR_GREP=${FILE_PATH# ./ }
81+ # grep -Fxq: match string (F), exact (x), quiet (exit with code 0/1) (q)
82+ if ! git diff --name-only --diff-filter=U | grep -Fxq " $FILE_PATH_FOR_GREP " ; then
83+ echo " $FILE_PATH is not in conflicted state; aborting."
84+ return
85+ fi
86+
87+ git show :1:" $FILE_PATH " > ./tmp.common
88+ git show :2:" $FILE_PATH " > ./tmp.ours
89+ git show :3:" $FILE_PATH " > ./tmp.theirs
90+
91+ git merge-file " $STRATEGY " -p ./tmp.ours ./tmp.common ./tmp.theirs > " $FILE_PATH "
92+ git add " $FILE_PATH "
93+
94+ rm ./tmp.common
95+ rm ./tmp.ours
96+ rm ./tmp.theirs
97+ }
98+
99+
100+
18101print_verbose " **** END: functions-conflicts.sh"
0 commit comments