git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [RFC PATCH 1/2] worktree: teach `list` to mark locked worktree

From
Junio C Hamano <gitster@pobox.com>
Date
Sep 28, 2020, 21:37 UTC
Message-ID
<xmqq8sctlgzx.fsf@gitster.c.googlers.com>
In-Reply-To
<20200928154953.30396-2-rafaeloliveira.cs@gmail.com>
Rafael Silva <rafaeloliveira.cs@gmail.com> writes:
Show 11 quoted lines
> The output of `worktree list` command is extended to mark a locked
> worktree with `(locked)` text. This is used to communicate to the
> user that a linked worktree is locked instead of learning only when
> attempting to remove it.
>
> This is the output of the worktree list with locked marker:
>
>   $ git worktree list
>   /repo/to/main                abc123 [master]
>   /path/to/unlocked-worktree1  456def [brancha]
>   /path/to/locked-worktree     123abc (detached HEAD) (locked)

In our log message, we tend NOT to say "This commit does X" or "X is done", because such a statement is often insufficient to illustrate if the commit indeed does X, and explain why it is a good thing to do X in the first place.

Instead, we 
 - first explain that the current system does not do X (in present
   tense, so we do NOT say "previously we did not do X"), then
 - explain why doing X would be a good thing, and finally
 - give an order to the codebase to start doing X.
For this change, it might look like this:
    The "git worktree list" shows the absolute path to the working
    tree, the commit that is checked out and the name of the branch.
    It is not immediately obvious which of the worktrees, if any,
    are locked.
    "git worktree remove" refuses to remove a locked worktree with
    an error message.  If "git worktree list" told which worktrees
    are locked in its output, the user would not even attempt to
    remove such a worktree.
    Teach "git worktree list" to append "(locked)" to its output.
    The output from the command becomes like so:
          $ git worktree list
          /repo/to/main                abc123 [master]
          /path/to/unlocked-worktree1  456def [brancha]
          /path/to/locked-worktree     123abc (detached HEAD) (locked)
Show 13 quoted lines
> diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
> index 32e8440cde..a3781dd664 100644
> --- a/Documentation/git-worktree.txt
> +++ b/Documentation/git-worktree.txt
> @@ -96,8 +96,9 @@ list::
>  
>  List details of each working tree.  The main working tree is listed first,
>  followed by each of the linked working trees.  The output details include
> -whether the working tree is bare, the revision currently checked out, and the
> -branch currently checked out (or "detached HEAD" if none).
> +whether the working tree is bare, the revision currently checked out, the
> +branch currently checked out (or "detached HEAD" if none), and whether
> +the worktree is locked.

At the first glance, the above gave me an impression that you'd be adding "(unlocked)" or "(locked)" for each working tree, but that is not the case. How about keeping the original sentence intact, and adding something like "For a locked worktree, the marker (locked) is also shown at the end"?

Show 13 quoted lines
> diff --git a/builtin/worktree.c b/builtin/worktree.c
> index 99abaeec6c..8ad2cdd2f9 100644
> --- a/builtin/worktree.c
> +++ b/builtin/worktree.c
> @@ -676,8 +676,12 @@ static void show_worktree(struct worktree *wt, int path_maxlen, int abbrev_len)
>  		} else
>  			strbuf_addstr(&sb, "(error)");
>  	}
> -	printf("%s\n", sb.buf);
>  
> +	if (!is_main_worktree(wt) &&
> +	    worktree_lock_reason(wt))
> +		strbuf_addstr(&sb, " (locked)");

Is this because for the primary worktree, worktree_lock_reason() will always yield true?

    ... goes and looks ...

Ah, OK, the callers are not even allowed to ask the question on the primary one. That's a bit strange API but OK.

Writing that on a single line would perfectly be readable, by the way.

	if (!is_main_worktree(wt) && worktree_lock_reason(wt))
		strbuf_addstr(&sb, " (locked)");
> +	printf("%s\n", sb.buf);
>  	strbuf_release(&sb);
>  }
Previous: Rafael SilvaNext: Rafael Silva
Message 3 of 23 in “teach `worktree list` to mark locked worktrees”
  1. 0/2 teach `worktree list` to mark locked worktreesRafael Silva, Sep 28, 2020
  2. 1/2 worktree: teach `list` to mark locked worktreeRafael Silva, Sep 28, 2020
  3. Junio C HamanoSep 28, 2020
  4. Rafael SilvaSep 29, 2020
  5. Eric SunshineSep 30, 2020
  6. 2/2 t2402: add test to locked linked worktree markerRafael Silva, Sep 28, 2020
  7. Junio C HamanoSep 28, 2020
  8. Rafael SilvaSep 29, 2020
  9. Eric SunshineSep 30, 2020
  10. Junio C HamanoSep 28, 2020
  11. Rafael SilvaSep 29, 2020
  12. Eric SunshineSep 30, 2020
  13. Rafael SilvaOct 2, 2020
  14. Eric SunshineOct 9, 2020
  15. Rafael SilvaOct 10, 2020
  16. 0/1 Teach "worktree list" to annotate locked worktreesRafael Silva, Oct 10, 2020
  17. 1/1 worktree: teach `list` to annotate locked worktreeRafael Silva, Oct 10, 2020
  18. Eric SunshineOct 11, 2020
  19. Eric SunshineOct 11, 2020
  20. Rafael SilvaOct 11, 2020
  21. 0/1 Teach "worktree list" to annotate locked worktreesRafael Silva, Oct 11, 2020
  22. worktree: teach `list` to annotate locked worktreeRafael Silva, Oct 11, 2020
  23. Eric SunshineOct 12, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.