diff options
| author | Junio C Hamano <gitster@pobox.com> | 2009-06-13 12:47:52 -0700 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2009-06-13 12:47:52 -0700 | 
| commit | 57c57a97e1b5b8607fa7c8fae8b0cf20706cc453 (patch) | |
| tree | 3cd9aa6b57a9fdee444a5ba8a192347a541dd7bb | |
| parent | 49c7e4643b27ff07463b1a8774fee25ef22a0d1c (diff) | |
| parent | 6d2bf96e550731499c73731e5623017d193f837f (diff) | |
| download | git-57c57a97e1b5b8607fa7c8fae8b0cf20706cc453.tar.gz | |
Merge branch 'cb/match_refs_internal_tail'
* cb/match_refs_internal_tail:
  match_refs: search ref list tail internally
| -rw-r--r-- | builtin-remote.c | 7 | ||||
| -rw-r--r-- | builtin-send-pack.c | 9 | ||||
| -rw-r--r-- | http-push.c | 11 | ||||
| -rw-r--r-- | remote.c | 17 | ||||
| -rw-r--r-- | remote.h | 2 | ||||
| -rw-r--r-- | transport.c | 6 | 
6 files changed, 23 insertions, 29 deletions
diff --git a/builtin-remote.c b/builtin-remote.c index d7ab6b2d5f..dfc0b9e706 100644 --- a/builtin-remote.c +++ b/builtin-remote.c @@ -295,17 +295,14 @@ static int get_push_ref_states(const struct ref *remote_refs,  	struct ref_states *states)  {  	struct remote *remote = states->remote; -	struct ref *ref, *local_refs, *push_map, **push_tail; +	struct ref *ref, *local_refs, *push_map;  	if (remote->mirror)  		return 0;  	local_refs = get_local_heads();  	push_map = copy_ref_list(remote_refs); -	push_tail = &push_map; -	while (*push_tail) -		push_tail = &((*push_tail)->next); -	match_refs(local_refs, push_map, &push_tail, remote->push_refspec_nr, +	match_refs(local_refs, &push_map, remote->push_refspec_nr,  		   remote->push_refspec, MATCH_REFS_NONE);  	states->push.strdup_strings = 1; diff --git a/builtin-send-pack.c b/builtin-send-pack.c index be3b0926de..c375a3dbde 100644 --- a/builtin-send-pack.c +++ b/builtin-send-pack.c @@ -473,7 +473,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)  	int fd[2];  	struct child_process *conn;  	struct extra_have_objects extra_have; -	struct ref *remote_refs, **remote_tail, *local_refs; +	struct ref *remote_refs, *local_refs;  	int ret;  	int send_all = 0;  	const char *receivepack = "git-receive-pack"; @@ -567,13 +567,8 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)  		flags |= MATCH_REFS_MIRROR;  	/* match them up */ -	remote_tail = &remote_refs; -	while (*remote_tail) -		remote_tail = &((*remote_tail)->next); -	if (match_refs(local_refs, remote_refs, &remote_tail, -		       nr_refspecs, refspecs, flags)) { +	if (match_refs(local_refs, &remote_refs, nr_refspecs, refspecs, flags))  		return -1; -	}  	ret = send_pack(&args, fd, conn, remote_refs, &extra_have); diff --git a/http-push.c b/http-push.c index 43e2dda2e1..a7e28e345f 100644 --- a/http-push.c +++ b/http-push.c @@ -1844,7 +1844,7 @@ static int update_remote(unsigned char *sha1, struct remote_lock *lock)  	return 1;  } -static struct ref *remote_refs, **remote_tail; +static struct ref *remote_refs;  static void one_remote_ref(char *refname)  { @@ -1874,13 +1874,12 @@ static void one_remote_ref(char *refname)  		}  	} -	*remote_tail = ref; -	remote_tail = &ref->next; +	ref->next = remote_refs; +	remote_refs = ref;  }  static void get_dav_remote_heads(void)  { -	remote_tail = &remote_refs;  	remote_ls("refs/", (PROCESS_FILES | PROCESS_DIRS | RECURSIVE), process_ls_ref, NULL);  } @@ -2300,9 +2299,7 @@ int main(int argc, char **argv)  	}  	/* match them up */ -	if (!remote_tail) -		remote_tail = &remote_refs; -	if (match_refs(local_refs, remote_refs, &remote_tail, +	if (match_refs(local_refs, &remote_refs,  		       nr_refspec, (const char **) refspec, push_all)) {  		rc = -1;  		goto cleanup; @@ -1085,12 +1085,20 @@ static const struct refspec *check_pattern_match(const struct refspec *rs,  		return NULL;  } +static struct ref **tail_ref(struct ref **head) +{ +	struct ref **tail = head; +	while (*tail) +		tail = &((*tail)->next); +	return tail; +} +  /*   * Note. This is used only by "push"; refspec matching rules for   * push and fetch are subtly different, so do not try to reuse it   * without thinking.   */ -int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail, +int match_refs(struct ref *src, struct ref **dst,  	       int nr_refspec, const char **refspec, int flags)  {  	struct refspec *rs; @@ -1098,13 +1106,14 @@ int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,  	int send_mirror = flags & MATCH_REFS_MIRROR;  	int errs;  	static const char *default_refspec[] = { ":", 0 }; +	struct ref **dst_tail = tail_ref(dst);  	if (!nr_refspec) {  		nr_refspec = 1;  		refspec = default_refspec;  	}  	rs = parse_push_refspec(nr_refspec, (const char **) refspec); -	errs = match_explicit_refs(src, dst, dst_tail, rs, nr_refspec); +	errs = match_explicit_refs(src, *dst, &dst_tail, rs, nr_refspec);  	/* pick the remainder */  	for ( ; src; src = src->next) { @@ -1134,7 +1143,7 @@ int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,  						     dst_side, &dst_name))  				die("Didn't think it matches any more");  		} -		dst_peer = find_ref_by_name(dst, dst_name); +		dst_peer = find_ref_by_name(*dst, dst_name);  		if (dst_peer) {  			if (dst_peer->peer_ref)  				/* We're already sending something to this ref. */ @@ -1150,7 +1159,7 @@ int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,  				goto free_name;  			/* Create a new one and link it */ -			dst_peer = make_linked_ref(dst_name, dst_tail); +			dst_peer = make_linked_ref(dst_name, &dst_tail);  			hashcpy(dst_peer->new_sha1, src->new_sha1);  		}  		dst_peer->peer_ref = copy_ref(src); @@ -85,7 +85,7 @@ void ref_remove_duplicates(struct ref *ref_map);  int valid_fetch_refspec(const char *refspec);  struct refspec *parse_fetch_refspec(int nr_refspec, const char **refspec); -int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail, +int match_refs(struct ref *src, struct ref **dst,  	       int nr_refspec, const char **refspec, int all);  /* diff --git a/transport.c b/transport.c index 17891d5149..d8a2392a65 100644 --- a/transport.c +++ b/transport.c @@ -1003,7 +1003,6 @@ int transport_push(struct transport *transport,  	if (transport->push_refs) {  		struct ref *remote_refs =  			transport->get_refs_list(transport, 1); -		struct ref **remote_tail;  		struct ref *local_refs = get_local_heads();  		int match_flags = MATCH_REFS_NONE;  		int verbose = flags & TRANSPORT_PUSH_VERBOSE; @@ -1014,10 +1013,7 @@ int transport_push(struct transport *transport,  		if (flags & TRANSPORT_PUSH_MIRROR)  			match_flags |= MATCH_REFS_MIRROR; -		remote_tail = &remote_refs; -		while (*remote_tail) -			remote_tail = &((*remote_tail)->next); -		if (match_refs(local_refs, remote_refs, &remote_tail, +		if (match_refs(local_refs, &remote_refs,  			       refspec_nr, refspec, match_flags)) {  			return -1;  		}  | 
