revert(3p/git): Revert merge of git upstream at v2.26.2
This causes cgit to serve error pages, which is undesirable. This reverts commit5229c9b232, reversing changes made tof2b211131f.
This commit is contained in:
		
							parent
							
								
									6f8fbf4aa4
								
							
						
					
					
						commit
						93ba78d6f4
					
				
					 1006 changed files with 60537 additions and 148724 deletions
				
			
		
							
								
								
									
										117
									
								
								third_party/git/builtin/grep.c
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										117
									
								
								third_party/git/builtin/grep.c
									
										
									
									
										vendored
									
									
								
							|  | @ -24,7 +24,6 @@ | |||
| #include "submodule.h" | ||||
| #include "submodule-config.h" | ||||
| #include "object-store.h" | ||||
| #include "packfile.h" | ||||
| 
 | ||||
| static char const * const grep_usage[] = { | ||||
| 	N_("git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"), | ||||
|  | @ -33,6 +32,7 @@ static char const * const grep_usage[] = { | |||
| 
 | ||||
| static int recurse_submodules; | ||||
| 
 | ||||
| #define GREP_NUM_THREADS_DEFAULT 8 | ||||
| static int num_threads; | ||||
| 
 | ||||
| static pthread_t *threads; | ||||
|  | @ -91,11 +91,8 @@ static pthread_cond_t cond_result; | |||
| 
 | ||||
| static int skip_first_line; | ||||
| 
 | ||||
| static void add_work(struct grep_opt *opt, struct grep_source *gs) | ||||
| static void add_work(struct grep_opt *opt, const struct grep_source *gs) | ||||
| { | ||||
| 	if (opt->binary != GREP_BINARY_TEXT) | ||||
| 		grep_source_load_driver(gs, opt->repo->index); | ||||
| 
 | ||||
| 	grep_lock(); | ||||
| 
 | ||||
| 	while ((todo_end+1) % ARRAY_SIZE(todo) == todo_done) { | ||||
|  | @ -103,6 +100,9 @@ static void add_work(struct grep_opt *opt, struct grep_source *gs) | |||
| 	} | ||||
| 
 | ||||
| 	todo[todo_end].source = *gs; | ||||
| 	if (opt->binary != GREP_BINARY_TEXT) | ||||
| 		grep_source_load_driver(&todo[todo_end].source, | ||||
| 					opt->repo->index); | ||||
| 	todo[todo_end].done = 0; | ||||
| 	strbuf_reset(&todo[todo_end].out); | ||||
| 	todo_end = (todo_end + 1) % ARRAY_SIZE(todo); | ||||
|  | @ -200,12 +200,12 @@ static void start_threads(struct grep_opt *opt) | |||
| 	int i; | ||||
| 
 | ||||
| 	pthread_mutex_init(&grep_mutex, NULL); | ||||
| 	pthread_mutex_init(&grep_read_mutex, NULL); | ||||
| 	pthread_mutex_init(&grep_attr_mutex, NULL); | ||||
| 	pthread_cond_init(&cond_add, NULL); | ||||
| 	pthread_cond_init(&cond_write, NULL); | ||||
| 	pthread_cond_init(&cond_result, NULL); | ||||
| 	grep_use_locks = 1; | ||||
| 	enable_obj_read_lock(); | ||||
| 
 | ||||
| 	for (i = 0; i < ARRAY_SIZE(todo); i++) { | ||||
| 		strbuf_init(&todo[i].out, 0); | ||||
|  | @ -257,12 +257,12 @@ static int wait_all(void) | |||
| 	free(threads); | ||||
| 
 | ||||
| 	pthread_mutex_destroy(&grep_mutex); | ||||
| 	pthread_mutex_destroy(&grep_read_mutex); | ||||
| 	pthread_mutex_destroy(&grep_attr_mutex); | ||||
| 	pthread_cond_destroy(&cond_add); | ||||
| 	pthread_cond_destroy(&cond_write); | ||||
| 	pthread_cond_destroy(&cond_result); | ||||
| 	grep_use_locks = 0; | ||||
| 	disable_obj_read_lock(); | ||||
| 
 | ||||
| 	return hit; | ||||
| } | ||||
|  | @ -295,6 +295,16 @@ static int grep_cmd_config(const char *var, const char *value, void *cb) | |||
| 	return st; | ||||
| } | ||||
| 
 | ||||
| static void *lock_and_read_oid_file(const struct object_id *oid, enum object_type *type, unsigned long *size) | ||||
| { | ||||
| 	void *data; | ||||
| 
 | ||||
| 	grep_read_lock(); | ||||
| 	data = read_object_file(oid, type, size); | ||||
| 	grep_read_unlock(); | ||||
| 	return data; | ||||
| } | ||||
| 
 | ||||
| static int grep_oid(struct grep_opt *opt, const struct object_id *oid, | ||||
| 		     const char *filename, int tree_name_len, | ||||
| 		     const char *path) | ||||
|  | @ -393,32 +403,34 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec, | |||
| static int grep_submodule(struct grep_opt *opt, | ||||
| 			  const struct pathspec *pathspec, | ||||
| 			  const struct object_id *oid, | ||||
| 			  const char *filename, const char *path, int cached) | ||||
| 			  const char *filename, const char *path) | ||||
| { | ||||
| 	struct repository subrepo; | ||||
| 	struct repository *superproject = opt->repo; | ||||
| 	const struct submodule *sub; | ||||
| 	const struct submodule *sub = submodule_from_path(superproject, | ||||
| 							  &null_oid, path); | ||||
| 	struct grep_opt subopt; | ||||
| 	int hit; | ||||
| 
 | ||||
| 	sub = submodule_from_path(superproject, &null_oid, path); | ||||
| 
 | ||||
| 	if (!is_submodule_active(superproject, path)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (repo_submodule_init(&subrepo, superproject, sub)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * NEEDSWORK: repo_read_gitmodules() might call | ||||
| 	 * add_to_alternates_memory() via config_from_gitmodules(). This | ||||
| 	 * operation causes a race condition with concurrent object readings | ||||
| 	 * performed by the worker threads. That's why we need obj_read_lock() | ||||
| 	 * here. It should be removed once it's no longer necessary to add the | ||||
| 	 * subrepo's odbs to the in-memory alternates list. | ||||
| 	 * NEEDSWORK: submodules functions need to be protected because they | ||||
| 	 * access the object store via config_from_gitmodules(): the latter | ||||
| 	 * uses get_oid() which, for now, relies on the global the_repository | ||||
| 	 * object. | ||||
| 	 */ | ||||
| 	obj_read_lock(); | ||||
| 	repo_read_gitmodules(&subrepo, 0); | ||||
| 	grep_read_lock(); | ||||
| 
 | ||||
| 	if (!is_submodule_active(superproject, path)) { | ||||
| 		grep_read_unlock(); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	if (repo_submodule_init(&subrepo, superproject, sub)) { | ||||
| 		grep_read_unlock(); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	repo_read_gitmodules(&subrepo); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * NEEDSWORK: This adds the submodule's object directory to the list of | ||||
|  | @ -431,7 +443,7 @@ static int grep_submodule(struct grep_opt *opt, | |||
| 	 * object. | ||||
| 	 */ | ||||
| 	add_to_alternates_memory(subrepo.objects->odb->path); | ||||
| 	obj_read_unlock(); | ||||
| 	grep_read_unlock(); | ||||
| 
 | ||||
| 	memcpy(&subopt, opt, sizeof(subopt)); | ||||
| 	subopt.repo = &subrepo; | ||||
|  | @ -443,12 +455,14 @@ static int grep_submodule(struct grep_opt *opt, | |||
| 		unsigned long size; | ||||
| 		struct strbuf base = STRBUF_INIT; | ||||
| 
 | ||||
| 		obj_read_lock(); | ||||
| 		object = parse_object_or_die(oid, oid_to_hex(oid)); | ||||
| 		obj_read_unlock(); | ||||
| 
 | ||||
| 		grep_read_lock(); | ||||
| 		data = read_object_with_reference(&subrepo, | ||||
| 						  &object->oid, tree_type, | ||||
| 						  &size, NULL); | ||||
| 		grep_read_unlock(); | ||||
| 
 | ||||
| 		if (!data) | ||||
| 			die(_("unable to read tree (%s)"), oid_to_hex(&object->oid)); | ||||
| 
 | ||||
|  | @ -461,7 +475,7 @@ static int grep_submodule(struct grep_opt *opt, | |||
| 		strbuf_release(&base); | ||||
| 		free(data); | ||||
| 	} else { | ||||
| 		hit = grep_cache(&subopt, pathspec, cached); | ||||
| 		hit = grep_cache(&subopt, pathspec, 1); | ||||
| 	} | ||||
| 
 | ||||
| 	repo_clear(&subrepo); | ||||
|  | @ -509,8 +523,7 @@ static int grep_cache(struct grep_opt *opt, | |||
| 			} | ||||
| 		} else if (recurse_submodules && S_ISGITLINK(ce->ce_mode) && | ||||
| 			   submodule_path_match(repo->index, pathspec, name.buf, NULL)) { | ||||
| 			hit |= grep_submodule(opt, pathspec, NULL, ce->name, | ||||
| 					      ce->name, cached); | ||||
| 			hit |= grep_submodule(opt, pathspec, NULL, ce->name, ce->name); | ||||
| 		} else { | ||||
| 			continue; | ||||
| 		} | ||||
|  | @ -573,7 +586,7 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec, | |||
| 			void *data; | ||||
| 			unsigned long size; | ||||
| 
 | ||||
| 			data = read_object_file(&entry.oid, &type, &size); | ||||
| 			data = lock_and_read_oid_file(&entry.oid, &type, &size); | ||||
| 			if (!data) | ||||
| 				die(_("unable to read tree (%s)"), | ||||
| 				    oid_to_hex(&entry.oid)); | ||||
|  | @ -585,8 +598,7 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec, | |||
| 			free(data); | ||||
| 		} else if (recurse_submodules && S_ISGITLINK(entry.mode)) { | ||||
| 			hit |= grep_submodule(opt, pathspec, &entry.oid, | ||||
| 					      base->buf, base->buf + tn_len, | ||||
| 					      1); /* ignored */ | ||||
| 					      base->buf, base->buf + tn_len); | ||||
| 		} | ||||
| 
 | ||||
| 		strbuf_setlen(base, old_baselen); | ||||
|  | @ -611,9 +623,12 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec, | |||
| 		struct strbuf base; | ||||
| 		int hit, len; | ||||
| 
 | ||||
| 		grep_read_lock(); | ||||
| 		data = read_object_with_reference(opt->repo, | ||||
| 						  &obj->oid, tree_type, | ||||
| 						  &size, NULL); | ||||
| 		grep_read_unlock(); | ||||
| 
 | ||||
| 		if (!data) | ||||
| 			die(_("unable to read tree (%s)"), oid_to_hex(&obj->oid)); | ||||
| 
 | ||||
|  | @ -642,18 +657,13 @@ static int grep_objects(struct grep_opt *opt, const struct pathspec *pathspec, | |||
| 
 | ||||
| 	for (i = 0; i < nr; i++) { | ||||
| 		struct object *real_obj; | ||||
| 
 | ||||
| 		obj_read_lock(); | ||||
| 		real_obj = deref_tag(opt->repo, list->objects[i].item, | ||||
| 				     NULL, 0); | ||||
| 		obj_read_unlock(); | ||||
| 
 | ||||
| 		/* load the gitmodules file for this rev */ | ||||
| 		if (recurse_submodules) { | ||||
| 			submodule_free(opt->repo); | ||||
| 			obj_read_lock(); | ||||
| 			gitmodules_config_oid(&real_obj->oid); | ||||
| 			obj_read_unlock(); | ||||
| 		} | ||||
| 		if (grep_object(opt, pathspec, real_obj, list->objects[i].name, | ||||
| 				list->objects[i].path)) { | ||||
|  | @ -946,9 +956,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix) | |||
| 			/* die the same way as if we did it at the beginning */ | ||||
| 			setup_git_directory(); | ||||
| 	} | ||||
| 	/* Ignore --recurse-submodules if --no-index is given or implied */ | ||||
| 	if (!use_index) | ||||
| 		recurse_submodules = 0; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * skip a -- separator; we know it cannot be | ||||
|  | @ -1053,10 +1060,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix) | |||
| 	pathspec.recursive = 1; | ||||
| 	pathspec.recurse_submodules = !!recurse_submodules; | ||||
| 
 | ||||
| 	if (recurse_submodules && untracked) | ||||
| 		die(_("--untracked not supported with --recurse-submodules")); | ||||
| 
 | ||||
| 	if (show_in_pager) { | ||||
| 	if (list.nr || cached || show_in_pager) { | ||||
| 		if (num_threads > 1) | ||||
| 			warning(_("invalid option combination, ignoring --threads")); | ||||
| 		num_threads = 1; | ||||
|  | @ -1066,7 +1070,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix) | |||
| 	} else if (num_threads < 0) | ||||
| 		die(_("invalid number of threads specified (%d)"), num_threads); | ||||
| 	else if (num_threads == 0) | ||||
| 		num_threads = HAVE_THREADS ? online_cpus() : 1; | ||||
| 		num_threads = HAVE_THREADS ? GREP_NUM_THREADS_DEFAULT : 1; | ||||
| 
 | ||||
| 	if (num_threads > 1) { | ||||
| 		if (!HAVE_THREADS) | ||||
|  | @ -1075,17 +1079,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix) | |||
| 		    && (opt.pre_context || opt.post_context || | ||||
| 			opt.file_break || opt.funcbody)) | ||||
| 			skip_first_line = 1; | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * Pre-read gitmodules (if not read already) and force eager | ||||
| 		 * initialization of packed_git to prevent racy lazy | ||||
| 		 * reading/initialization once worker threads are started. | ||||
| 		 */ | ||||
| 		if (recurse_submodules) | ||||
| 			repo_read_gitmodules(the_repository, 1); | ||||
| 		if (startup_info->have_repository) | ||||
| 			(void)get_packed_git(the_repository); | ||||
| 
 | ||||
| 		start_threads(&opt); | ||||
| 	} else { | ||||
| 		/*
 | ||||
|  | @ -1115,11 +1108,14 @@ int cmd_grep(int argc, const char **argv, const char *prefix) | |||
| 			strbuf_addf(&buf, "+/%s%s", | ||||
| 					strcmp("less", pager) ? "" : "*", | ||||
| 					opt.pattern_list->pattern); | ||||
| 			string_list_append(&path_list, | ||||
| 					   strbuf_detach(&buf, NULL)); | ||||
| 			string_list_append(&path_list, buf.buf); | ||||
| 			strbuf_detach(&buf, NULL); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (recurse_submodules && (!use_index || untracked)) | ||||
| 		die(_("option not supported with --recurse-submodules")); | ||||
| 
 | ||||
| 	if (!show_in_pager && !opt.status_only) | ||||
| 		setup_pager(); | ||||
| 
 | ||||
|  | @ -1149,6 +1145,5 @@ int cmd_grep(int argc, const char **argv, const char *prefix) | |||
| 		run_pager(&opt, prefix); | ||||
| 	clear_pathspec(&pathspec); | ||||
| 	free_grep_patterns(&opt); | ||||
| 	grep_destroy(); | ||||
| 	return !hit; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue