From 43b1791ec601732ac31195df96781a848360a9ac Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Tue, 21 Sep 2021 13:03:01 +0300 Subject: chore(3p/git): Unvendor git and track patches instead This was vendored a long time ago under the expectation that keeping it in sync with cgit would be easier this way, but it has proven not to be a big issue. On the other hand, a vendored copy of git is an annoying maintenance burden. It is much easier to rebase the single (dottime) patch that we have. This removes the vendored copy of git and instead passes the git source code to cgit via `pkgs.srcOnly`, which includes the applied patch so that cgit can continue rendering dottime. Change-Id: If31f62dea7ce688fd1b9050204e9378019775f2b --- third_party/git/builtin/worktree.c | 1088 ------------------------------------ 1 file changed, 1088 deletions(-) delete mode 100644 third_party/git/builtin/worktree.c (limited to 'third_party/git/builtin/worktree.c') diff --git a/third_party/git/builtin/worktree.c b/third_party/git/builtin/worktree.c deleted file mode 100644 index 99abaeec6c6e..000000000000 --- a/third_party/git/builtin/worktree.c +++ /dev/null @@ -1,1088 +0,0 @@ -#include "cache.h" -#include "checkout.h" -#include "config.h" -#include "builtin.h" -#include "dir.h" -#include "parse-options.h" -#include "strvec.h" -#include "branch.h" -#include "refs.h" -#include "run-command.h" -#include "sigchain.h" -#include "submodule.h" -#include "utf8.h" -#include "worktree.h" - -static const char * const worktree_usage[] = { - N_("git worktree add [] []"), - N_("git worktree list []"), - N_("git worktree lock [] "), - N_("git worktree move "), - N_("git worktree prune []"), - N_("git worktree remove [] "), - N_("git worktree unlock "), - NULL -}; - -struct add_opts { - int force; - int detach; - int quiet; - int checkout; - int keep_locked; -}; - -static int show_only; -static int verbose; -static int guess_remote; -static timestamp_t expire; - -static int git_worktree_config(const char *var, const char *value, void *cb) -{ - if (!strcmp(var, "worktree.guessremote")) { - guess_remote = git_config_bool(var, value); - return 0; - } - - return git_default_config(var, value, cb); -} - -static int delete_git_dir(const char *id) -{ - struct strbuf sb = STRBUF_INIT; - int ret; - - 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); - strbuf_release(&sb); - return ret; -} - -static void delete_worktrees_dir_if_empty(void) -{ - rmdir(git_path("worktrees")); /* ignore failed removal */ -} - -/* - * Return true if worktree entry should be pruned, along with the reason for - * pruning. Otherwise, return false and the worktree's path, or NULL if it - * cannot be determined. Caller is responsible for freeing returned path. - */ -static int should_prune_worktree(const char *id, struct strbuf *reason, char **wtpath) -{ - struct stat st; - char *path; - int fd; - size_t len; - ssize_t read_result; - - *wtpath = NULL; - if (!is_directory(git_path("worktrees/%s", id))) { - strbuf_addstr(reason, _("not a valid directory")); - return 1; - } - if (file_exists(git_path("worktrees/%s/locked", id))) - return 0; - if (stat(git_path("worktrees/%s/gitdir", id), &st)) { - strbuf_addstr(reason, _("gitdir file does not exist")); - return 1; - } - fd = open(git_path("worktrees/%s/gitdir", id), O_RDONLY); - if (fd < 0) { - strbuf_addf(reason, _("unable to read gitdir file (%s)"), - strerror(errno)); - return 1; - } - len = xsize_t(st.st_size); - path = xmallocz(len); - - read_result = read_in_full(fd, path, len); - if (read_result < 0) { - strbuf_addf(reason, _("unable to read gitdir file (%s)"), - strerror(errno)); - close(fd); - free(path); - return 1; - } - close(fd); - - if (read_result != len) { - strbuf_addf(reason, - _("short read (expected %"PRIuMAX" bytes, read %"PRIuMAX")"), - (uintmax_t)len, (uintmax_t)read_result); - free(path); - return 1; - } - while (len && (path[len - 1] == '\n' || path[len - 1] == '\r')) - len--; - if (!len) { - strbuf_addstr(reason, _("invalid gitdir file")); - free(path); - return 1; - } - path[len] = '\0'; - if (!file_exists(path)) { - if (stat(git_path("worktrees/%s/index", id), &st) || - st.st_mtime <= expire) { - strbuf_addstr(reason, _("gitdir file points to non-existent location")); - free(path); - return 1; - } else { - *wtpath = path; - return 0; - } - } - *wtpath = path; - return 0; -} - -static void prune_worktree(const char *id, const char *reason) -{ - if (show_only || verbose) - printf_ln(_("Removing %s/%s: %s"), "worktrees", id, reason); - if (!show_only) - delete_git_dir(id); -} - -static int prune_cmp(const void *a, const void *b) -{ - const struct string_list_item *x = a; - const struct string_list_item *y = b; - int c; - - if ((c = fspathcmp(x->string, y->string))) - return c; - /* - * paths same; prune_dupes() removes all but the first worktree entry - * having the same path, so sort main worktree ('util' is NULL) above - * linked worktrees ('util' not NULL) since main worktree can't be - * removed - */ - if (!x->util) - return -1; - if (!y->util) - return 1; - /* paths same; sort by .git/worktrees/ */ - return strcmp(x->util, y->util); -} - -static void prune_dups(struct string_list *l) -{ - int i; - - QSORT(l->items, l->nr, prune_cmp); - for (i = 1; i < l->nr; i++) { - if (!fspathcmp(l->items[i].string, l->items[i - 1].string)) - prune_worktree(l->items[i].util, "duplicate entry"); - } -} - -static void prune_worktrees(void) -{ - struct strbuf reason = STRBUF_INIT; - struct strbuf main_path = STRBUF_INIT; - struct string_list kept = STRING_LIST_INIT_NODUP; - DIR *dir = opendir(git_path("worktrees")); - struct dirent *d; - if (!dir) - return; - while ((d = readdir(dir)) != NULL) { - char *path; - if (is_dot_or_dotdot(d->d_name)) - continue; - strbuf_reset(&reason); - if (should_prune_worktree(d->d_name, &reason, &path)) - prune_worktree(d->d_name, reason.buf); - else if (path) - string_list_append(&kept, path)->util = xstrdup(d->d_name); - } - closedir(dir); - - strbuf_add_absolute_path(&main_path, get_git_common_dir()); - /* massage main worktree absolute path to match 'gitdir' content */ - strbuf_strip_suffix(&main_path, "/."); - string_list_append(&kept, strbuf_detach(&main_path, NULL)); - prune_dups(&kept); - string_list_clear(&kept, 1); - - if (!show_only) - delete_worktrees_dir_if_empty(); - strbuf_release(&reason); -} - -static int prune(int ac, const char **av, const char *prefix) -{ - struct option options[] = { - OPT__DRY_RUN(&show_only, N_("do not remove, show only")), - OPT__VERBOSE(&verbose, N_("report pruned working trees")), - OPT_EXPIRY_DATE(0, "expire", &expire, - N_("expire working trees older than