commit 1678610c6d5112a48cd47219c8bd4ef423d31e63 from: Stefan Sperling via: Thomas Adam date: Sat Apr 22 18:10:25 2023 UTC allow no-op merge commits to be created Requested by James Cook commit - 538aebb56b973dea6dee4dbde0ecfc4043bd6738 commit + 1678610c6d5112a48cd47219c8bd4ef423d31e63 blob - c924075eacdb3d7e5ebe3fc11b3c59262e7e120f blob + 923e489c4fb37899470241b32f5235c9b6652c87 --- got/got.1 +++ got/got.1 @@ -2851,10 +2851,6 @@ The work tree may be modified as desired and the merge once the changes present in the work tree are considered complete. Alternatively, the merge operation may be aborted which will leave the work tree's current branch unmodified. -.Pp -If a merge conflict is resolved in a way which renders all merged -changes into no-op changes, the merge operation cannot continue -and must be aborted. .Pp .Cm got merge will refuse to run if certain preconditions are not met. blob - a8d2babaa86a60ad22efe11a8b27f7976cea11e9 blob + e02fba3a7dd77de4b2b04a5b483529660338f5f6 --- lib/worktree.c +++ lib/worktree.c @@ -8385,13 +8385,7 @@ got_worktree_merge_commit(struct got_object_id **new_c err = worktree_status(worktree, "", fileindex, repo, collect_commitables, &cc_arg, NULL, NULL, 1, 0); if (err) - goto done; - - if (TAILQ_EMPTY(&commitable_paths)) { - err = got_error_fmt(GOT_ERR_COMMIT_NO_CHANGES, - "merge of %s cannot proceed", branch_name); goto done; - } TAILQ_FOREACH(pe, &commitable_paths, entry) { struct got_commitable *ct = pe->data; blob - 9093dd5b9fb524b14d2d17d4fe754da0ec8ef9f4 blob + 11ffa61f4a12efd380087a03aa5b186b9a745ae2 --- regress/cmdline/merge.sh +++ regress/cmdline/merge.sh @@ -1045,7 +1045,7 @@ test_merge_no_op() { (cd $testroot/repo && git checkout -q -b newbranch) echo "modified alpha on branch" > $testroot/repo/alpha git_commit $testroot/repo -m "committing to alpha on newbranch" - local branch_commitk=`git_show_branch_head $testroot/repo newbranch` + local branch_commit=`git_show_branch_head $testroot/repo newbranch` got checkout -b master $testroot/repo $testroot/wt > /dev/null ret=$? @@ -1122,19 +1122,30 @@ test_merge_no_op() { (cd $testroot/wt && got merge -c > $testroot/stdout \ 2> $testroot/stderr) ret=$? - if [ $ret -eq 0 ]; then - echo "got merge succeeded unexpectedly" >&2 + if [ $ret -ne 0 ]; then + echo "got merge failed unexpectedly" >&2 test_done "$testroot" "$ret" return 1 fi - echo -n "got: merge of refs/heads/newbranch cannot proceed: " \ - > $testroot/stderr.expected - echo "no changes to commit" >> $testroot/stderr.expected + echo -n '' > $testroot/stderr.expected cmp -s $testroot/stderr.expected $testroot/stderr ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stderr.expected $testroot/stderr + test_done "$testroot" "$ret" + return 1 + fi + + local merge_commit=`git_show_head $testroot/repo` + echo -n "Merged refs/heads/newbranch into refs/heads/master: " \ + > $testroot/stdout.expected + echo $merge_commit >> $testroot/stdout.expected + + cmp -s $testroot/stdout.expected $testroot/stdout + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/stdout.expected $testroot/stdout test_done "$testroot" "$ret" return 1 fi @@ -1146,7 +1157,20 @@ test_merge_no_op() { ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 fi + + # We should have created a merge commit with two parents. + got log -r $testroot/repo -l1 -c $merge_commit | grep ^parent \ + > $testroot/stdout + echo "parent 1: $master_commit" > $testroot/stdout.expected + echo "parent 2: $branch_commit" >> $testroot/stdout.expected + cmp -s $testroot/stdout.expected $testroot/stdout + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/stdout.expected $testroot/stdout + fi test_done "$testroot" "$ret" }