Download raw body.
make'got checkout' display what was checked out
On Tue, Sep 14, 2021 at 12:30:37PM +0200, Stefan Sperling wrote:
> Make 'got checkout' display the checked out reference and commit ID
> for informative purposes.
>
> This makes it more obvious which branch was chosen by default.
> And following traces of shell scripts which run 'got checkout' should
> also become easier with this.
>
> New output looks like this (paths omitted, thanks to the new -q option
> added by Tracey):
>
> $ got co -q /git/got.git/ test-wt
> Checked out refs/heads/main: 26960ff7b4461002e1b3b1c5c0ffd0e492bc71ba
> Now shut up and hack
> $
>
> ok?
>
Yes, I like that very much.
> As a next step, I think making 'got update' consistent with the above
> would be good, by having it display the current branch name in addition
> to the commit hash.
Agreed.
>
> diff 74f5be75024abbc5165ebae56899d1705af31d14 cd6928e6f7942963e5ddcf6520da8efdacde7fe0
> blob - e0fa2127a56f4fd45394cbea92d0f7cbe3ce866f
> blob + 5b9314a3697912717163cbf631321921615245a0
> --- got/got.c
> +++ got/got.c
> @@ -2823,13 +2823,14 @@ cmd_checkout(int argc, char *argv[])
> {
> const struct got_error *error = NULL;
> struct got_repository *repo = NULL;
> - struct got_reference *head_ref = NULL;
> + struct got_reference *head_ref = NULL, *ref = NULL;
> struct got_worktree *worktree = NULL;
> char *repo_path = NULL;
> char *worktree_path = NULL;
> const char *path_prefix = "";
> - const char *branch_name = GOT_REF_HEAD;
> + const char *branch_name = GOT_REF_HEAD, *refname = NULL;
> char *commit_id_str = NULL;
> + struct got_object_id *commit_id = NULL;
> char *cwd = NULL;
> int ch, same_path_prefix, allow_nonempty = 0, verbosity = 0;
> struct got_pathlist_head paths;
> @@ -2966,7 +2967,6 @@ cmd_checkout(int argc, char *argv[])
> }
>
> if (commit_id_str) {
> - struct got_object_id *commit_id;
> struct got_reflist_head refs;
> TAILQ_INIT(&refs);
> error = got_ref_list(&refs, repo, NULL, got_ref_cmp_by_name,
> @@ -2998,9 +2998,23 @@ cmd_checkout(int argc, char *argv[])
> }
> error = got_worktree_set_base_commit_id(worktree, repo,
> commit_id);
> - free(commit_id);
> if (error)
> goto done;
> + /* Expand potentially abbreviated commit ID string. */
> + free(commit_id_str);
> + error = got_object_id_str(&commit_id_str, commit_id);
> + if (error)
> + goto done;
> + } else {
> + commit_id = got_object_id_dup(
> + got_worktree_get_base_commit_id(worktree));
> + if (commit_id == NULL) {
> + error = got_error_from_errno("got_object_id_dup");
> + goto done;
> + }
> + error = got_object_id_str(&commit_id_str, commit_id);
> + if (error)
> + goto done;
> }
>
> error = got_pathlist_append(&paths, "", NULL);
> @@ -3014,12 +3028,25 @@ cmd_checkout(int argc, char *argv[])
> if (error != NULL)
> goto done;
>
> + if (got_ref_is_symbolic(head_ref)) {
> + error = got_ref_resolve_symbolic(&ref, repo, head_ref);
> + if (error)
> + goto done;
> + refname = got_ref_get_name(ref);
> + } else
> + refname = got_ref_get_name(head_ref);
> + printf("Checked out %s: %s\n", refname, commit_id_str);
> printf("Now shut up and hack\n");
> if (cpa.had_base_commit_ref_error)
> show_worktree_base_ref_warning();
> done:
> + if (head_ref)
> + got_ref_close(head_ref);
> + if (ref)
> + got_ref_close(ref);
> got_pathlist_free(&paths);
> free(commit_id_str);
> + free(commit_id);
> free(repo_path);
> free(worktree_path);
> free(cwd);
> blob - b6c5784556b7f6d287d651006dc0ccee50de3901
> blob + f9066950a272a65b3095aa0b65af01fccd329c41
> --- regress/cmdline/checkout.sh
> +++ regress/cmdline/checkout.sh
> @@ -18,11 +18,14 @@
>
> test_checkout_basic() {
> local testroot=`test_init checkout_basic`
> + local commit_id=`git_show_head $testroot/repo`
>
> echo "A $testroot/wt/alpha" > $testroot/stdout.expected
> echo "A $testroot/wt/beta" >> $testroot/stdout.expected
> echo "A $testroot/wt/epsilon/zeta" >> $testroot/stdout.expected
> echo "A $testroot/wt/gamma/delta" >> $testroot/stdout.expected
> + echo "Checked out refs/heads/master: $commit_id" \
> + >> $testroot/stdout.expected
> echo "Now shut up and hack" >> $testroot/stdout.expected
>
> got checkout $testroot/repo $testroot/wt > $testroot/stdout
> @@ -57,11 +60,14 @@ test_checkout_basic() {
>
> test_checkout_dir_exists() {
> local testroot=`test_init checkout_dir_exists`
> + local commit_id=`git_show_head $testroot/repo`
>
> echo "A $testroot/wt/alpha" > $testroot/stdout.expected
> echo "A $testroot/wt/beta" >> $testroot/stdout.expected
> echo "A $testroot/wt/epsilon/zeta" >> $testroot/stdout.expected
> echo "A $testroot/wt/gamma/delta" >> $testroot/stdout.expected
> + echo "Checked out refs/heads/master: $commit_id" \
> + >> $testroot/stdout.expected
> echo "Now shut up and hack" >> $testroot/stdout.expected
>
> mkdir $testroot/wt
> @@ -98,11 +104,14 @@ test_checkout_dir_exists() {
>
> test_checkout_dir_not_empty() {
> local testroot=`test_init checkout_dir_not_empty`
> + local commit_id=`git_show_head $testroot/repo`
>
> echo "A $testroot/wt/alpha" > $testroot/stdout.expected
> echo "A $testroot/wt/beta" >> $testroot/stdout.expected
> echo "A $testroot/wt/epsilon/zeta" >> $testroot/stdout.expected
> echo "A $testroot/wt/gamma/delta" >> $testroot/stdout.expected
> + echo "Checked out refs/heads/master: $commit_id" \
> + >> $testroot/stdout.expected
> echo "Now shut up and hack" >> $testroot/stdout.expected
>
> mkdir $testroot/wt
> @@ -144,8 +153,11 @@ test_checkout_sets_xbit() {
> chmod +x $testroot/repo/xfile
> (cd $testroot/repo && git add .)
> git_commit $testroot/repo -m "adding executable file"
> + local commit_id=`git_show_head $testroot/repo`
>
> echo "A $testroot/wt/xfile" > $testroot/stdout.expected
> + echo "Checked out refs/heads/master: $commit_id" \
> + >> $testroot/stdout.expected
> echo "Now shut up and hack" >> $testroot/stdout.expected
>
> got checkout $testroot/repo $testroot/wt > $testroot/stdout
> @@ -218,6 +230,7 @@ test_checkout_commit_from_wrong_branch() {
>
> test_checkout_tag() {
> local testroot=`test_init checkout_tag`
> + local commit_id=`git_show_head $testroot/repo`
> local tag="1.0.0"
>
> (cd $testroot/repo && git tag -a -m "test" $tag)
> @@ -226,6 +239,8 @@ test_checkout_tag() {
> echo "A $testroot/wt/beta" >> $testroot/stdout.expected
> echo "A $testroot/wt/epsilon/zeta" >> $testroot/stdout.expected
> echo "A $testroot/wt/gamma/delta" >> $testroot/stdout.expected
> + echo "Checked out refs/heads/master: $commit_id" \
> + >> $testroot/stdout.expected
> echo "Now shut up and hack" >> $testroot/stdout.expected
>
> got checkout -c $tag $testroot/repo $testroot/wt > $testroot/stdout
> @@ -265,12 +280,15 @@ test_checkout_ignores_submodules() {
>
> (cd $testroot/repo && git submodule -q add ../repo2)
> (cd $testroot/repo && git commit -q -m 'adding submodule')
> + local commit_id=`git_show_head $testroot/repo`
>
> echo "A $testroot/wt/.gitmodules" > $testroot/stdout.expected
> echo "A $testroot/wt/alpha" >> $testroot/stdout.expected
> echo "A $testroot/wt/beta" >> $testroot/stdout.expected
> echo "A $testroot/wt/epsilon/zeta" >> $testroot/stdout.expected
> echo "A $testroot/wt/gamma/delta" >> $testroot/stdout.expected
> + echo "Checked out refs/heads/master: $commit_id" \
> + >> $testroot/stdout.expected
> echo "Now shut up and hack" >> $testroot/stdout.expected
>
> got checkout $testroot/repo $testroot/wt > $testroot/stdout
> @@ -305,6 +323,7 @@ test_checkout_ignores_submodules() {
>
> test_checkout_read_only() {
> local testroot=`test_init checkout_read_only`
> + local commit_id=`git_show_head $testroot/repo`
>
> # Make the repostiory read-only
> chmod -R a-w $testroot/repo
> @@ -313,6 +332,8 @@ test_checkout_read_only() {
> echo "A $testroot/wt/beta" >> $testroot/stdout.expected
> echo "A $testroot/wt/epsilon/zeta" >> $testroot/stdout.expected
> echo "A $testroot/wt/gamma/delta" >> $testroot/stdout.expected
> + echo "Checked out refs/heads/master: $commit_id" \
> + >> $testroot/stdout.expected
> echo "Now shut up and hack" >> $testroot/stdout.expected
>
> got checkout $testroot/repo $testroot/wt \
> @@ -366,6 +387,7 @@ test_checkout_read_only() {
>
> test_checkout_into_nonempty_dir() {
> local testroot=`test_init checkout_into_nonempty_dir`
> + local commit_id=`git_show_head $testroot/repo`
>
> mkdir -p $testroot/wt
> make_test_tree $testroot/wt
> @@ -402,6 +424,8 @@ test_checkout_into_nonempty_dir() {
> echo "? $testroot/wt/beta" >> $testroot/stdout.expected
> echo "? $testroot/wt/epsilon/zeta" >> $testroot/stdout.expected
> echo "? $testroot/wt/gamma/delta" >> $testroot/stdout.expected
> + echo "Checked out refs/heads/master: $commit_id" \
> + >> $testroot/stdout.expected
> echo "Now shut up and hack" >> $testroot/stdout.expected
>
> got checkout -E $testroot/repo $testroot/wt > $testroot/stdout
> @@ -423,6 +447,8 @@ test_checkout_into_nonempty_dir() {
> echo "E $testroot/wt/beta" >> $testroot/stdout.expected
> echo "E $testroot/wt/epsilon/zeta" >> $testroot/stdout.expected
> echo "E $testroot/wt/gamma/delta" >> $testroot/stdout.expected
> + echo "Checked out refs/heads/master: $commit_id" \
> + >> $testroot/stdout.expected
> echo "Now shut up and hack" >> $testroot/stdout.expected
>
> got checkout -E $testroot/repo $testroot/wt > $testroot/stdout
> @@ -461,6 +487,8 @@ test_checkout_into_nonempty_dir() {
> echo "E $testroot/wt/beta" >> $testroot/stdout.expected
> echo "E $testroot/wt/epsilon/zeta" >> $testroot/stdout.expected
> echo "E $testroot/wt/gamma/delta" >> $testroot/stdout.expected
> + echo "Checked out refs/heads/master: $commit_id" \
> + >> $testroot/stdout.expected
> echo "Now shut up and hack" >> $testroot/stdout.expected
>
> got checkout -E $testroot/repo $testroot/wt > $testroot/stdout
> @@ -516,6 +544,7 @@ test_checkout_symlink() {
> (cd $testroot/repo && ln -s .got/foo dotgotfoo.link)
> (cd $testroot/repo && git add .)
> git_commit $testroot/repo -m "add symlinks"
> + local commit_id=`git_show_head $testroot/repo`
>
> got checkout $testroot/repo $testroot/wt > $testroot/stdout
> ret="$?"
> @@ -536,6 +565,8 @@ test_checkout_symlink() {
> echo "A $testroot/wt/nonexistent.link" >> $testroot/stdout.expected
> echo "A $testroot/wt/passwd.link" >> $testroot/stdout.expected
> echo "A $testroot/wt/passwd2.link" >> $testroot/stdout.expected
> + echo "Checked out refs/heads/master: $commit_id" \
> + >> $testroot/stdout.expected
> echo "Now shut up and hack" >> $testroot/stdout.expected
>
> cmp -s $testroot/stdout.expected $testroot/stdout
> blob - 487d5e7d9c6ed6c9c2532b3a7fc2dd808e7f3284
> blob + f90827299e298d8d6dcedf838627c59d16f80333
> --- regress/cmdline/import.sh
> +++ regress/cmdline/import.sh
> @@ -104,6 +104,8 @@ test_import_basic() {
> echo "A $testroot/wt/beta" >> $testroot/stdout.expected
> echo "A $testroot/wt/epsilon/zeta" >> $testroot/stdout.expected
> echo "A $testroot/wt/gamma/delta" >> $testroot/stdout.expected
> + echo "Checked out refs/heads/main: $head_commit" \
> + >> $testroot/stdout.expected
> echo "Now shut up and hack" >> $testroot/stdout.expected
>
> got checkout $testroot/repo $testroot/wt > $testroot/stdout
--
Tracey Emery
make'got checkout' display what was checked out