refspec: introduce struct refspec
Introduce 'struct refspec', an abstraction around a collection of 'struct refspec_item's much like how 'struct pathspec' holds a collection of 'struct pathspec_item's. A refspec struct also contains an array of the original refspec strings which will be used to facilitate the migration to using this new abstraction throughout the code base. Signed-off-by: Brandon Williams <bmwill@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									3eec3700fd
								
							
						
					
					
						commit
						6d4c057859
					
				
							
								
								
									
										64
									
								
								refspec.c
								
								
								
								
							
							
						
						
									
										64
									
								
								refspec.c
								
								
								
								
							|  | @ -178,3 +178,67 @@ void free_refspec(int nr_refspec, struct refspec_item *refspec) | ||||||
| 	} | 	} | ||||||
| 	free(refspec); | 	free(refspec); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void refspec_item_init(struct refspec_item *item, const char *refspec, int fetch) | ||||||
|  | { | ||||||
|  | 	memset(item, 0, sizeof(*item)); | ||||||
|  |  | ||||||
|  | 	if (!parse_refspec(item, refspec, fetch)) | ||||||
|  | 		die("Invalid refspec '%s'", refspec); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void refspec_item_clear(struct refspec_item *item) | ||||||
|  | { | ||||||
|  | 	FREE_AND_NULL(item->src); | ||||||
|  | 	FREE_AND_NULL(item->dst); | ||||||
|  | 	item->force = 0; | ||||||
|  | 	item->pattern = 0; | ||||||
|  | 	item->matching = 0; | ||||||
|  | 	item->exact_sha1 = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void refspec_init(struct refspec *rs, int fetch) | ||||||
|  | { | ||||||
|  | 	memset(rs, 0, sizeof(*rs)); | ||||||
|  | 	rs->fetch = fetch; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void refspec_append(struct refspec *rs, const char *refspec) | ||||||
|  | { | ||||||
|  | 	struct refspec_item item; | ||||||
|  |  | ||||||
|  | 	refspec_item_init(&item, refspec, rs->fetch); | ||||||
|  |  | ||||||
|  | 	ALLOC_GROW(rs->items, rs->nr + 1, rs->alloc); | ||||||
|  | 	rs->items[rs->nr++] = item; | ||||||
|  |  | ||||||
|  | 	ALLOC_GROW(rs->raw, rs->raw_nr + 1, rs->raw_alloc); | ||||||
|  | 	rs->raw[rs->raw_nr++] = xstrdup(refspec); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void refspec_appendn(struct refspec *rs, const char **refspecs, int nr) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 	for (i = 0; i < nr; i++) | ||||||
|  | 		refspec_append(rs, refspecs[i]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void refspec_clear(struct refspec *rs) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  |  | ||||||
|  | 	for (i = 0; i < rs->nr; i++) | ||||||
|  | 		refspec_item_clear(&rs->items[i]); | ||||||
|  |  | ||||||
|  | 	FREE_AND_NULL(rs->items); | ||||||
|  | 	rs->alloc = 0; | ||||||
|  | 	rs->nr = 0; | ||||||
|  |  | ||||||
|  | 	for (i = 0; i < rs->raw_nr; i++) | ||||||
|  | 		free((char *)rs->raw[i]); | ||||||
|  | 	FREE_AND_NULL(rs->raw); | ||||||
|  | 	rs->raw_alloc = 0; | ||||||
|  | 	rs->raw_nr = 0; | ||||||
|  |  | ||||||
|  | 	rs->fetch = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										25
									
								
								refspec.h
								
								
								
								
							
							
						
						
									
										25
									
								
								refspec.h
								
								
								
								
							|  | @ -20,4 +20,29 @@ struct refspec_item *parse_push_refspec(int nr_refspec, const char **refspec); | ||||||
|  |  | ||||||
| void free_refspec(int nr_refspec, struct refspec_item *refspec); | void free_refspec(int nr_refspec, struct refspec_item *refspec); | ||||||
|  |  | ||||||
|  | #define REFSPEC_FETCH 1 | ||||||
|  | #define REFSPEC_PUSH 0 | ||||||
|  |  | ||||||
|  | #define REFSPEC_INIT_FETCH { .fetch = REFSPEC_FETCH } | ||||||
|  | #define REFSPEC_INIT_PUSH { .fetch = REFSPEC_PUSH } | ||||||
|  |  | ||||||
|  | struct refspec { | ||||||
|  | 	struct refspec_item *items; | ||||||
|  | 	int alloc; | ||||||
|  | 	int nr; | ||||||
|  |  | ||||||
|  | 	const char **raw; | ||||||
|  | 	int raw_alloc; | ||||||
|  | 	int raw_nr; | ||||||
|  |  | ||||||
|  | 	int fetch; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | void refspec_item_init(struct refspec_item *item, const char *refspec, int fetch); | ||||||
|  | void refspec_item_clear(struct refspec_item *item); | ||||||
|  | void refspec_init(struct refspec *rs, int fetch); | ||||||
|  | void refspec_append(struct refspec *rs, const char *refspec); | ||||||
|  | void refspec_appendn(struct refspec *rs, const char **refspecs, int nr); | ||||||
|  | void refspec_clear(struct refspec *rs); | ||||||
|  |  | ||||||
| #endif /* REFSPEC_H */ | #endif /* REFSPEC_H */ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Brandon Williams
						Brandon Williams