From patchwork Wed Nov 17 14:19:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew John Cheetham X-Patchwork-Id: 12624673 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CEA58C433F5 for ; Wed, 17 Nov 2021 14:20:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AF52563214 for ; Wed, 17 Nov 2021 14:20:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238643AbhKQOXd (ORCPT ); Wed, 17 Nov 2021 09:23:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54756 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238445AbhKQOXC (ORCPT ); Wed, 17 Nov 2021 09:23:02 -0500 Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B1754C061A0E for ; Wed, 17 Nov 2021 06:19:43 -0800 (PST) Received: by mail-wr1-x430.google.com with SMTP id i5so5056603wrb.2 for ; Wed, 17 Nov 2021 06:19:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=9DF8xacLLxcfovMqJ/eqpmiu+Qris70HYXyQdV96HVg=; b=TLtaWIyyQTwiRz2jP5VYqXPtU6rLM6qlAZwy47x/tfO6oVUaw7udnF5Mdgo0QxqIE8 AdoBwxnLLClw52dG/7nrTCchGej/+c6TxMMazDm8yapMMygSoMb+8nudCLIiG133xdjA l+8ABhQ7a0Yu2CS40FZG/l5s034bpXB37W6pPJj2j5jiQKua6fDfMg9fSpRX21sg3Uij ZGs8L370milMMSeLWGnhwEtyqo52Ff3czV93q9CkEPAsqfaP0N07JHrUlCdmAmvnfRe/ Plbu/EmdBjA+oY17c0Hh/GLNXF31X2+tfAms2Nca4JSvWKijKLIdU3LdzpM4PwKqpRjm J8wA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=9DF8xacLLxcfovMqJ/eqpmiu+Qris70HYXyQdV96HVg=; b=gjrceh2O8ySEkCIxJh8kqdoie6Cv0Z/oXsgE2beD8KckKDsq3Lmzm2jX46KD+l68Ry 6heVWIx5uB2fsbGL6mjX9z0/QngC9MLPgg9PgMj0G8PA9UiDOIpMkhw6CJlM33VTVlOL OVtloQRhEiv8ZNX5UhCgTvrmPU72X8L6N2wOkdiEhWxq+/H8I4VGJncBEO8r7HCTfQVY NGAx3VMXaVnb2AxPq1XM1zNZMI8nFLZ8yuLNJ5JzPYBGaGtNdz2K7HQ4Q0qfMI5+RoMo frz0DOSGkCObDSPi5d1J/ugl+mvMlbKO20JxtmJuVUNHa7QnWUCQUojsMnn3a3HakA0y qteg== X-Gm-Message-State: AOAM532qKRpEzDP/0Jx9LWdU6Wp827GVwONnpFuBTUu4btyGezO/3Bnc 51qhhLBBpIaovz4/Be+8umhzpJQew28= X-Google-Smtp-Source: ABdhPJyplnFcc7NkakP6rJ1K57M/KCAG2q7Unv2+3Ek7rjxydk9l6fZ5jIZz2kUuQ1rEN0u9NOLhuw== X-Received: by 2002:a05:6000:1043:: with SMTP id c3mr19844009wrx.64.1637158782063; Wed, 17 Nov 2021 06:19:42 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id s13sm5813729wmc.47.2021.11.17.06.19.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Nov 2021 06:19:41 -0800 (PST) Message-Id: In-Reply-To: References: Date: Wed, 17 Nov 2021 14:19:21 +0000 Subject: [PATCH v7 16/17] scalar: implement the `delete` command Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Derrick Stolee , Eric Sunshine , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Elijah Newren , Bagas Sanjaya , Theodore Ts'o , Johannes Schindelin , Matthew John Cheetham Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Matthew John Cheetham From: Matthew John Cheetham Delete an enlistment by first unregistering the repository and then deleting the enlistment directory (usually the directory containing the worktree `src/` directory). On Windows, if the current directory is inside the enlistment's directory, change to the parent of the enlistment directory, to allow us to delete the enlistment (directories used by processes e.g. as current working directories cannot be deleted on Windows). Co-authored-by: Victoria Dye Signed-off-by: Matthew John Cheetham Signed-off-by: Johannes Schindelin --- contrib/scalar/scalar.c | 63 ++++++++++++++++++++++++++++++++ contrib/scalar/scalar.txt | 8 ++++ contrib/scalar/t/t9099-scalar.sh | 9 +++++ 3 files changed, 80 insertions(+) diff --git a/contrib/scalar/scalar.c b/contrib/scalar/scalar.c index 71ca573f3af..c53697ad6a0 100644 --- a/contrib/scalar/scalar.c +++ b/contrib/scalar/scalar.c @@ -8,6 +8,8 @@ #include "config.h" #include "run-command.h" #include "refs.h" +#include "dir.h" +#include "packfile.h" /* * Remove the deepest subdirectory in the provided path string. Path must not @@ -328,6 +330,33 @@ static char *remote_default_branch(const char *url) return NULL; } +static int delete_enlistment(struct strbuf *enlistment) +{ +#ifdef WIN32 + struct strbuf parent = STRBUF_INIT; +#endif + + if (unregister_dir()) + die(_("failed to unregister repository")); + +#ifdef WIN32 + /* + * Change the current directory to one outside of the enlistment so + * that we may delete everything underneath it. + */ + strbuf_addbuf(&parent, enlistment); + strbuf_parent_directory(&parent); + if (chdir(parent.buf) < 0) + die_errno(_("could not switch to '%s'"), parent.buf); + strbuf_release(&parent); +#endif + + if (remove_dir_recursively(enlistment, 0)) + die(_("failed to delete enlistment directory")); + + return 0; +} + static int cmd_clone(int argc, const char **argv) { const char *branch = NULL; @@ -688,6 +717,39 @@ static int cmd_unregister(int argc, const char **argv) return unregister_dir(); } +static int cmd_delete(int argc, const char **argv) +{ + char *cwd = xgetcwd(); + struct option options[] = { + OPT_END(), + }; + const char * const usage[] = { + N_("scalar delete "), + NULL + }; + struct strbuf enlistment = STRBUF_INIT; + int res = 0; + + argc = parse_options(argc, argv, NULL, options, + usage, 0); + + if (argc != 1) + usage_with_options(usage, options); + + setup_enlistment_directory(argc, argv, usage, options, &enlistment); + + if (dir_inside_of(cwd, enlistment.buf) >= 0) + res = error(_("refusing to delete current working directory")); + else { + close_object_store(the_repository->objects); + res = delete_enlistment(&enlistment); + } + strbuf_release(&enlistment); + free(cwd); + + return res; +} + static struct { const char *name; int (*fn)(int, const char **); @@ -698,6 +760,7 @@ static struct { { "unregister", cmd_unregister }, { "run", cmd_run }, { "reconfigure", cmd_reconfigure }, + { "delete", cmd_delete }, { NULL, NULL}, }; diff --git a/contrib/scalar/scalar.txt b/contrib/scalar/scalar.txt index 737cf563c1a..f416d637289 100644 --- a/contrib/scalar/scalar.txt +++ b/contrib/scalar/scalar.txt @@ -14,6 +14,7 @@ scalar register [] scalar unregister [] scalar run ( all | config | commit-graph | fetch | loose-objects | pack-files ) [] scalar reconfigure [ --all | ] +scalar delete DESCRIPTION ----------- @@ -128,6 +129,13 @@ reconfigure the enlistment. With the `--all` option, all enlistments currently registered with Scalar will be reconfigured. Use this option after each Scalar upgrade. +Delete +~~~~~~ + +delete :: + This subcommand lets you delete an existing Scalar enlistment from your + local file system, unregistering the repository. + SEE ALSO -------- linkgit:git-clone[1], linkgit:git-maintenance[1]. diff --git a/contrib/scalar/t/t9099-scalar.sh b/contrib/scalar/t/t9099-scalar.sh index 58af546fd84..2e1502ad45e 100755 --- a/contrib/scalar/t/t9099-scalar.sh +++ b/contrib/scalar/t/t9099-scalar.sh @@ -76,4 +76,13 @@ test_expect_success 'scalar reconfigure' ' test true = "$(git -C one/src config core.preloadIndex)" ' +test_expect_success 'scalar delete without enlistment shows a usage' ' + test_expect_code 129 scalar delete +' + +test_expect_success 'scalar delete with enlistment' ' + scalar delete cloned && + test_path_is_missing cloned +' + test_done