refspec: relocate apply_refspecs and related funtions

Move the functions `apply_refspecs()` and `apply_negative_refspecs()`
from `remote.c` to `refspec.c`. These functions focus on applying
refspecs, so centralizing them in `refspec.c` improves code organization
by keeping refspec-related logic in one place.

Signed-off-by: Meet Soni <meetsoni3017@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Meet Soni 2025-02-04 09:35:58 +05:30 committed by Junio C Hamano
parent 7b24a170d2
commit d549b6c9ff
4 changed files with 44 additions and 42 deletions

View File

@ -9,6 +9,7 @@
#include "strvec.h"
#include "refs.h"
#include "refspec.h"
#include "remote.h"
#include "strbuf.h"

/*
@ -447,3 +448,34 @@ int refspec_find_match(struct refspec *rs, struct refspec_item *query)
}
return -1;
}

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 (refname_matches_negative_refspec_item(ref->name, rs)) {
*tail = ref->next;
free(ref->peer_ref);
free(ref);
} else
tail = &ref->next;
}

return ref_map;
}

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 (refspec_find_match(rs, &query))
return NULL;

return query.dst;
}

View File

@ -96,4 +96,16 @@ void refspec_find_all_matches(struct refspec *rs,
struct refspec_item *query,
struct string_list *results);

/*
* Remove all entries in the input list which match any negative refspec in
* the refspec list.
*/
struct ref *apply_negative_refspecs(struct ref *ref_map, struct refspec *rs);

/*
* Search for a refspec that matches the given name and return the
* corresponding destination (dst) if a match is found, NULL otherwise.
*/
char *apply_refspecs(struct refspec *rs, const char *name);

#endif /* REFSPEC_H */

View File

@ -907,37 +907,6 @@ void ref_push_report_free(struct ref_push_report *report)
}
}

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 (refname_matches_negative_refspec_item(ref->name, rs)) {
*tail = ref->next;
free(ref->peer_ref);
free(ref);
} else
tail = &ref->next;
}

return ref_map;
}

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 (refspec_find_match(rs, &query))
return NULL;

return query.dst;
}

int remote_find_tracking(struct remote *remote, struct refspec_item *refspec)
{
return refspec_find_match(&remote->fetch, refspec);

View File

@ -261,17 +261,6 @@ int resolve_remote_symref(struct ref *ref, struct ref *list);
*/
struct ref *ref_remove_duplicates(struct ref *ref_map);

int refname_matches_negative_refspec_item(const char *refname, struct refspec *rs);

/*
* Remove all entries in the input list which match any negative refspec in
* the refspec list.
*/
struct ref *apply_negative_refspecs(struct ref *ref_map, struct refspec *rs);

int refspec_find_match(struct refspec *rs, struct refspec_item *query);
char *apply_refspecs(struct refspec *rs, const char *name);

int check_push_refs(struct ref *src, struct refspec *rs);
int match_push_refs(struct ref *src, struct ref **dst,
struct refspec *rs, int flags);