Download raw body.
stop got diff from lying in mixed-commit work trees
Mark Jamsek <mark@jamsek.com> wrote:
> stsp pointed out on IRC that got diff can lie in mixed-commit work trees
> as only the work tree base commit is emitted at the top of the diff; as
> such, users could reasonably infer that the same base commit id applies
> to all files in the diff. This is not true in mixed-commit work trees.
>
> After discussing this with op and stsp, we decided to emit each file's
> base commit in its diff header, rather than just emit the work tree's
> base commit once. This requires some regress churn but not nearly as
> much as anticipated. The bonus is got patch already does the right
> thing by parsing the new commit header so it requires no changes :)
>
> Apart from the mechanical relocation and addition of the commit header
> in the changes to the test harness, only one patch test needed changing
> as we now show the file's true base commit in conflict markers. I've
> also added a new test to got diff regress to cover this change.
>
> This is what mixed-commit work tree diffs look like (observe the new
> commit - $basecommit line above each blob - line in all file headers):
>
> [[
> diff /tmp/got-test-diff_mixed_worktree-xQKZURYe9K/wt
> path + /tmp/got-test-diff_mixed_worktree-xQKZURYe9K/wt
> commit - 400880623c67bcd21fc38e5ce5a39382f7249634
> blob - 459809db67d164c738cac58282b2e3426b6aaa33
> file + alpha
> --- alpha
> +++ alpha
> @@ -1 +1 @@
> -'alpha
> +alpha
> commit - b1efe2d25322d0c819fe57ec7b244feb4fd90569
> blob - 65b2df87f7df3aeedef04be96703e55ac19c2cfb
> file + beta
> --- beta
> +++ beta
> @@ -1 +1 @@
> -beta
> +'beta
> commit - 852030ab7b6d55b358767cd71b4be3cdb6ad6154
> blob - /dev/null
> file + new (mode 644)
> --- /dev/null
> +++ new
> @@ -0,0 +1 @@
> +new
> ]]
Diff rebased on top of HEAD :)
If we're going ahead with this change, I'd like it to land before the
gotwebd test harness to save some churn as this will likely change the
diff output there too.
commit 94f61d680a7a5cc30356f80dcdca6c4c657cfdd9 (diffheader)
from: Mark Jamsek <mark@jamsek.dev>
date: Sun Nov 24 05:15:47 2024 UTC
discern mixed-commit worktree diffs with commit header
Instead of emitting the work tree's base commit in the diff's topmost
header, which is misleading in mixed-commit work trees, emit each file's
base commit in its diff header. Suggested by stsp and discussed with op
and stsp on IRC.
M got/got.c | 32+ 4-
M regress/cmdline/diff.sh | 137+ 15-
M regress/cmdline/patch.sh | 3+ 1-
M regress/cmdline/revert.sh | 3+ 3-
M regress/cmdline/stage.sh | 24+ 11-
M regress/cmdline/unstage.sh | 10+ 9-
M regress/cmdline/update.sh | 1+ 1-
7 files changed, 210 insertions(+), 44 deletions(-)
commit - b68e64b1d55c9b06ac807e265083267f655ad65c
commit + 94f61d680a7a5cc30356f80dcdca6c4c657cfdd9
blob - f890b946e6565aa7acf7271c37921844fa902230
blob + 0f45835af753a3a6807444c2dc3b9b7127d0dda6
--- got/got.c
+++ got/got.c
@@ -5061,6 +5061,34 @@ done:
}
static const struct got_error *
+emit_base_commit_header(FILE *f, struct got_object_id *commit_id,
+ struct got_worktree *worktree)
+{
+ const struct got_error *err;
+ struct got_object_id *base_commit_id;
+ char *base_commit_idstr;
+
+ if (worktree == NULL) /* shouldn't happen */
+ return got_error(GOT_ERR_NOT_WORKTREE);
+
+ base_commit_id = got_worktree_get_base_commit_id(worktree);
+
+ if (commit_id != NULL) {
+ if (got_object_id_cmp(commit_id, base_commit_id) != 0)
+ base_commit_id = commit_id;
+ }
+
+ err = got_object_id_str(&base_commit_idstr, base_commit_id);
+ if (err != NULL)
+ return err;
+
+ if (fprintf(f, "commit - %s\n", base_commit_idstr) < 0)
+ err = got_error_from_errno("fprintf");
+ free(base_commit_idstr);
+ return err;
+}
+
+static const struct got_error *
print_diff(void *arg, unsigned char status, unsigned char staged_status,
const char *path, struct got_object_id *blob_id,
struct got_object_id *staged_blob_id, struct got_object_id *commit_id,
@@ -5109,10 +5137,6 @@ print_diff(void *arg, unsigned char status, unsigned c
err = got_error_from_errno("fprintf");
goto done;
}
- if (fprintf(a->outfile, "commit - %s\n", a->id_str) < 0) {
- err = got_error_from_errno("fprintf");
- goto done;
- }
if (fprintf(a->outfile, "path + %s%s\n",
got_worktree_get_root_path(a->worktree),
a->diff_staged ? " (staged changes)" : "") < 0) {
@@ -5122,6 +5146,10 @@ print_diff(void *arg, unsigned char status, unsigned c
a->header_shown = 1;
}
+ err = emit_base_commit_header(a->outfile, commit_id, a->worktree);
+ if (err != NULL)
+ goto done;
+
if (a->diff_staged) {
const char *label1 = NULL, *label2 = NULL;
switch (staged_status) {
blob - 79d34d5be8de2f8a77dd949ec12828120cf67461
blob + 1c2391cef1211e8f745596a22c4944873f497779
--- regress/cmdline/diff.sh
+++ regress/cmdline/diff.sh
@@ -34,8 +34,8 @@ test_diff_basic() {
(cd $testroot/wt && got add new >/dev/null)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_rev" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'alpha$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -45,6 +45,7 @@ test_diff_basic() {
echo '@@ -1 +1 @@' >> $testroot/stdout.expected
echo '-alpha' >> $testroot/stdout.expected
echo '+modified alpha' >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -53,6 +54,7 @@ test_diff_basic() {
echo '+++ /dev/null' >> $testroot/stdout.expected
echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
echo '-beta' >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + new (mode 644)' >> $testroot/stdout.expected
echo '--- /dev/null' >> $testroot/stdout.expected
@@ -119,8 +121,8 @@ test_diff_basic() {
# diff several paths in a work tree
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_rev" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'alpha$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -130,6 +132,7 @@ test_diff_basic() {
echo '@@ -1 +1 @@' >> $testroot/stdout.expected
echo '-alpha' >> $testroot/stdout.expected
echo '+modified alpha' >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -138,6 +141,7 @@ test_diff_basic() {
echo '+++ /dev/null' >> $testroot/stdout.expected
echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
echo '-beta' >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i epsilon | grep 'zeta$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -147,6 +151,7 @@ test_diff_basic() {
echo '@@ -1 +1 @@' >> $testroot/stdout.expected
echo '-zeta' >> $testroot/stdout.expected
echo '+modified zeta' >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + new (mode 644)' >> $testroot/stdout.expected
echo '--- /dev/null' >> $testroot/stdout.expected
@@ -266,14 +271,15 @@ test_diff_basic() {
return 1
fi
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_rev" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + master (mode 644)' >> $testroot/stdout.expected
echo '--- /dev/null' >> $testroot/stdout.expected
echo '+++ master' >> $testroot/stdout.expected
echo '@@ -0,0 +1 @@' >> $testroot/stdout.expected
echo '+master' >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + new (mode 644)' >> $testroot/stdout.expected
echo '--- /dev/null' >> $testroot/stdout.expected
@@ -308,8 +314,8 @@ test_diff_basic() {
# a single argument which can be resolved to a path is not ambiguous
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_rev" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + new (mode 644)' >> $testroot/stdout.expected
echo '--- /dev/null' >> $testroot/stdout.expected
@@ -362,8 +368,8 @@ test_diff_basic() {
fi
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_rev" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + new (mode 644)' >> $testroot/stdout.expected
echo '--- /dev/null' >> $testroot/stdout.expected
@@ -475,8 +481,8 @@ test_diff_shows_conflict() {
fi
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_rev" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'numbers$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -665,8 +671,8 @@ test_diff_ignore_whitespace() {
(cd $testroot/wt && got diff -w > $testroot/stdout)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id0" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $commit_id0" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -c $commit_id0 -i | grep 'alpha$' | \
cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -744,8 +750,8 @@ test_diff_symlinks_in_work_tree() {
(cd $testroot/wt && got diff > $testroot/stdout)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id1" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $commit_id1" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -c $commit_id1 -i | \
grep 'alpha.link@ -> alpha$' | \
@@ -758,6 +764,7 @@ test_diff_symlinks_in_work_tree() {
echo '\ No newline at end of file' >> $testroot/stdout.expected
echo '+beta' >> $testroot/stdout.expected
echo '\ No newline at end of file' >> $testroot/stdout.expected
+ echo "commit - $commit_id1" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -c $commit_id1 -i | \
grep 'dotgotfoo.link@ -> .got/foo$' | \
@@ -770,6 +777,7 @@ test_diff_symlinks_in_work_tree() {
echo '\ No newline at end of file' >> $testroot/stdout.expected
echo '+.got/bar' >> $testroot/stdout.expected
echo '\ No newline at end of file' >> $testroot/stdout.expected
+ echo "commit - $commit_id1" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -c $commit_id1 -i epsilon | \
grep 'beta.link@ -> ../beta$' | \
@@ -782,6 +790,7 @@ test_diff_symlinks_in_work_tree() {
echo '\ No newline at end of file' >> $testroot/stdout.expected
echo '+../gamma/delta' >> $testroot/stdout.expected
echo '\ No newline at end of file' >> $testroot/stdout.expected
+ echo "commit - $commit_id1" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -c $commit_id1 -i | \
grep 'epsilon.link@ -> epsilon$' | \
@@ -794,6 +803,7 @@ test_diff_symlinks_in_work_tree() {
echo '\ No newline at end of file' >> $testroot/stdout.expected
echo '+gamma' >> $testroot/stdout.expected
echo '\ No newline at end of file' >> $testroot/stdout.expected
+ echo "commit - $commit_id1" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -c $commit_id1 -i | \
grep 'nonexistent.link@ -> nonexistent$' | \
@@ -804,6 +814,7 @@ test_diff_symlinks_in_work_tree() {
echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
echo '-nonexistent' >> $testroot/stdout.expected
echo '\ No newline at end of file' >> $testroot/stdout.expected
+ echo "commit - $commit_id1" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + zeta.link (mode 120000)' >> $testroot/stdout.expected
echo '--- /dev/null' >> $testroot/stdout.expected
@@ -954,8 +965,8 @@ test_diff_binary_files() {
(cd $testroot/wt && got add foo >/dev/null)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_rev" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + foo (mode 644)' >> $testroot/stdout.expected
echo "Binary files /dev/null and foo differ" \
@@ -971,8 +982,8 @@ test_diff_binary_files() {
fi
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_rev" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + foo (mode 644)' >> $testroot/stdout.expected
echo '--- /dev/null' >> $testroot/stdout.expected
@@ -996,8 +1007,8 @@ test_diff_binary_files() {
printf '\377\200\0\0\377\200\0\0' > $testroot/wt/foo
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_rev" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'foo$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -1364,8 +1375,8 @@ test_diff_worktree_newfile_xbit() {
local commit_id=`git_show_head $testroot/repo`
cat <<EOF > $testroot/stdout.expected
diff $testroot/wt
-commit - $commit_id
path + $testroot/wt
+commit - $commit_id
blob - /dev/null
file + xfile (mode 755)
--- /dev/null
@@ -1604,8 +1615,8 @@ diffstat $testroot/wt
EOF
echo "diff $testroot/wt" >> $testroot/stdout.expected
- echo "commit - $head_rev" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'alpha$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -1615,6 +1626,7 @@ EOF
echo '@@ -1 +1 @@' >> $testroot/stdout.expected
echo '-alpha' >> $testroot/stdout.expected
echo '+modified alpha' >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -1623,6 +1635,7 @@ EOF
echo '+++ /dev/null' >> $testroot/stdout.expected
echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
echo '-beta' >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + new (mode 644)' >> $testroot/stdout.expected
echo '--- /dev/null' >> $testroot/stdout.expected
@@ -1654,8 +1667,8 @@ EOF
# specify paths to diffstat
echo "diff $testroot/wt" >> $testroot/stdout.expected
- echo "commit - $head_rev" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'alpha$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -1665,6 +1678,7 @@ EOF
echo '@@ -1 +1 @@' >> $testroot/stdout.expected
echo '-alpha' >> $testroot/stdout.expected
echo '+modified alpha' >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -1673,6 +1687,7 @@ EOF
echo '+++ /dev/null' >> $testroot/stdout.expected
echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
echo '-beta' >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i epsilon | grep 'zeta$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -1682,6 +1697,7 @@ EOF
echo '@@ -1 +1 @@' >> $testroot/stdout.expected
echo '-zeta' >> $testroot/stdout.expected
echo '+modified zeta' >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + new (mode 644)' >> $testroot/stdout.expected
echo '--- /dev/null' >> $testroot/stdout.expected
@@ -1736,14 +1752,15 @@ diffstat $testroot/wt
EOF
echo "diff $testroot/wt" >> $testroot/stdout.expected
- echo "commit - $head_rev" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + master (mode 644)' >> $testroot/stdout.expected
echo '--- /dev/null' >> $testroot/stdout.expected
echo '+++ master' >> $testroot/stdout.expected
echo '@@ -0,0 +1 @@' >> $testroot/stdout.expected
echo '+master' >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + new (mode 644)' >> $testroot/stdout.expected
echo '--- /dev/null' >> $testroot/stdout.expected
@@ -2267,6 +2284,110 @@ test_diff_commit_keywords() {
test_done "$testroot" "$ret"
}
+test_diff_mixed_worktree() {
+ local testroot=$(test_init diff_mixed_worktree)
+ local baseid_beta=$(git_show_head $testroot/repo)
+
+ got checkout $testroot/repo $testroot/wt > /dev/null
+ ret=$?
+ if [ $ret -ne 0 ]; then
+ test_done "$testroot" "$ret"
+ return 1
+ fi
+
+ echo "'alpha" > $testroot/wt/alpha
+ (cd $testroot/wt && got commit -m "'alpha" > /dev/null)
+
+ local baseid_alpha=$(git_show_head $testroot/repo)
+
+ echo "'delta" > $testroot/wt/gamma/delta
+ (cd $testroot/wt && got commit -m "'delta" > /dev/null)
+
+ local baseid_new=$(git_show_head $testroot/repo)
+ local blobid_alpha=$(get_blob_id $testroot/repo "" alpha)
+ local blobid_beta=$(get_blob_id $testroot/repo "" beta)
+
+ echo "alpha" > $testroot/wt/alpha
+ echo "'beta" > $testroot/wt/beta
+ echo "new" > $testroot/wt/new
+
+ (cd $testroot/wt && got add new > /dev/null)
+
+ cat <<-EOF >$testroot/stdout.expected
+ diff $testroot/wt
+ path + $testroot/wt
+ commit - $baseid_alpha
+ blob - $blobid_alpha
+ file + alpha
+ --- alpha
+ +++ alpha
+ @@ -1 +1 @@
+ -'alpha
+ +alpha
+ commit - $baseid_beta
+ blob - $blobid_beta
+ file + beta
+ --- beta
+ +++ beta
+ @@ -1 +1 @@
+ -beta
+ +'beta
+ commit - $baseid_new
+ blob - /dev/null
+ file + new (mode 644)
+ --- /dev/null
+ +++ new
+ @@ -0,0 +1 @@
+ +new
+ EOF
+
+ (cd $testroot/wt && got diff > $testroot/stdout)
+ 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
+
+ (cd $testroot/wt && got stage alpha beta > $testroot/stdout)
+
+ stageid_alpha=$(cd $testroot/wt && got stage -l alpha | cut -d' ' -f 1)
+ stageid_beta=$(cd $testroot/wt && got stage -l beta | cut -d' ' -f 1)
+
+ cat <<-EOF >$testroot/stdout.expected
+ diff -s $testroot/wt
+ path + $testroot/wt (staged changes)
+ commit - $baseid_alpha
+ blob - $blobid_alpha
+ blob + $stageid_alpha
+ --- alpha
+ +++ alpha
+ @@ -1 +1 @@
+ -'alpha
+ +alpha
+ commit - $baseid_beta
+ blob - $blobid_beta
+ blob + $stageid_beta
+ --- beta
+ +++ beta
+ @@ -1 +1 @@
+ -beta
+ +'beta
+ EOF
+
+ (cd $testroot/wt && got diff -s > $testroot/stdout)
+ 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
+
+ test_done "$testroot" 0
+}
+
test_parseargs "$@"
run_test test_diff_basic
run_test test_diff_shows_conflict
@@ -2287,3 +2408,4 @@ run_test test_diff_file_to_dir
run_test test_diff_dir_to_file
run_test test_diff_path_in_root_commit
run_test test_diff_commit_keywords
+run_test test_diff_mixed_worktree
blob - 884ba874302b4e95327b6a03d633122a2757442a
blob + 66b8ac0292d449f916eeb70817e844ea1710dd4b
--- regress/cmdline/patch.sh
+++ regress/cmdline/patch.sh
@@ -1577,6 +1577,8 @@ test_patch_merge_conflict() {
return 1
fi
+ local alpha_basecommit_id=`git_show_head $testroot/repo`
+
seq 10 > $testroot/wt/numbers
(cd $testroot/wt && got add numbers && got commit -m +numbers) \
> /dev/null
@@ -1634,7 +1636,7 @@ test_patch_merge_conflict() {
cat <<-EOF > $testroot/wt/alpha.expected
<<<<<<< --- alpha
ALPHA
- ||||||| commit $commit_id
+ ||||||| commit $alpha_basecommit_id
alpha
=======
a
blob - 011e20bae0544b37165ccaf2b12d702d4869e2f0
blob + cc12859f70df97800a252ad662cc906397252208
--- regress/cmdline/revert.sh
+++ regress/cmdline/revert.sh
@@ -566,8 +566,8 @@ EOF
fi
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i -c $commit_id \
| grep 'numbers$' | cut -d' ' -f 1 \
@@ -669,8 +669,8 @@ EOF
(cd $testroot/wt && got diff > $testroot/stdout)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i -c $commit_id \
| grep 'numbers$' | cut -d' ' -f 1 \
@@ -739,8 +739,8 @@ EOF
(cd $testroot/wt && got diff > $testroot/stdout)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i -c $commit_id \
| grep 'numbers$' | cut -d' ' -f 1 \
blob - 001262301f5016d81a6b4944240cc53a7e8a0144
blob + 1ad08eac94cab7500e0e8b85dc6c499f05700a6b
--- regress/cmdline/stage.sh
+++ regress/cmdline/stage.sh
@@ -934,8 +934,8 @@ test_stage_diff() {
(cd $testroot/wt && got diff > $testroot/stdout)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_commit" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l alpha) | cut -d' ' -f 1 | tr -d '\n' \
>> $testroot/stdout.expected
@@ -946,6 +946,7 @@ test_stage_diff() {
echo '@@ -1 +1 @@' >> $testroot/stdout.expected
echo '-modified file' >> $testroot/stdout.expected
echo '+modified file again' >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l foo) | cut -d' ' -f 1 | tr -d '\n' \
>> $testroot/stdout.expected
@@ -968,8 +969,8 @@ test_stage_diff() {
(cd $testroot/wt && got diff -s > $testroot/stdout)
echo "diff -s $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_commit" >> $testroot/stdout.expected
echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'alpha$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -981,6 +982,7 @@ test_stage_diff() {
echo '@@ -1 +1 @@' >> $testroot/stdout.expected
echo '-alpha' >> $testroot/stdout.expected
echo '+modified file' >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -989,6 +991,7 @@ test_stage_diff() {
echo '+++ /dev/null' >> $testroot/stdout.expected
echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
echo '-beta' >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo -n 'blob + ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l foo) | cut -d' ' -f 1 \
@@ -1595,8 +1598,8 @@ EOF
(cd $testroot/wt && got diff -s > $testroot/stdout)
echo "diff -s $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i -c $commit_id \
| grep 'numbers$' | cut -d' ' -f 1 \
@@ -1702,8 +1705,8 @@ EOF
(cd $testroot/wt && got diff -s > $testroot/stdout)
echo "diff -s $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i -c $commit_id \
| grep 'numbers$' | cut -d' ' -f 1 \
@@ -1857,8 +1860,8 @@ EOF
(cd $testroot/wt && got diff -s > $testroot/stdout)
echo "diff -s $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i -c $commit_id \
| grep 'numbers$' | cut -d' ' -f 1 \
@@ -1896,8 +1899,8 @@ EOF
(cd $testroot/wt && got diff > $testroot/stdout)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l numbers) | cut -d' ' -f 1 | \
tr -d '\n' >> $testroot/stdout.expected
@@ -1963,8 +1966,8 @@ test_stage_patch_added() {
(cd $testroot/wt && got diff -s > $testroot/stdout)
echo "diff -s $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo -n 'blob + ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l epsilon/new) | cut -d' ' -f 1 \
@@ -2088,8 +2091,8 @@ test_stage_patch_removed() {
(cd $testroot/wt && got diff -s > $testroot/stdout)
echo "diff -s $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l beta) | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -2310,8 +2313,8 @@ EOF
(cd $testroot/wt && got diff -s > $testroot/stdout)
echo "diff -s $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i -c $commit_id \
| grep 'numbers$' | cut -d' ' -f 1 \
@@ -2507,8 +2510,8 @@ EOF
(cd $testroot/wt && got diff -s > $testroot/stdout)
echo "diff -s $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_commit" >> $testroot/stdout.expected
echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'alpha.link@ -> alpha$' | \
cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2522,6 +2525,7 @@ EOF
echo '\ No newline at end of file' >> $testroot/stdout.expected
echo '+beta' >> $testroot/stdout.expected
echo '\ No newline at end of file' >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo -n 'blob + ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l dotgotbar.link) | cut -d' ' -f 1 \
@@ -2531,6 +2535,7 @@ EOF
echo '@@ -0,0 +1 @@' >> $testroot/stdout.expected
echo '+.got/bar' >> $testroot/stdout.expected
echo '\ No newline at end of file' >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo -n 'blob + ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l dotgotfoo.link) | cut -d' ' -f 1 \
@@ -2539,6 +2544,7 @@ EOF
echo '+++ dotgotfoo.link' >> $testroot/stdout.expected
echo '@@ -0,0 +1 @@' >> $testroot/stdout.expected
echo '+this is regular file foo' >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i epsilon | grep 'beta.link@ -> ../beta$' | \
cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2552,6 +2558,7 @@ EOF
echo '\ No newline at end of file' >> $testroot/stdout.expected
echo '+../gamma/delta' >> $testroot/stdout.expected
echo '\ No newline at end of file' >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'epsilon.link@ -> epsilon$' | \
cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2565,6 +2572,7 @@ EOF
echo '\ No newline at end of file' >> $testroot/stdout.expected
echo '+gamma' >> $testroot/stdout.expected
echo '\ No newline at end of file' >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'nonexistent.link@ -> nonexistent$' | \
cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2574,6 +2582,7 @@ EOF
echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
echo '-nonexistent' >> $testroot/stdout.expected
echo '\ No newline at end of file' >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo -n 'blob + ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l zeta.link) | cut -d' ' -f 1 \
@@ -2832,8 +2841,8 @@ EOF
(cd $testroot/wt && got diff -s > $testroot/stdout)
echo "diff -s $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_commit" >> $testroot/stdout.expected
echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'alpha.link@ -> alpha$' | \
cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2847,6 +2856,7 @@ EOF
echo '\ No newline at end of file' >> $testroot/stdout.expected
echo '+beta' >> $testroot/stdout.expected
echo '\ No newline at end of file' >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo -n 'blob + ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l dotgotfoo.link) | cut -d' ' -f 1 \
@@ -2855,6 +2865,7 @@ EOF
echo '+++ dotgotfoo.link' >> $testroot/stdout.expected
echo '@@ -0,0 +1 @@' >> $testroot/stdout.expected
echo '+this is regular file foo' >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'epsilon.link@ -> epsilon$' | \
cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2868,6 +2879,7 @@ EOF
echo '\ No newline at end of file' >> $testroot/stdout.expected
echo '+gamma' >> $testroot/stdout.expected
echo '\ No newline at end of file' >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'nonexistent.link@ -> nonexistent$' | \
cut -d' ' -f 1 >> $testroot/stdout.expected
@@ -2877,6 +2889,7 @@ EOF
echo '@@ -1 +0,0 @@' >> $testroot/stdout.expected
echo '-nonexistent' >> $testroot/stdout.expected
echo '\ No newline at end of file' >> $testroot/stdout.expected
+ echo "commit - $head_commit" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo -n 'blob + ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l zeta.link) | cut -d' ' -f 1 \
blob - 6bb970784b5cf067c17b918409a825a1287df1e1
blob + 1f9c74b96419ec6eda2b937ea04a8b7cae1c8e5f
--- regress/cmdline/unstage.sh
+++ regress/cmdline/unstage.sh
@@ -409,8 +409,8 @@ EOF
(cd $testroot/wt && got diff -s > $testroot/stdout)
echo "diff -s $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i -c $commit_id \
| grep 'numbers$' | cut -d' ' -f 1 \
@@ -445,8 +445,8 @@ EOF
(cd $testroot/wt && got diff > $testroot/stdout)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l numbers) | cut -d' ' -f 1 | \
tr -d '\n' >> $testroot/stdout.expected
@@ -554,8 +554,8 @@ EOF
(cd $testroot/wt && got diff -s > $testroot/stdout)
echo "diff -s $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i -c $commit_id \
| grep 'numbers$' | cut -d' ' -f 1 \
@@ -590,8 +590,8 @@ EOF
(cd $testroot/wt && got diff > $testroot/stdout)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l numbers) | cut -d' ' -f 1 | \
tr -d '\n' >> $testroot/stdout.expected
@@ -706,8 +706,8 @@ EOF
(cd $testroot/wt && got diff > $testroot/stdout)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i -c $commit_id \
| grep 'numbers$' | cut -d' ' -f 1 \
@@ -799,8 +799,8 @@ test_unstage_patch_added() {
(cd $testroot/wt && got diff > $testroot/stdout)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo 'blob - /dev/null' >> $testroot/stdout.expected
echo 'file + epsilon/new (mode 644)' >> $testroot/stdout.expected
echo "--- /dev/null" >> $testroot/stdout.expected
@@ -867,8 +867,8 @@ test_unstage_patch_removed() {
(cd $testroot/wt && got diff > $testroot/stdout)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
@@ -972,8 +972,8 @@ EOF
(cd $testroot/wt && got diff > $testroot/stdout)
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
(cd $testroot/wt && got stage -l numbers) | cut -d' ' -f 1 | \
tr -d '\n' >> $testroot/stdout.expected
@@ -998,8 +998,8 @@ EOF
(cd $testroot/wt && got diff -s > $testroot/stdout)
echo "diff -s $testroot/wt" > $testroot/stdout.expected
- echo "commit - $commit_id" >> $testroot/stdout.expected
echo "path + $testroot/wt (staged changes)" >> $testroot/stdout.expected
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i -c $commit_id \
| grep 'numbers$' | cut -d' ' -f 1 \
@@ -1026,6 +1026,7 @@ EOF
-16
+c
EOF
+ echo "commit - $commit_id" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'zzz$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
blob - 013d85e1d4cf6d156380290afdb9ab2e51598e63
blob + cd31d1db006846950774ef96be6c8beec4cc3f4e
--- regress/cmdline/update.sh
+++ regress/cmdline/update.sh
@@ -1178,8 +1178,8 @@ test_update_conflict_wt_rm_vs_repo_edit() {
# 'got diff' should show post-update contents of beta being deleted
local head_rev=`git_show_head $testroot/repo`
echo "diff $testroot/wt" > $testroot/stdout.expected
- echo "commit - $head_rev" >> $testroot/stdout.expected
echo "path + $testroot/wt" >> $testroot/stdout.expected
+ echo "commit - $head_rev" >> $testroot/stdout.expected
echo -n 'blob - ' >> $testroot/stdout.expected
got tree -r $testroot/repo -i | grep 'beta$' | cut -d' ' -f 1 \
>> $testroot/stdout.expected
--
Mark Jamsek <https://bsdbox.org>
GPG: F2FF 13DE 6A06 C471 CA80 E6E2 2930 DC66 86EE CF68
stop got diff from lying in mixed-commit work trees