From: "Chris Poucet via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: "Jerry Zhang" <jerry@skydio.com>,
"Phillip Wood" <phillip.wood123@gmail.com>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Chris Poucet" <poucet@google.com>,
"Christophe Poucet" <christophe.poucet@gmail.com>,
"Chris Poucet" <poucet@google.com>
Subject: [PATCH v2 08/10] evolve: add delete command
Date: Wed, 05 Oct 2022 14:59:15 +0000 [thread overview]
Message-ID: <a0669fa63a1c3887798d3f8461dc5bd38704c0a0.1664981958.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1356.v2.git.1664981957.gitgitgadget@gmail.com>
From: Chris Poucet <poucet@google.com>
The delete command allows a user to delete one or more changes.
This effectively deletes the corresponding /refs/metas/foo ref.
Signed-off-by: Chris Poucet <poucet@google.com>
---
builtin/change.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+)
diff --git a/builtin/change.c b/builtin/change.c
index e4e8e15b768..12ea5f68197 100644
--- a/builtin/change.c
+++ b/builtin/change.c
@@ -3,11 +3,13 @@
#include "parse-options.h"
#include "metacommit.h"
#include "config.h"
+#include "refs.h"
static const char * const builtin_change_usage[] = {
N_("git change list [<pattern>...]"),
N_("git change update [--force] [--replace <treeish>...] "
"[--origin <treeish>...] [--content <newtreeish>]"),
+ N_("git change delete <change-name>..."),
NULL
};
@@ -22,6 +24,11 @@ static const char * const builtin_update_usage[] = {
NULL
};
+static const char * const builtin_delete_usage[] = {
+ N_("git change delete <change-name>..."),
+ NULL
+};
+
static int change_list(int argc, const char **argv, const char* prefix)
{
struct option options[] = {
@@ -228,6 +235,75 @@ static int change_update(int argc, const char **argv, const char* prefix)
return result;
}
+typedef int (*each_change_name_fn)(const char *name, const char *ref,
+ const struct object_id *oid, void *cb_data);
+
+static int for_each_change_name(const char **argv, each_change_name_fn fn,
+ void *cb_data)
+{
+ const char **p;
+ struct strbuf ref = STRBUF_INIT;
+ int had_error = 0;
+ struct object_id oid;
+
+ for (p = argv; *p; p++) {
+ strbuf_reset(&ref);
+ /* Convenience functionality to avoid having to type `metas/` */
+ if (strncmp("metas/", *p, 5)) {
+ strbuf_addf(&ref, "refs/metas/%s", *p);
+ } else {
+ strbuf_addf(&ref, "refs/%s", *p);
+ }
+ if (read_ref(ref.buf, &oid)) {
+ error(_("change '%s' not found."), *p);
+ had_error = 1;
+ continue;
+ }
+ if (fn(*p, ref.buf, &oid, cb_data))
+ had_error = 1;
+ }
+ strbuf_release(&ref);
+ return had_error;
+}
+
+static int collect_changes(const char *name, const char *ref,
+ const struct object_id *oid, void *cb_data)
+{
+ struct string_list *ref_list = cb_data;
+
+ string_list_append(ref_list, ref);
+ ref_list->items[ref_list->nr - 1].util = oiddup(oid);
+ return 0;
+}
+
+static int change_delete(int argc, const char **argv, const char* prefix) {
+ int result = 0;
+ struct string_list refs_to_delete = STRING_LIST_INIT_DUP;
+ struct string_list_item *item;
+ struct option options[] = {
+ OPT_END()
+ };
+
+ argc = parse_options(argc, argv, prefix, options, builtin_delete_usage, 0);
+
+ result = for_each_change_name(argv, collect_changes, (void *)&refs_to_delete);
+ if (delete_refs(NULL, &refs_to_delete, REF_NO_DEREF))
+ result = 1;
+
+ for_each_string_list_item(item, &refs_to_delete) {
+ const char *name = item->string;
+ struct object_id *oid = item->util;
+ if (!ref_exists(name))
+ printf(_("Deleted change '%s' (was %s)\n"),
+ item->string + 5,
+ find_unique_abbrev(oid, DEFAULT_ABBREV));
+
+ free(oid);
+ }
+ string_list_clear(&refs_to_delete, 0);
+ return result;
+}
+
int cmd_change(int argc, const char **argv, const char *prefix)
{
parse_opt_subcommand_fn *fn = NULL;
@@ -235,6 +311,7 @@ int cmd_change(int argc, const char **argv, const char *prefix)
struct option options[] = {
OPT_SUBCOMMAND("list", &fn, change_list),
OPT_SUBCOMMAND("update", &fn, change_update),
+ OPT_SUBCOMMAND("delete", &fn, change_delete),
OPT_END()
};
--
gitgitgadget
next prev parent reply other threads:[~2022-10-05 15:01 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-23 18:55 [PATCH 00/10] Add the Git Change command Christophe Poucet via GitGitGadget
2022-09-23 18:55 ` [PATCH 01/10] technical doc: add a design doc for the evolve command Stefan Xenos via GitGitGadget
2022-09-23 19:59 ` Jerry Zhang
2022-09-28 21:26 ` Junio C Hamano
2022-09-28 22:20 ` Junio C Hamano
2022-09-29 9:17 ` Phillip Wood
2022-09-29 19:57 ` Jonathan Tan
2022-09-23 18:55 ` [PATCH 02/10] sha1-array: implement oid_array_readonly_contains Chris Poucet via GitGitGadget
2022-09-26 13:08 ` Phillip Wood
2022-09-23 18:55 ` [PATCH 03/10] ref-filter: add the metas namespace to ref-filter Chris Poucet via GitGitGadget
2022-09-26 13:13 ` Phillip Wood
2022-10-04 9:50 ` Chris P
2022-09-23 18:55 ` [PATCH 04/10] evolve: add support for parsing metacommits Stefan Xenos via GitGitGadget
2022-09-26 13:27 ` Phillip Wood
2022-10-04 11:21 ` Chris P
2022-10-04 14:10 ` Phillip Wood
2022-09-23 18:55 ` [PATCH 05/10] evolve: add the change-table structure Stefan Xenos via GitGitGadget
2022-09-27 13:27 ` Phillip Wood
2022-09-27 13:50 ` Ævar Arnfjörð Bjarmason
2022-09-27 14:13 ` Phillip Wood
2022-09-27 15:28 ` Ævar Arnfjörð Bjarmason
2022-09-28 14:33 ` Phillip Wood
2022-09-28 15:14 ` Ævar Arnfjörð Bjarmason
2022-09-28 15:59 ` Junio C Hamano
2022-09-27 14:18 ` Phillip Wood
2022-10-04 14:48 ` Chris P
2022-09-23 18:55 ` [PATCH 06/10] evolve: add support for writing metacommits Stefan Xenos via GitGitGadget
2022-09-28 14:27 ` Phillip Wood
2022-10-05 9:40 ` Chris P
2022-10-05 11:09 ` Phillip Wood
2022-09-23 18:55 ` [PATCH 07/10] evolve: implement the git change command Stefan Xenos via GitGitGadget
2022-09-25 9:10 ` Phillip Wood
2022-09-26 8:23 ` Ævar Arnfjörð Bjarmason
2022-09-26 8:25 ` Ævar Arnfjörð Bjarmason
2022-10-05 12:30 ` Chris P
2022-09-23 18:55 ` [PATCH 08/10] evolve: add the git change list command Stefan Xenos via GitGitGadget
2022-09-23 18:55 ` [PATCH 09/10] evolve: add delete command Chris Poucet via GitGitGadget
2022-09-26 8:38 ` Ævar Arnfjörð Bjarmason
2022-09-26 9:10 ` Chris Poucet
2022-09-23 18:55 ` [PATCH 10/10] evolve: add documentation for `git change` Chris Poucet via GitGitGadget
2022-09-25 8:41 ` Phillip Wood
2022-09-25 8:39 ` [PATCH 00/10] Add the Git Change command Phillip Wood
2022-10-04 9:33 ` Chris P
2022-10-04 14:24 ` Phillip Wood
2022-10-04 15:19 ` Chris P
2022-10-04 15:55 ` Chris P
2022-10-04 16:00 ` Phillip Wood
2022-10-04 15:57 ` Phillip Wood
2022-10-05 14:59 ` [PATCH v2 00/10] RFC: Git Evolve / Change Christophe Poucet via GitGitGadget
2022-10-05 14:59 ` [PATCH v2 01/10] technical doc: add a design doc for the evolve command Stefan Xenos via GitGitGadget
2022-10-05 15:16 ` Chris Poucet
2022-10-06 20:53 ` Glen Choo
2022-10-10 19:35 ` Victoria Dye
2022-10-11 8:59 ` Phillip Wood
2022-10-11 16:59 ` Victoria Dye
2022-10-12 19:19 ` Phillip Wood
2022-10-05 14:59 ` [PATCH v2 02/10] sha1-array: implement oid_array_readonly_contains Chris Poucet via GitGitGadget
2022-10-05 14:59 ` [PATCH v2 03/10] ref-filter: add the metas namespace to ref-filter Chris Poucet via GitGitGadget
2022-10-05 14:59 ` [PATCH v2 04/10] evolve: add support for parsing metacommits Stefan Xenos via GitGitGadget
2022-10-05 14:59 ` [PATCH v2 05/10] evolve: add the change-table structure Stefan Xenos via GitGitGadget
2022-10-05 14:59 ` [PATCH v2 06/10] evolve: add support for writing metacommits Stefan Xenos via GitGitGadget
2022-10-05 14:59 ` [PATCH v2 07/10] evolve: implement the git change command Stefan Xenos via GitGitGadget
2022-10-05 14:59 ` Chris Poucet via GitGitGadget [this message]
2022-10-05 14:59 ` [PATCH v2 09/10] evolve: add documentation for `git change` Chris Poucet via GitGitGadget
2022-10-05 14:59 ` [PATCH v2 10/10] evolve: add tests for the git-change command Chris Poucet via GitGitGadget
2022-10-10 9:23 ` [PATCH v2 00/10] RFC: Git Evolve / Change Phillip Wood
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a0669fa63a1c3887798d3f8461dc5bd38704c0a0.1664981958.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=avarab@gmail.com \
--cc=christophe.poucet@gmail.com \
--cc=git@vger.kernel.org \
--cc=jerry@skydio.com \
--cc=phillip.wood123@gmail.com \
--cc=poucet@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).