aboutsummaryrefslogtreecommitdiffstats
path: root/remote.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2025-02-12 10:08:54 -0800
committerJunio C Hamano <gitster@pobox.com>2025-02-12 10:08:54 -0800
commit998c5f0c7554f511bafff587292f986a42fa2944 (patch)
tree09b67e85355f25fc4ccef877c53afd19ffb8ca77 /remote.c
parent791677a5ddce9730a1203188938406ae030ed170 (diff)
parentd549b6c9ff44d3ccb32b9bfe1816d3cfb1d7052a (diff)
downloadgit-998c5f0c7554f511bafff587292f986a42fa2944.tar.gz
Merge branch 'ms/refspec-cleanup'
Code clean-up. cf. <Z6G-toOJjMmK8iJG@pks.im> * ms/refspec-cleanup: refspec: relocate apply_refspecs and related funtions refspec: relocate matching related functions remote: rename query_refspecs functions refspec: relocate refname_matches_negative_refspec_item remote: rename function omit_name_by_refspec
Diffstat (limited to 'remote.c')
-rw-r--r--remote.c205
1 files changed, 2 insertions, 203 deletions
diff --git a/remote.c b/remote.c
index 1779f0e7bb..4bef6a1398 100644
--- a/remote.c
+++ b/remote.c
@@ -933,210 +933,9 @@ void ref_push_report_free(struct ref_push_report *report)
}
}
-static int match_name_with_pattern(const char *key, const char *name,
- const char *value, char **result)
-{
- const char *kstar = strchr(key, '*');
- size_t klen;
- size_t ksuffixlen;
- size_t namelen;
- int ret;
- if (!kstar)
- die(_("key '%s' of pattern had no '*'"), key);
- klen = kstar - key;
- ksuffixlen = strlen(kstar + 1);
- namelen = strlen(name);
- ret = !strncmp(name, key, klen) && namelen >= klen + ksuffixlen &&
- !memcmp(name + namelen - ksuffixlen, kstar + 1, ksuffixlen);
- if (ret && value) {
- struct strbuf sb = STRBUF_INIT;
- const char *vstar = strchr(value, '*');
- if (!vstar)
- die(_("value '%s' of pattern has no '*'"), value);
- strbuf_add(&sb, value, vstar - value);
- strbuf_add(&sb, name + klen, namelen - klen - ksuffixlen);
- strbuf_addstr(&sb, vstar + 1);
- *result = strbuf_detach(&sb, NULL);
- }
- return ret;
-}
-
-static int refspec_match(const struct refspec_item *refspec,
- const char *name)
-{
- if (refspec->pattern)
- return match_name_with_pattern(refspec->src, name, NULL, NULL);
-
- return !strcmp(refspec->src, name);
-}
-
-int omit_name_by_refspec(const char *name, struct refspec *rs)
-{
- int i;
-
- for (i = 0; i < rs->nr; i++) {
- if (rs->items[i].negative && refspec_match(&rs->items[i], name))
- return 1;
- }
- return 0;
-}
-
-struct ref *apply_negative_refspecs(struct ref *ref_map, struct refspec *rs)
-{
- struct ref **tail;
-
- for (tail = &ref_map; *tail; ) {
- struct ref *ref = *tail;
-
- if (omit_name_by_refspec(ref->name, rs)) {
- *tail = ref->next;
- free(ref->peer_ref);
- free(ref);
- } else
- tail = &ref->next;
- }
-
- return ref_map;
-}
-
-static int query_matches_negative_refspec(struct refspec *rs, struct refspec_item *query)
-{
- int i, matched_negative = 0;
- int find_src = !query->src;
- struct string_list reversed = STRING_LIST_INIT_DUP;
- const char *needle = find_src ? query->dst : query->src;
-
- /*
- * Check whether the queried ref matches any negative refpsec. If so,
- * then we should ultimately treat this as not matching the query at
- * all.
- *
- * Note that negative refspecs always match the source, but the query
- * item uses the destination. To handle this, we apply pattern
- * refspecs in reverse to figure out if the query source matches any
- * of the negative refspecs.
- *
- * The first loop finds and expands all positive refspecs
- * matched by the queried ref.
- *
- * The second loop checks if any of the results of the first loop
- * match any negative refspec.
- */
- for (i = 0; i < rs->nr; i++) {
- struct refspec_item *refspec = &rs->items[i];
- char *expn_name;
-
- if (refspec->negative)
- continue;
-
- /* Note the reversal of src and dst */
- if (refspec->pattern) {
- const char *key = refspec->dst ? refspec->dst : refspec->src;
- const char *value = refspec->src;
-
- if (match_name_with_pattern(key, needle, value, &expn_name))
- string_list_append_nodup(&reversed, expn_name);
- } else if (refspec->matching) {
- /* For the special matching refspec, any query should match */
- string_list_append(&reversed, needle);
- } else if (!refspec->src) {
- BUG("refspec->src should not be null here");
- } else if (!strcmp(needle, refspec->src)) {
- string_list_append(&reversed, refspec->src);
- }
- }
-
- for (i = 0; !matched_negative && i < reversed.nr; i++) {
- if (omit_name_by_refspec(reversed.items[i].string, rs))
- matched_negative = 1;
- }
-
- string_list_clear(&reversed, 0);
-
- return matched_negative;
-}
-
-static void query_refspecs_multiple(struct refspec *rs,
- struct refspec_item *query,
- struct string_list *results)
-{
- int i;
- int find_src = !query->src;
-
- if (find_src && !query->dst)
- BUG("query_refspecs_multiple: need either src or dst");
-
- if (query_matches_negative_refspec(rs, query))
- return;
-
- for (i = 0; i < rs->nr; i++) {
- struct refspec_item *refspec = &rs->items[i];
- const char *key = find_src ? refspec->dst : refspec->src;
- const char *value = find_src ? refspec->src : refspec->dst;
- const char *needle = find_src ? query->dst : query->src;
- char **result = find_src ? &query->src : &query->dst;
-
- if (!refspec->dst || refspec->negative)
- continue;
- if (refspec->pattern) {
- if (match_name_with_pattern(key, needle, value, result))
- string_list_append_nodup(results, *result);
- } else if (!strcmp(needle, key)) {
- string_list_append(results, value);
- }
- }
-}
-
-int query_refspecs(struct refspec *rs, struct refspec_item *query)
-{
- int i;
- int find_src = !query->src;
- const char *needle = find_src ? query->dst : query->src;
- char **result = find_src ? &query->src : &query->dst;
-
- if (find_src && !query->dst)
- BUG("query_refspecs: need either src or dst");
-
- if (query_matches_negative_refspec(rs, query))
- return -1;
-
- for (i = 0; i < rs->nr; i++) {
- struct refspec_item *refspec = &rs->items[i];
- const char *key = find_src ? refspec->dst : refspec->src;
- const char *value = find_src ? refspec->src : refspec->dst;
-
- if (!refspec->dst || refspec->negative)
- continue;
- if (refspec->pattern) {
- if (match_name_with_pattern(key, needle, value, result)) {
- query->force = refspec->force;
- return 0;
- }
- } else if (!strcmp(needle, key)) {
- *result = xstrdup(value);
- query->force = refspec->force;
- return 0;
- }
- }
- return -1;
-}
-
-char *apply_refspecs(struct refspec *rs, const char *name)
-{
- struct refspec_item query;
-
- memset(&query, 0, sizeof(struct refspec_item));
- query.src = (char *)name;
-
- if (query_refspecs(rs, &query))
- return NULL;
-
- return query.dst;
-}
-
int remote_find_tracking(struct remote *remote, struct refspec_item *refspec)
{
- return query_refspecs(&remote->fetch, refspec);
+ return refspec_find_match(&remote->fetch, refspec);
}
static struct ref *alloc_ref_with_prefix(const char *prefix, size_t prefixlen,
@@ -2561,7 +2360,7 @@ static int get_stale_heads_cb(const char *refname, const char *referent UNUSED,
memset(&query, 0, sizeof(struct refspec_item));
query.dst = (char *)refname;
- query_refspecs_multiple(info->rs, &query, &matches);
+ refspec_find_all_matches(info->rs, &query, &matches);
if (matches.nr == 0)
goto clean_exit; /* No matches */