mirror of
https://github.com/git/git.git
synced 2026-01-12 05:43:12 +09:00
refspec: relocate refname_matches_negative_refspec_item
Move the functions `refname_matches_negative_refspec_item()`, `refspec_match()`, and `match_name_with_pattern()` from `remote.c` to `refspec.c`. These functions focus on refspec matching, so placing them in `refspec.c` aligns with the separation of concerns. Keep refspec-related logic in `refspec.c` and remote-specific logic in `remote.c` for better code organization. Signed-off-by: Meet Soni <meetsoni3017@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e4f6ab0085
commit
230d022fe3
48
refspec.c
48
refspec.c
@ -276,3 +276,51 @@ void refspec_ref_prefixes(const struct refspec *rs,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 refname_matches_negative_refspec_item(const char *refname, struct refspec *rs)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < rs->nr; i++) {
|
||||
if (rs->items[i].negative && refspec_match(&rs->items[i], refname))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -71,4 +71,13 @@ struct strvec;
|
||||
void refspec_ref_prefixes(const struct refspec *rs,
|
||||
struct strvec *ref_prefixes);
|
||||
|
||||
int refname_matches_negative_refspec_item(const char *refname, struct refspec *rs);
|
||||
|
||||
/*
|
||||
* Checks whether a name matches a pattern and optionally generates a result.
|
||||
* Returns 1 if the name matches the pattern, 0 otherwise.
|
||||
*/
|
||||
int match_name_with_pattern(const char *key, const char *name,
|
||||
const char *value, char **result);
|
||||
|
||||
#endif /* REFSPEC_H */
|
||||
|
||||
48
remote.c
48
remote.c
@ -907,54 +907,6 @@ 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 refname_matches_negative_refspec_item(const char *refname, struct refspec *rs)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < rs->nr; i++) {
|
||||
if (rs->items[i].negative && refspec_match(&rs->items[i], refname))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct ref *apply_negative_refspecs(struct ref *ref_map, struct refspec *rs)
|
||||
{
|
||||
struct ref **tail;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user