Miscellaneous const changes and utilities
The list of remote refs in struct transport should be const, because builtin-fetch will get confused if it changes. The url in git_connect should be const (and work on a copy) instead of requiring the caller to copy it. match_refs doesn't modify the refspecs it gets. get_fetch_map and get_remote_ref don't change the list they get. Allow transport get_refs_list methods to modify the struct transport. Add a function to copy a list of refs, when a function needs a mutable copy of a const list. Add a function to check the type of a ref, as per the code in connect.c Signed-off-by: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e3d6d56f1c
commit
4577370e9b
@ -29,7 +29,7 @@ static void unlock_pack_on_signal(int signo)
|
||||
}
|
||||
|
||||
static void add_merge_config(struct ref **head,
|
||||
struct ref *remote_refs,
|
||||
const struct ref *remote_refs,
|
||||
struct branch *branch,
|
||||
struct ref ***tail)
|
||||
{
|
||||
@ -77,7 +77,7 @@ static struct ref *get_ref_map(struct transport *transport,
|
||||
struct ref *ref_map = NULL;
|
||||
struct ref **tail = &ref_map;
|
||||
|
||||
struct ref *remote_refs = transport_get_remote_refs(transport);
|
||||
const struct ref *remote_refs = transport_get_remote_refs(transport);
|
||||
|
||||
if (ref_count || tags) {
|
||||
for (i = 0; i < ref_count; i++) {
|
||||
@ -345,12 +345,12 @@ static struct ref *find_non_local_tags(struct transport *transport,
|
||||
struct path_list new_refs = { NULL, 0, 0, 1 };
|
||||
char *ref_name;
|
||||
int ref_name_len;
|
||||
unsigned char *ref_sha1;
|
||||
struct ref *tag_ref;
|
||||
const unsigned char *ref_sha1;
|
||||
const struct ref *tag_ref;
|
||||
struct ref *rm = NULL;
|
||||
struct ref *ref_map = NULL;
|
||||
struct ref **tail = &ref_map;
|
||||
struct ref *ref;
|
||||
const struct ref *ref;
|
||||
|
||||
for_each_ref(add_existing, &existing_refs);
|
||||
for (ref = transport_get_remote_refs(transport); ref; ref = ref->next) {
|
||||
|
2
cache.h
2
cache.h
@ -503,7 +503,7 @@ struct ref {
|
||||
#define REF_TAGS (1u << 2)
|
||||
|
||||
#define CONNECT_VERBOSE (1u << 0)
|
||||
extern struct child_process *git_connect(int fd[2], char *url, const char *prog, int flags);
|
||||
extern struct child_process *git_connect(int fd[2], const char *url, const char *prog, int flags);
|
||||
extern int finish_connect(struct child_process *conn);
|
||||
extern int path_match(const char *path, int nr, char **match);
|
||||
extern int get_ack(int fd, unsigned char *result_sha1);
|
||||
|
10
connect.c
10
connect.c
@ -36,6 +36,11 @@ static int check_ref(const char *name, int len, unsigned int flags)
|
||||
return !(flags & ~REF_NORMAL);
|
||||
}
|
||||
|
||||
int check_ref_type(const struct ref *ref, int flags)
|
||||
{
|
||||
return check_ref(ref->name, strlen(ref->name), flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* Read all the refs from the other end
|
||||
*/
|
||||
@ -476,9 +481,10 @@ char *get_port(char *host)
|
||||
*
|
||||
* If it returns, the connect is successful; it just dies on errors.
|
||||
*/
|
||||
struct child_process *git_connect(int fd[2], char *url,
|
||||
struct child_process *git_connect(int fd[2], const char *url_orig,
|
||||
const char *prog, int flags)
|
||||
{
|
||||
char *url = xstrdup(url_orig);
|
||||
char *host, *path = url;
|
||||
char *end;
|
||||
int c;
|
||||
@ -568,6 +574,7 @@ struct child_process *git_connect(int fd[2], char *url,
|
||||
prog, path, 0,
|
||||
target_host, 0);
|
||||
free(target_host);
|
||||
free(url);
|
||||
if (free_path)
|
||||
free(path);
|
||||
return NULL;
|
||||
@ -619,6 +626,7 @@ struct child_process *git_connect(int fd[2], char *url,
|
||||
fd[0] = conn->out; /* read from child's stdout */
|
||||
fd[1] = conn->in; /* write to child's stdin */
|
||||
strbuf_release(&cmd);
|
||||
free(url);
|
||||
if (free_path)
|
||||
free(path);
|
||||
return conn;
|
||||
|
@ -2389,7 +2389,7 @@ int main(int argc, char **argv)
|
||||
if (!remote_tail)
|
||||
remote_tail = &remote_refs;
|
||||
if (match_refs(local_refs, remote_refs, &remote_tail,
|
||||
nr_refspec, refspec, push_all))
|
||||
nr_refspec, (const char **) refspec, push_all))
|
||||
return -1;
|
||||
if (!remote_refs) {
|
||||
fprintf(stderr, "No refs in common and none specified; doing nothing.\n");
|
||||
|
32
remote.c
32
remote.c
@ -485,7 +485,7 @@ struct ref *alloc_ref(unsigned namelen)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct ref *copy_ref(struct ref *ref)
|
||||
static struct ref *copy_ref(const struct ref *ref)
|
||||
{
|
||||
struct ref *ret = xmalloc(sizeof(struct ref) + strlen(ref->name) + 1);
|
||||
memcpy(ret, ref, sizeof(struct ref) + strlen(ref->name) + 1);
|
||||
@ -493,6 +493,18 @@ static struct ref *copy_ref(struct ref *ref)
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct ref *copy_ref_list(const struct ref *ref)
|
||||
{
|
||||
struct ref *ret = NULL;
|
||||
struct ref **tail = &ret;
|
||||
while (ref) {
|
||||
*tail = copy_ref(ref);
|
||||
ref = ref->next;
|
||||
tail = &((*tail)->next);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void free_refs(struct ref *ref)
|
||||
{
|
||||
struct ref *next;
|
||||
@ -710,7 +722,7 @@ static const struct refspec *check_pattern_match(const struct refspec *rs,
|
||||
* without thinking.
|
||||
*/
|
||||
int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,
|
||||
int nr_refspec, char **refspec, int all)
|
||||
int nr_refspec, const char **refspec, int all)
|
||||
{
|
||||
struct refspec *rs =
|
||||
parse_ref_spec(nr_refspec, (const char **) refspec);
|
||||
@ -810,10 +822,10 @@ int branch_merge_matches(struct branch *branch,
|
||||
return ref_matches_abbrev(branch->merge[i]->src, refname);
|
||||
}
|
||||
|
||||
static struct ref *get_expanded_map(struct ref *remote_refs,
|
||||
static struct ref *get_expanded_map(const struct ref *remote_refs,
|
||||
const struct refspec *refspec)
|
||||
{
|
||||
struct ref *ref;
|
||||
const struct ref *ref;
|
||||
struct ref *ret = NULL;
|
||||
struct ref **tail = &ret;
|
||||
|
||||
@ -824,7 +836,7 @@ static struct ref *get_expanded_map(struct ref *remote_refs,
|
||||
if (strchr(ref->name, '^'))
|
||||
continue; /* a dereference item */
|
||||
if (!prefixcmp(ref->name, refspec->src)) {
|
||||
char *match;
|
||||
const char *match;
|
||||
struct ref *cpy = copy_ref(ref);
|
||||
match = ref->name + remote_prefix_len;
|
||||
|
||||
@ -842,9 +854,9 @@ static struct ref *get_expanded_map(struct ref *remote_refs,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct ref *find_ref_by_name_abbrev(struct ref *refs, const char *name)
|
||||
static const struct ref *find_ref_by_name_abbrev(const struct ref *refs, const char *name)
|
||||
{
|
||||
struct ref *ref;
|
||||
const struct ref *ref;
|
||||
for (ref = refs; ref; ref = ref->next) {
|
||||
if (ref_matches_abbrev(name, ref->name))
|
||||
return ref;
|
||||
@ -852,9 +864,9 @@ static struct ref *find_ref_by_name_abbrev(struct ref *refs, const char *name)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct ref *get_remote_ref(struct ref *remote_refs, const char *name)
|
||||
struct ref *get_remote_ref(const struct ref *remote_refs, const char *name)
|
||||
{
|
||||
struct ref *ref = find_ref_by_name_abbrev(remote_refs, name);
|
||||
const struct ref *ref = find_ref_by_name_abbrev(remote_refs, name);
|
||||
|
||||
if (!ref)
|
||||
return NULL;
|
||||
@ -887,7 +899,7 @@ static struct ref *get_local_ref(const char *name)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int get_fetch_map(struct ref *remote_refs,
|
||||
int get_fetch_map(const struct ref *remote_refs,
|
||||
const struct refspec *refspec,
|
||||
struct ref ***tail,
|
||||
int missing_ok)
|
||||
|
10
remote.h
10
remote.h
@ -44,6 +44,10 @@ struct refspec {
|
||||
|
||||
struct ref *alloc_ref(unsigned namelen);
|
||||
|
||||
struct ref *copy_ref_list(const struct ref *ref);
|
||||
|
||||
int check_ref_type(const struct ref *ref, int flags);
|
||||
|
||||
/*
|
||||
* Frees the entire list and peers of elements.
|
||||
*/
|
||||
@ -57,7 +61,7 @@ void ref_remove_duplicates(struct ref *ref_map);
|
||||
struct refspec *parse_ref_spec(int nr_refspec, const char **refspec);
|
||||
|
||||
int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,
|
||||
int nr_refspec, char **refspec, int all);
|
||||
int nr_refspec, const char **refspec, int all);
|
||||
|
||||
/*
|
||||
* Given a list of the remote refs and the specification of things to
|
||||
@ -71,10 +75,10 @@ int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,
|
||||
* missing_ok is usually false, but when we are adding branch.$name.merge
|
||||
* it is Ok if the branch is not at the remote anymore.
|
||||
*/
|
||||
int get_fetch_map(struct ref *remote_refs, const struct refspec *refspec,
|
||||
int get_fetch_map(const struct ref *remote_refs, const struct refspec *refspec,
|
||||
struct ref ***tail, int missing_ok);
|
||||
|
||||
struct ref *get_remote_ref(struct ref *remote_refs, const char *name);
|
||||
struct ref *get_remote_ref(const struct ref *remote_refs, const char *name);
|
||||
|
||||
/*
|
||||
* For the given remote, reads the refspec's src and sets the other fields.
|
||||
|
@ -207,7 +207,7 @@ static void update_tracking_ref(struct remote *remote, struct ref *ref)
|
||||
}
|
||||
}
|
||||
|
||||
static int send_pack(int in, int out, struct remote *remote, int nr_refspec, char **refspec)
|
||||
static int send_pack(int in, int out, struct remote *remote, int nr_refspec, const char **refspec)
|
||||
{
|
||||
struct ref *ref;
|
||||
int new_refs;
|
||||
@ -357,7 +357,7 @@ static int send_pack(int in, int out, struct remote *remote, int nr_refspec, cha
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void verify_remote_names(int nr_heads, char **heads)
|
||||
static void verify_remote_names(int nr_heads, const char **heads)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -382,7 +382,7 @@ int main(int argc, char **argv)
|
||||
{
|
||||
int i, nr_heads = 0;
|
||||
char *dest = NULL;
|
||||
char **heads = NULL;
|
||||
const char **heads = NULL;
|
||||
int fd[2], ret;
|
||||
struct child_process *conn;
|
||||
char *remote_name = NULL;
|
||||
@ -434,7 +434,7 @@ int main(int argc, char **argv)
|
||||
dest = arg;
|
||||
continue;
|
||||
}
|
||||
heads = argv;
|
||||
heads = (const char **) argv;
|
||||
nr_heads = argc - i;
|
||||
break;
|
||||
}
|
||||
|
10
transport.c
10
transport.c
@ -141,7 +141,7 @@ static void insert_packed_refs(const char *packed_refs, struct ref **list)
|
||||
}
|
||||
}
|
||||
|
||||
static struct ref *get_refs_via_rsync(const struct transport *transport)
|
||||
static struct ref *get_refs_via_rsync(struct transport *transport)
|
||||
{
|
||||
struct strbuf buf = STRBUF_INIT, temp_dir = STRBUF_INIT;
|
||||
struct ref dummy, *tail = &dummy;
|
||||
@ -427,7 +427,7 @@ static int missing__target(int code, int result)
|
||||
|
||||
#define missing_target(a) missing__target((a)->http_code, (a)->curl_result)
|
||||
|
||||
static struct ref *get_refs_via_curl(const struct transport *transport)
|
||||
static struct ref *get_refs_via_curl(struct transport *transport)
|
||||
{
|
||||
struct buffer buffer;
|
||||
char *data, *start, *mid;
|
||||
@ -524,7 +524,7 @@ struct bundle_transport_data {
|
||||
struct bundle_header header;
|
||||
};
|
||||
|
||||
static struct ref *get_refs_from_bundle(const struct transport *transport)
|
||||
static struct ref *get_refs_from_bundle(struct transport *transport)
|
||||
{
|
||||
struct bundle_transport_data *data = transport->data;
|
||||
struct ref *result = NULL;
|
||||
@ -596,7 +596,7 @@ static int set_git_option(struct transport *connection,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static struct ref *get_refs_via_connect(const struct transport *transport)
|
||||
static struct ref *get_refs_via_connect(struct transport *transport)
|
||||
{
|
||||
struct git_transport_data *data = transport->data;
|
||||
struct ref *refs;
|
||||
@ -781,7 +781,7 @@ int transport_push(struct transport *transport,
|
||||
return transport->push(transport, refspec_nr, refspec, flags);
|
||||
}
|
||||
|
||||
struct ref *transport_get_remote_refs(struct transport *transport)
|
||||
const struct ref *transport_get_remote_refs(struct transport *transport)
|
||||
{
|
||||
if (!transport->remote_refs)
|
||||
transport->remote_refs = transport->get_refs_list(transport);
|
||||
|
@ -8,7 +8,7 @@ struct transport {
|
||||
struct remote *remote;
|
||||
const char *url;
|
||||
void *data;
|
||||
struct ref *remote_refs;
|
||||
const struct ref *remote_refs;
|
||||
|
||||
/**
|
||||
* Returns 0 if successful, positive if the option is not
|
||||
@ -18,7 +18,7 @@ struct transport {
|
||||
int (*set_option)(struct transport *connection, const char *name,
|
||||
const char *value);
|
||||
|
||||
struct ref *(*get_refs_list)(const struct transport *transport);
|
||||
struct ref *(*get_refs_list)(struct transport *transport);
|
||||
int (*fetch)(struct transport *transport, int refs_nr, struct ref **refs);
|
||||
int (*push)(struct transport *connection, int refspec_nr, const char **refspec, int flags);
|
||||
|
||||
@ -61,7 +61,7 @@ int transport_set_option(struct transport *transport, const char *name,
|
||||
int transport_push(struct transport *connection,
|
||||
int refspec_nr, const char **refspec, int flags);
|
||||
|
||||
struct ref *transport_get_remote_refs(struct transport *transport);
|
||||
const struct ref *transport_get_remote_refs(struct transport *transport);
|
||||
|
||||
int transport_fetch_refs(struct transport *transport, struct ref *refs);
|
||||
void transport_unlock_pack(struct transport *transport);
|
||||
|
Loading…
Reference in New Issue
Block a user