v5 fixes some error messages mentioning "working directory" instead of
"working tree" and split the double use of "lock_reason" field in
"struct worktree". This series depends on
nd/worktree-cleanup-post-head-protection.

Diff from v4

-- 8< --
diff --git a/builtin/worktree.c b/builtin/worktree.c
index cb5026d..4877421 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -478,9 +478,9 @@ static int lock_worktree(int ac, const char **av, const 
char *prefix)
        worktrees = get_worktrees();
        wt = find_worktree(worktrees, prefix, av[0]);
        if (!wt)
-               die(_("'%s' is not a working directory"), av[0]);
+               die(_("'%s' is not a working tree"), av[0]);
        if (is_main_worktree(wt))
-               die(_("'%s' is a main working directory"), av[0]);
+               die(_("The main working tree cannot be locked or unlocked"));
 
        old_reason = is_worktree_locked(wt);
        if (old_reason) {
@@ -511,9 +511,9 @@ static int unlock_worktree(int ac, const char **av, const 
char *prefix)
        worktrees = get_worktrees();
        wt = find_worktree(worktrees, prefix, av[0]);
        if (!wt)
-               die(_("'%s' is not a working directory"), av[0]);
+               die(_("'%s' is not a working tree"), av[0]);
        if (is_main_worktree(wt))
-               die(_("'%s' is a main working directory"), av[0]);
+               die(_("The main working tree cannot be locked or unlocked"));
        if (!is_worktree_locked(wt))
                die(_("'%s' is not locked"), av[0]);
        ret = unlink_or_warn(git_common_path("worktrees/%s/locked", wt->id));
diff --git a/worktree.c b/worktree.c
index b16262b..2107c06 100644
--- a/worktree.c
+++ b/worktree.c
@@ -5,8 +5,6 @@
 #include "dir.h"
 #include "wt-status.h"
 
-static const char *lock_field_uninitialized = "value is not important";
-
 void free_worktrees(struct worktree **worktrees)
 {
        int i = 0;
@@ -15,8 +13,7 @@ void free_worktrees(struct worktree **worktrees)
                free(worktrees[i]->path);
                free(worktrees[i]->id);
                free(worktrees[i]->head_ref);
-               if (worktrees[i]->lock_reason != lock_field_uninitialized)
-                       free(worktrees[i]->lock_reason);
+               free(worktrees[i]->lock_reason);
                free(worktrees[i]);
        }
        free (worktrees);
@@ -102,7 +99,8 @@ static struct worktree *get_main_worktree(void)
        worktree->is_detached = is_detached;
        worktree->is_current = 0;
        add_head_info(&head_ref, worktree);
-       worktree->lock_reason = (char *)lock_field_uninitialized;
+       worktree->lock_reason = NULL;
+       worktree->lock_reason_valid = 0;
 
 done:
        strbuf_release(&path);
@@ -148,7 +146,8 @@ static struct worktree *get_linked_worktree(const char *id)
        worktree->is_detached = is_detached;
        worktree->is_current = 0;
        add_head_info(&head_ref, worktree);
-       worktree->lock_reason = (char *)lock_field_uninitialized;
+       worktree->lock_reason = NULL;
+       worktree->lock_reason_valid = 0;
 
 done:
        strbuf_release(&path);
@@ -271,7 +270,9 @@ int is_main_worktree(const struct worktree *wt)
 
 const char *is_worktree_locked(struct worktree *wt)
 {
-       if (wt->lock_reason == lock_field_uninitialized) {
+       assert(!is_main_worktree(wt));
+
+       if (!wt->lock_reason_valid) {
                struct strbuf path = STRBUF_INIT;
 
                strbuf_addstr(&path, worktree_git_path(wt, "locked"));
@@ -283,6 +284,7 @@ const char *is_worktree_locked(struct worktree *wt)
                        wt->lock_reason = strbuf_detach(&lock_reason, NULL);
                } else
                        wt->lock_reason = NULL;
+               wt->lock_reason_valid = 1;
                strbuf_release(&path);
        }
 
diff --git a/worktree.h b/worktree.h
index 263b61d..90e1311 100644
--- a/worktree.h
+++ b/worktree.h
@@ -10,6 +10,7 @@ struct worktree {
        int is_detached;
        int is_bare;
        int is_current;
+       int lock_reason_valid;
 };
 
 /* Functions for acting on the information about worktrees. */
-- >8 --

Nguyễn Thái Ngọc Duy (6):
  worktree.c: add find_worktree()
  worktree.c: add is_main_worktree()
  worktree.c: add is_worktree_locked()
  worktree: add "lock" command
  worktree: add "unlock" command
  worktree.c: find_worktree() search by path suffix

 Documentation/git-worktree.txt         | 36 +++++++++++++---
 builtin/worktree.c                     | 66 +++++++++++++++++++++++++++++
 contrib/completion/git-completion.bash |  5 ++-
 t/t2028-worktree-move.sh (new +x)      | 62 +++++++++++++++++++++++++++
 worktree.c                             | 77 ++++++++++++++++++++++++++++++++++
 worktree.h                             | 21 ++++++++++
 6 files changed, 260 insertions(+), 7 deletions(-)
 create mode 100755 t/t2028-worktree-move.sh

-- 
2.8.2.524.g6ff3d78

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to