Download raw body.
got patch and got diff patches
Stefan Sperling <stsp@stsp.name> wrote:
> I have another suggestion:
>
> > [...]
>
> The test doesn't check whether 3-way merge or search/replace was used.
> Which kind of defeats the point, doesn't it?
>
> 'got patch' 3-way merge has the same possible outcomes as 'got cherrypick',
> Except merge is only used if the file already exists on disk, and add/delete
> is done elsewhere, so we are left with only the following two status codes
> as they appear in 'got cherrypick':
>
> G file was merged
> C file was merged and conflicts occurred during merge
>
> I would propose to make 'got patch' use status code as follows:
>
> M file was modified
> G file was merged using a merge-base found in repository
> C file was merged and conflicts occurred during merge
> D file was deleted
> A file was added
> # failed to patch the file
>
> And then our tests could check for M or G/C to see which algorithm
> was used to apply changes to a file. What do you think?
it's awesome.
The thought that we weren't correctly communicating to the user wheter
we did the 3-way merge or the dumb patch occurred to me, but I wasn't
sure how to deal with it. I thought of doing something with a callback,
but i didn't really liked the idea.
Instead, using G instead of M as status code is just the only correct
thing to do. It's already used in other places and doesn't add noise to
the output. It's so obvious that I'm ashamed that I haven't thought
about it before.
This also reminded me that I'm not documenting the 'C' status in the
manual!
Here's a diff (built on top of the previous one) that uses the G status
code when merging, improves the tests to explicitly look for it and
updates the manpage blatantly copying your suggestion :)
Thanks a lot!
diff 814afc913552a78a1df6d849a3f916e90ce4ad65 /home/op/w/got
blob - 9d65d8aa6b3211dfb9e231199f0bc3e522f4dfa8
file + got/got.1
--- got/got.1
+++ got/got.1
@@ -1333,6 +1333,8 @@ contains multiple patches, then attempt to apply each
Show the status of each affected file, using the following status codes:
.Bl -column XYZ description
.It M Ta file was modified
+.It G Ta file was merged using a merge-base found in the repository
+.It C Ta file was merged and conflicts occurred during merge
.It D Ta file was deleted
.It A Ta file was added
.It # Ta failed to patch the file
blob - 1fc82c6604c60d1e3961f7d6670b26b781db97cc
file + lib/patch.c
--- lib/patch.c
+++ lib/patch.c
@@ -777,6 +777,8 @@ apply_patch(int *overlapcnt, struct got_worktree *work
unlink(newpath);
} else if (*overlapcnt != 0)
err = report_progress(pa, old, new, GOT_STATUS_CONFLICT, NULL);
+ else if (do_merge)
+ err = report_progress(pa, old, new, GOT_STATUS_MERGE, NULL);
else
err = report_progress(pa, old, new, GOT_STATUS_MODIFY, NULL);
blob - 5d79b58c66cb3e7160cfdb8ce13e13901219e70e
file + regress/cmdline/patch.sh
--- regress/cmdline/patch.sh
+++ regress/cmdline/patch.sh
@@ -1482,13 +1482,22 @@ test_patch_merge_simple() {
fi
(cd $testroot/wt && got patch $testroot/old.diff) \
- 2>&1 > /dev/null
+ > $testroot/stdout
ret=$?
if [ $ret -ne 0 ]; then
test_done $testroot $ret
return 1
fi
+ echo 'G numbers' > $testroot/stdout.expected
+ cmp -s $testroot/stdout $testroot/stdout.expected
+ ret=$?
+ if [ $ret -ne 0 ]; then
+ diff -u $testroot/stdout $testroot/stdout.expected
+ test_done $testroot $ret
+ return 1
+ fi
+
jot 10 | sed -e s/4/four/ -e s/6/six/ > $testroot/wt/numbers.expected
cmp -s $testroot/wt/numbers $testroot/wt/numbers.expected
ret=$?
@@ -1539,7 +1548,7 @@ test_patch_merge_conflict() {
fi
(cd $testroot/wt && got patch $testroot/old.diff) \
- >/dev/null 2>&1
+ > $testroot/stdout 2>/dev/null
ret=$?
if [ $ret -eq 0 ]; then
echo "got patch merged a diff that should conflict" >&2
@@ -1547,6 +1556,15 @@ test_patch_merge_conflict() {
return 1
fi
+ echo 'C numbers' > $testroot/stdout.expected
+ cmp -s $testroot/stdout $testroot/stdout.expected
+ ret=$?
+ if [ $ret -ne 0 ]; then
+ diff -u $testroot/stdout $testroot/stdout.expected
+ test_done $testroot $ret
+ return 1
+ fi
+
# XXX: prefixing every line with a tab otherwise got thinks
# the file has conflicts in it.
cat <<-EOF > $testroot/wt/numbers.expected
got patch and got diff patches