From: Jay Soffian Date: Fri, 06 Nov 2009 05:10:41 GMT Subject: [PATCH/RFC 3/3] builtin-fetch: add --prune option Message-ID: <1257484241-27219-4-git-send-email-jaysoffian@gmail.com> In-Reply-To: <1257484241-27219-3-git-send-email-jaysoffian@gmail.com> Teach fetch --prune, as an alternative to git remote prune. --- builtin-fetch.c | 22 +++++++++++++++++++++- 1 files changed, 21 insertions(+), 1 deletions(-) diff --git a/builtin-fetch.c b/builtin-fetch.c index 985b36b..e8a5b9b 100644 --- a/builtin-fetch.c +++ b/builtin-fetch.c @@ -23,7 +23,7 @@ enum { TAGS_SET = 2 }; -static int append, dry_run, force, keep, update_head_ok, verbosity; +static int append, dry_run, force, keep, prune, update_head_ok, verbosity; static int tags = TAGS_DEFAULT; static const char *depth; static const char *upload_pack; @@ -42,6 +42,8 @@ static struct option builtin_fetch_options[] = { "fetch all tags and associated objects", TAGS_SET), OPT_SET_INT('n', NULL, &tags, "do not fetch all tags (--no-tags)", TAGS_UNSET), + OPT_BOOLEAN('p', "prune", &prune, + "prune tracking branches no longer on remote"), OPT_BOOLEAN(0, "dry-run", &dry_run, "dry run"), OPT_BOOLEAN('k', "keep", &keep, "keep downloaded pack"), @@ -489,6 +491,22 @@ static int fetch_refs(struct transport *transport, struct ref *ref_map) return ret; } +static int prune_refs(struct transport *transport, struct ref *ref_map) +{ + int result = 0; + struct ref *ref, *stale_refs = get_stale_heads(transport->remote, ref_map); + for (ref = stale_refs; ref; ref = ref->next) { + if (!dry_run) + result |= delete_ref(ref->name, NULL, 0); + if (verbosity >= 0) + fprintf(stderr, " x %-*s %-*s -> %s\n", + SUMMARY_WIDTH, "[deleted]", + REFCOL_WIDTH, "(none)", prettify_refname(ref->name)); + } + free_refs(stale_refs); + return 0; +} + static int add_existing(const char *refname, const unsigned char *sha1, int flag, void *cbdata) { @@ -613,6 +631,8 @@ static int do_fetch(struct transport *transport, free_refs(ref_map); return 1; } + if (prune) + prune_refs(transport, ref_map); free_refs(ref_map); /* if neither --no-tags nor --tags was specified, do automated tag -- 1.6.4.2