diff options
author | Eric Sunshine <sunshine@sunshineco.com> | 2018-08-28 17:20:20 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-08-30 09:28:02 -0700 |
commit | 602aaed03f7f82323d88703d6fa2263a13c37907 (patch) | |
tree | 5e54b90300d883edd7f4170ffa25533b004436bb /builtin/worktree.c | |
parent | worktree: move delete_git_dir() earlier in file for upcoming new callers (diff) | |
download | tgif-602aaed03f7f82323d88703d6fa2263a13c37907.tar.xz |
worktree: generalize delete_git_dir() to reduce code duplication
prune_worktrees() and delete_git_dir() both remove worktree
administrative entries from .git/worktrees, and their implementations
are nearly identical. The only difference is that prune_worktrees() is
also capable of removing a bogus non-worktree-related file from
.git/worktrees.
Simplify by extending delete_git_dir() to handle the little bit of
extra functionality needed by prune_worktrees(), and drop the
effectively duplicate code from the latter.
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/worktree.c')
-rw-r--r-- | builtin/worktree.c | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/builtin/worktree.c b/builtin/worktree.c index a8128289cc..0affcb476c 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -47,16 +47,17 @@ static int git_worktree_config(const char *var, const char *value, void *cb) return git_default_config(var, value, cb); } -static int delete_git_dir(struct worktree *wt) +static int delete_git_dir(const char *id) { struct strbuf sb = STRBUF_INIT; - int ret = 0; + int ret; - strbuf_addstr(&sb, git_common_path("worktrees/%s", wt->id)); - if (remove_dir_recursively(&sb, 0)) { + strbuf_addstr(&sb, git_common_path("worktrees/%s", id)); + ret = remove_dir_recursively(&sb, 0); + if (ret < 0 && errno == ENOTDIR) + ret = unlink(sb.buf); + if (ret) error_errno(_("failed to delete '%s'"), sb.buf); - ret = -1; - } strbuf_release(&sb); return ret; } @@ -130,10 +131,8 @@ static int prune_worktree(const char *id, struct strbuf *reason) static void prune_worktrees(void) { struct strbuf reason = STRBUF_INIT; - struct strbuf path = STRBUF_INIT; DIR *dir = opendir(git_path("worktrees")); struct dirent *d; - int ret; if (!dir) return; while ((d = readdir(dir)) != NULL) { @@ -146,18 +145,12 @@ static void prune_worktrees(void) printf("%s\n", reason.buf); if (show_only) continue; - git_path_buf(&path, "worktrees/%s", d->d_name); - ret = remove_dir_recursively(&path, 0); - if (ret < 0 && errno == ENOTDIR) - ret = unlink(path.buf); - if (ret) - error_errno(_("failed to remove '%s'"), path.buf); + delete_git_dir(d->d_name); } closedir(dir); if (!show_only) rmdir(git_path("worktrees")); strbuf_release(&reason); - strbuf_release(&path); } static int prune(int ac, const char **av, const char *prefix) @@ -882,7 +875,7 @@ static int remove_worktree(int ac, const char **av, const char *prefix) * continue on even if ret is non-zero, there's no going back * from here. */ - ret |= delete_git_dir(wt); + ret |= delete_git_dir(wt->id); free_worktrees(worktrees); return ret; |