for-each-ref: Do not lookup objects when they will not be used
This makes commands such as `git for-each-ref --format='%(refname)'`, which are used heavily by the bash_completion code, run about 6 times faster on an uncached repository (3 s intead of 18 s on my linux-2.6 repository with several remotes). Signed-off-by: Anders Kaseorg <andersk@mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
		 Anders Kaseorg
					Anders Kaseorg
				
			
				
					committed by
					
						 Junio C Hamano
						Junio C Hamano
					
				
			
			
				
	
			
			
			 Junio C Hamano
						Junio C Hamano
					
				
			
						parent
						
							e57cb01582
						
					
				
				
					commit
					b7dd2d20fa
				
			| @ -561,14 +561,6 @@ static void populate_value(struct refinfo *ref) | ||||
|  | ||||
| 	ref->value = xcalloc(sizeof(struct atom_value), used_atom_cnt); | ||||
|  | ||||
| 	buf = get_obj(ref->objectname, &obj, &size, &eaten); | ||||
| 	if (!buf) | ||||
| 		die("missing object %s for %s", | ||||
| 		    sha1_to_hex(ref->objectname), ref->refname); | ||||
| 	if (!obj) | ||||
| 		die("parse_object_buffer failed on %s for %s", | ||||
| 		    sha1_to_hex(ref->objectname), ref->refname); | ||||
|  | ||||
| 	/* Fill in specials first */ | ||||
| 	for (i = 0; i < used_atom_cnt; i++) { | ||||
| 		const char *name = used_atom[i]; | ||||
| @ -621,6 +613,22 @@ static void populate_value(struct refinfo *ref) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	for (i = 0; i < used_atom_cnt; i++) { | ||||
| 		struct atom_value *v = &ref->value[i]; | ||||
| 		if (v->s == NULL) | ||||
| 			goto need_obj; | ||||
| 	} | ||||
| 	return; | ||||
|  | ||||
|  need_obj: | ||||
| 	buf = get_obj(ref->objectname, &obj, &size, &eaten); | ||||
| 	if (!buf) | ||||
| 		die("missing object %s for %s", | ||||
| 		    sha1_to_hex(ref->objectname), ref->refname); | ||||
| 	if (!obj) | ||||
| 		die("parse_object_buffer failed on %s for %s", | ||||
| 		    sha1_to_hex(ref->objectname), ref->refname); | ||||
|  | ||||
| 	grab_values(ref->value, 0, obj, buf, size); | ||||
| 	if (!eaten) | ||||
| 		free(buf); | ||||
| @ -926,7 +934,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix) | ||||
|  | ||||
| 	memset(&cbdata, 0, sizeof(cbdata)); | ||||
| 	cbdata.grab_pattern = argv; | ||||
| 	for_each_ref(grab_single_ref, &cbdata); | ||||
| 	for_each_rawref(grab_single_ref, &cbdata); | ||||
| 	refs = cbdata.grab_array; | ||||
| 	num_refs = cbdata.grab_cnt; | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user