{"thread":{"id":"15642","subject":"[PATCH 1/2] git remote: move part of prune() into prune_one()","startedAt":"2008-09-23T21:13:23Z","lastAt":"2008-09-23T21:13:25Z","messageCount":3,"participants":["Lars Hjemli"],"isPatch":true,"patchVersion":1,"patchTotal":2},"messages":[{"id":"91429","messageId":"1222204405-30454-1-git-send-email-hjemli@gmail.com","threadId":"15642","inReplyTo":null,"subject":"[PATCH 0/2] Teach `git remote` howto prune all remotes","fromName":"Lars Hjemli","fromEmail":"hjemli@gmail.com","sentAt":"2008-09-23T21:13:23Z","receivedAt":"2008-09-23T21:13:23Z","isPatch":true,"sender":{"key":"hjemli@gmail.com","avatar":null},"body":"Lars Hjemli (2):\n  git remote: split part of prune() into prune_one()\n  git remote: prune all remotes with `prune -a`\n\n Documentation/git-remote.txt |    4 +-\n builtin-remote.c             |   97 ++++++++++++++++++++++++++++-------------\n 2 files changed, 69 insertions(+), 32 deletions(-)\n"},{"id":"91427","messageId":"1222204405-30454-2-git-send-email-hjemli@gmail.com","threadId":"15642","inReplyTo":"1222204405-30454-1-git-send-email-hjemli@gmail.com","subject":"[PATCH 1/2] git remote: move part of prune() into prune_one()","fromName":"Lars Hjemli","fromEmail":"hjemli@gmail.com","sentAt":"2008-09-23T21:13:24Z","receivedAt":"2008-09-23T21:13:24Z","isPatch":true,"sender":{"key":"hjemli@gmail.com","avatar":null},"body":"The new function will be reused by prune_all() in the next patch.\n\nSigned-off-by: Lars Hjemli <hjemli@gmail.com>\n---\n builtin-remote.c |   67 +++++++++++++++++++++++++++++------------------------\n 1 files changed, 37 insertions(+), 30 deletions(-)\n\ndiff --git a/builtin-remote.c b/builtin-remote.c\nindex 4cb763f..626256e 100644\n--- a/builtin-remote.c\n+++ b/builtin-remote.c\n@@ -537,6 +537,41 @@ static int show(int argc, const char **argv)\n \treturn result;\n }\n\n+static int prune_one(const char *name, int dry_run)\n+{\n+\tstruct ref_states states;\n+\tint result = 0;\n+\tint i;\n+\n+\tmemset(&states, 0, sizeof(states));\n+\tget_remote_ref_states(name, &states, 1);\n+\n+\tif (states.stale.nr) {\n+\t\tprintf(\"Pruning %s\\n\", name);\n+\t\tprintf(\"URL: %s\\n\",\n+\t\t       states.remote->url_nr\n+\t\t       ? states.remote->url[0]\n+\t\t       : \"(no URL)\");\n+\t}\n+\n+\tfor (i = 0; i < states.stale.nr; i++) {\n+\t\tconst char *refname = states.stale.items[i].util;\n+\n+\t\tif (!dry_run)\n+\t\t\tresult |= delete_ref(refname, NULL);\n+\n+\t\tprintf(\" * [%s] %s\\n\", dry_run ? \"would prune\" : \"pruned\",\n+\t\t       abbrev_ref(refname, \"refs/remotes/\"));\n+\t}\n+\n+\t/* NEEDSWORK: free remote */\n+\tstring_list_clear(&states.new, 0);\n+\tstring_list_clear(&states.stale, 0);\n+\tstring_list_clear(&states.tracked, 0);\n+\n+\treturn result;\n+}\n+\n static int prune(int argc, const char **argv)\n {\n \tint dry_run = 0, result = 0;\n@@ -545,42 +580,14 @@ static int prune(int argc, const char **argv)\n \t\tOPT__DRY_RUN(&dry_run),\n \t\tOPT_END()\n \t};\n-\tstruct ref_states states;\n\n \targc = parse_options(argc, argv, options, builtin_remote_usage, 0);\n\n \tif (argc < 1)\n \t\tusage_with_options(builtin_remote_usage, options);\n\n-\tmemset(&states, 0, sizeof(states));\n-\tfor (; argc; argc--, argv++) {\n-\t\tint i;\n-\n-\t\tget_remote_ref_states(*argv, &states, 1);\n-\n-\t\tif (states.stale.nr) {\n-\t\t\tprintf(\"Pruning %s\\n\", *argv);\n-\t\t\tprintf(\"URL: %s\\n\",\n-\t\t\t       states.remote->url_nr\n-\t\t\t       ? states.remote->url[0]\n-\t\t\t       : \"(no URL)\");\n-\t\t}\n-\n-\t\tfor (i = 0; i < states.stale.nr; i++) {\n-\t\t\tconst char *refname = states.stale.items[i].util;\n-\n-\t\t\tif (!dry_run)\n-\t\t\t\tresult |= delete_ref(refname, NULL);\n-\n-\t\t\tprintf(\" * [%s] %s\\n\", dry_run ? \"would prune\" : \"pruned\",\n-\t\t\t       abbrev_ref(refname, \"refs/remotes/\"));\n-\t\t}\n-\n-\t\t/* NEEDSWORK: free remote */\n-\t\tstring_list_clear(&states.new, 0);\n-\t\tstring_list_clear(&states.stale, 0);\n-\t\tstring_list_clear(&states.tracked, 0);\n-\t}\n+\tfor (; argc; argc--, argv++)\n+\t\tresult |= prune_one(*argv, dry_run);\n\n \treturn result;\n }\n--\n1.6.0.2.309.gc1f46\n"},{"id":"91430","messageId":"1222204405-30454-3-git-send-email-hjemli@gmail.com","threadId":"15642","inReplyTo":"1222204405-30454-2-git-send-email-hjemli@gmail.com","subject":"[PATCH 2/2] git remote: prune all remotes with `prune -a`","fromName":"Lars Hjemli","fromEmail":"hjemli@gmail.com","sentAt":"2008-09-23T21:13:25Z","receivedAt":"2008-09-23T21:13:25Z","isPatch":true,"sender":{"key":"hjemli@gmail.com","avatar":null},"body":"This is handy when working with lots of remotes.\n\nSigned-off-by: Lars Hjemli <hjemli@gmail.com>\n---\n Documentation/git-remote.txt |    4 +++-\n builtin-remote.c             |   32 ++++++++++++++++++++++++++++++--\n 2 files changed, 33 insertions(+), 3 deletions(-)\n\ndiff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt\nindex bb99810..55c108e 100644\n--- a/Documentation/git-remote.txt\n+++ b/Documentation/git-remote.txt\n@@ -13,7 +13,7 @@ SYNOPSIS\n 'git remote add' [-t <branch>] [-m <master>] [-f] [--mirror] <name> <url>\n 'git remote rm' <name>\n 'git remote show' [-n] <name>\n-'git remote prune' [-n | --dry-run] <name>\n+'git remote prune' [-n | --dry-run] [-a | <name>]\n 'git remote update' [group]\n \n DESCRIPTION\n@@ -82,6 +82,8 @@ referenced by <name>, but are still locally available in\n +\n With `--dry-run` option, report what branches will be pruned, but do no\n actually prune them.\n++\n+With `-a` option, prune all remotes.\n \n 'update'::\n \ndiff --git a/builtin-remote.c b/builtin-remote.c\nindex 626256e..973637e 100644\n--- a/builtin-remote.c\n+++ b/builtin-remote.c\n@@ -572,20 +572,48 @@ static int prune_one(const char *name, int dry_run)\n \treturn result;\n }\n \n+struct prune_cbdata {\n+\tint result;\n+\tint dry_run;\n+};\n+\n+static int prune_all_cb(struct remote *remote, void *cbdata)\n+{\n+\tstruct prune_cbdata *cb = cbdata;\n+\n+\tcb->result |= prune_one(remote->name, cb->dry_run);\n+\treturn 0;\n+}\n+\n+static int prune_all(int dry_run)\n+{\n+\tint result;\n+\tstruct prune_cbdata cb;\n+\n+\tcb.result = 0;\n+\tcb.dry_run = dry_run;\n+\tresult = for_each_remote(prune_all_cb, &cb);\n+\treturn (result | cb.result);\n+}\n+\n static int prune(int argc, const char **argv)\n {\n-\tint dry_run = 0, result = 0;\n+\tint dry_run = 0, all = 0, result = 0;\n \tstruct option options[] = {\n \t\tOPT_GROUP(\"prune specific options\"),\n+\t\tOPT_BOOLEAN('a', NULL, &all, \"prune all remotes\"),\n \t\tOPT__DRY_RUN(&dry_run),\n \t\tOPT_END()\n \t};\n \n \targc = parse_options(argc, argv, options, builtin_remote_usage, 0);\n \n-\tif (argc < 1)\n+\tif (!argc == !all)\n \t\tusage_with_options(builtin_remote_usage, options);\n \n+\tif (all)\n+\t\treturn prune_all(dry_run);\n+\n \tfor (; argc; argc--, argv++)\n \t\tresult |= prune_one(*argv, dry_run);\n \n-- \n1.6.0.2.309.gc1f46\n"}]}