worktree: teach worktree_lock_reason() to gently handle main worktree

worktree_lock_reason() aborts with an assertion failure when called on the main worktree since locking the main worktree is nonsensical. Not only is this behavior undocumented, thus callers might not even be aware that the call could potentially crash the program, but it also forces clients to be extra careful: if (!is_main_worktree(wt) && worktree_locked_reason(...)) ... Since we know that locking makes no sense in the context of the main worktree, we can simply return false for the main worktree, thus making client code less complex by eliminating the need for the callers to have inside knowledge about the implementation: if (worktree_lock_reason(...)) ... Helped-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Rafael Silva <rafaeloliveira.cs@gmail.com> Reviewed-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Rafael Silva committed Jan 19, 2021 at 22:27 UTC eb36135af7b03fbaab2d3091fa7f5c62a164ff43
2 files changed +3 -2
builtin/worktree.c
+1 -1
@@ -604,7 +604,7 @@ static void show_worktree(struct worktree *wt, int path_maxlen, int abbrev_len)
604 strbuf_addstr(&sb, "(error)");
605 }
606
607 - if (!is_main_worktree(wt) && worktree_lock_reason(wt))
607 + if (worktree_lock_reason(wt))
608 strbuf_addstr(&sb, " locked");
609
610 printf("%s\n", sb.buf);
worktree.c
+2 -1
@@ -225,7 +225,8 @@ int is_main_worktree(const struct worktree *wt)
225
226 const char *worktree_lock_reason(struct worktree *wt)
227 {
228 - assert(!is_main_worktree(wt));
228 + if (is_main_worktree(wt))
229 + return NULL;
230
231 if (!wt->lock_reason_valid) {
232 struct strbuf path = STRBUF_INIT;