commit 69d57f3de25cfb3fd0cbfef22bd20090b36cee5e from: Stefan Sperling date: Fri Jul 31 11:19:29 2020 UTC fix spurious 'got cherrypick' error with a path prefix and an empty tree If the work tree's path prefix does not exist in the first of the two trees, then 'got cherrypick' failed with "no such entry found in tree". But this is a legitimate situation, as shown in the new test added here. The first tree could be the empty tree, for example, which should result in 'got cherrypick' adding all files from the second tree instead of complaining about a non-existent path-prefix directory in the first tree. commit - b66cd6f325e3fa7ddd17ff6dd41cf6e59d04ebf5 commit + 69d57f3de25cfb3fd0cbfef22bd20090b36cee5e blob - 61cc47cf16c65800bfc0db8525b875e9f2878054 blob + d3a3569afd8e1161702e6fba6e579b31db71ff2a --- lib/worktree.c +++ lib/worktree.c @@ -2930,12 +2930,13 @@ merge_files(struct got_worktree *worktree, struct got_ char *label_orig = NULL; if (commit_id1) { - char *id_str; - err = got_object_id_by_path(&tree_id1, repo, commit_id1, worktree->path_prefix); - if (err) + if (err && err->code != GOT_ERR_NO_TREE_ENTRY) goto done; + } + if (tree_id1) { + char *id_str; err = got_object_open_as_tree(&tree1, repo, tree_id1); if (err) blob - cb7dd89554f0b55182721b03135d3a63add638f9 blob + 95862835bab2b3bd688acdbf129886876cf210ec --- regress/cmdline/cherrypick.sh +++ regress/cmdline/cherrypick.sh @@ -730,6 +730,53 @@ function test_cherrypick_symlink_conflicts { fi test_done "$testroot" "0" +} + +function test_cherrypick_with_path_prefix_and_empty_tree { + local testroot=`test_init cherrypick_with_path_prefix_and_empty_tree 1` + + (cd $testroot/repo && git commit --allow-empty \ + -m "initial empty commit" >/dev/null) + + (cd $testroot/repo && got br bar >/dev/null) + + mkdir -p $testroot/repo/epsilon + echo "file foo" > $testroot/repo/epsilon/foo + (cd $testroot/repo && git add .) + git_commit $testroot/repo -m "add file foo" + local commit_id=`git_show_head $testroot/repo` + + got checkout -b bar $testroot/repo $testroot/wt > /dev/null + ret="$?" + if [ "$ret" != "0" ]; then + echo "got checkout failed unexpectedly" >&2 + test_done "$testroot" "$ret" + return 1 + fi + + mkdir -p $testroot/wt/epsilon + echo "new file" > $testroot/wt/epsilon/new + (cd $testroot/wt && got add epsilon/new >/dev/null) + (cd $testroot/wt && got commit -m "add file on branch bar" > /dev/null) + + got checkout -b bar -p epsilon $testroot/repo $testroot/wt2 > /dev/null + ret="$?" + if [ "$ret" != "0" ]; then + echo "got checkout failed unexpectedly" >&2 + test_done "$testroot" "$ret" + return 1 + fi + (cd $testroot/wt2 && got cherrypick $commit_id > $testroot/stdout) + + echo "A foo" > $testroot/stdout.expected + echo "Merged commit $commit_id" >> $testroot/stdout.expected + + cmp -s $testroot/stdout.expected $testroot/stdout + ret="$?" + if [ "$ret" != "0" ]; then + diff -u $testroot/stdout.expected $testroot/stdout + fi + test_done "$testroot" "$ret" } run_test test_cherrypick_basic @@ -740,3 +787,4 @@ run_test test_cherrypick_added_submodule run_test test_cherrypick_conflict_wt_file_vs_repo_submodule run_test test_cherrypick_modified_symlinks run_test test_cherrypick_symlink_conflicts +run_test test_cherrypick_with_path_prefix_and_empty_tree