Merge branch 'ab/various-leak-fixes'
Various leak fixes.
* ab/various-leak-fixes:
  built-ins: use free() not UNLEAK() if trivial, rm dead code
  revert: fix parse_options_concat() leak
  cherry-pick: free "struct replay_opts" members
  rebase: don't leak on "--abort"
  connected.c: free the "struct packed_git"
  sequencer.c: fix "opts->strategy" leak in read_strategy_opts()
  ls-files: fix a --with-tree memory leak
  revision API: call graph_clear() in release_revisions()
  unpack-file: fix ancient leak in create_temp_file()
  built-ins & libs & helpers: add/move destructors, fix leaks
  dir.c: free "ident" and "exclude_per_dir" in "struct untracked_cache"
  read-cache.c: clear and free "sparse_checkout_patterns"
  commit: discard partial cache before (re-)reading it
  {reset,merge}: call discard_index() before returning
  tests: mark tests as passing with SANITIZE=leak
			
			
				maint
			
			
		
						commit
						9ea1378d04
					
				|  | @ -695,6 +695,6 @@ finish: | ||||||
| 		die(_("Unable to write new index file")); | 		die(_("Unable to write new index file")); | ||||||
|  |  | ||||||
| 	dir_clear(&dir); | 	dir_clear(&dir); | ||||||
| 	UNLEAK(pathspec); | 	clear_pathspec(&pathspec); | ||||||
| 	return exit_status; | 	return exit_status; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -106,6 +106,7 @@ int cmd_bugreport(int argc, const char **argv, const char *prefix) | ||||||
| 	const char *user_relative_path = NULL; | 	const char *user_relative_path = NULL; | ||||||
| 	char *prefixed_filename; | 	char *prefixed_filename; | ||||||
| 	size_t output_path_len; | 	size_t output_path_len; | ||||||
|  | 	int ret; | ||||||
|  |  | ||||||
| 	const struct option bugreport_options[] = { | 	const struct option bugreport_options[] = { | ||||||
| 		OPT_CALLBACK_F(0, "diagnose", &diagnose, N_("mode"), | 		OPT_CALLBACK_F(0, "diagnose", &diagnose, N_("mode"), | ||||||
|  | @ -182,7 +183,9 @@ int cmd_bugreport(int argc, const char **argv, const char *prefix) | ||||||
| 		user_relative_path); | 		user_relative_path); | ||||||
|  |  | ||||||
| 	free(prefixed_filename); | 	free(prefixed_filename); | ||||||
| 	UNLEAK(buffer); | 	strbuf_release(&buffer); | ||||||
| 	UNLEAK(report_path); |  | ||||||
| 	return !!launch_editor(report_path.buf, NULL, NULL); | 	ret = !!launch_editor(report_path.buf, NULL, NULL); | ||||||
|  | 	strbuf_release(&report_path); | ||||||
|  | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1471,6 +1471,8 @@ static void die_if_some_operation_in_progress(void) | ||||||
| 		      "or \"git worktree add\".")); | 		      "or \"git worktree add\".")); | ||||||
| 	if (state.bisect_in_progress) | 	if (state.bisect_in_progress) | ||||||
| 		warning(_("you are switching branch while bisecting")); | 		warning(_("you are switching branch while bisecting")); | ||||||
|  |  | ||||||
|  | 	wt_status_state_free_buffers(&state); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int checkout_branch(struct checkout_opts *opts, | static int checkout_branch(struct checkout_opts *opts, | ||||||
|  |  | ||||||
|  | @ -991,8 +991,11 @@ static int prepare_to_commit(const char *index_file, const char *prefix, | ||||||
| 		struct object_id oid; | 		struct object_id oid; | ||||||
| 		const char *parent = "HEAD"; | 		const char *parent = "HEAD"; | ||||||
|  |  | ||||||
| 		if (!active_nr && read_cache() < 0) | 		if (!active_nr) { | ||||||
| 			die(_("Cannot read index")); | 			discard_cache(); | ||||||
|  | 			if (read_cache() < 0) | ||||||
|  | 				die(_("Cannot read index")); | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		if (amend) | 		if (amend) | ||||||
| 			parent = "HEAD^1"; | 			parent = "HEAD^1"; | ||||||
|  | @ -1875,8 +1878,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix) | ||||||
| 	apply_autostash(git_path_merge_autostash(the_repository)); | 	apply_autostash(git_path_merge_autostash(the_repository)); | ||||||
|  |  | ||||||
| cleanup: | cleanup: | ||||||
| 	UNLEAK(author_ident); | 	strbuf_release(&author_ident); | ||||||
| 	UNLEAK(err); | 	strbuf_release(&err); | ||||||
| 	UNLEAK(sb); | 	strbuf_release(&sb); | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -639,8 +639,9 @@ static char *default_user_config(void) | ||||||
| int cmd_config(int argc, const char **argv, const char *prefix) | int cmd_config(int argc, const char **argv, const char *prefix) | ||||||
| { | { | ||||||
| 	int nongit = !startup_info->have_repository; | 	int nongit = !startup_info->have_repository; | ||||||
| 	char *value; | 	char *value = NULL; | ||||||
| 	int flags = 0; | 	int flags = 0; | ||||||
|  | 	int ret = 0; | ||||||
|  |  | ||||||
| 	given_config_source.file = xstrdup_or_null(getenv(CONFIG_ENVIRONMENT)); | 	given_config_source.file = xstrdup_or_null(getenv(CONFIG_ENVIRONMENT)); | ||||||
|  |  | ||||||
|  | @ -856,44 +857,38 @@ int cmd_config(int argc, const char **argv, const char *prefix) | ||||||
| 		free(config_file); | 		free(config_file); | ||||||
| 	} | 	} | ||||||
| 	else if (actions == ACTION_SET) { | 	else if (actions == ACTION_SET) { | ||||||
| 		int ret; |  | ||||||
| 		check_write(); | 		check_write(); | ||||||
| 		check_argc(argc, 2, 2); | 		check_argc(argc, 2, 2); | ||||||
| 		value = normalize_value(argv[0], argv[1]); | 		value = normalize_value(argv[0], argv[1]); | ||||||
| 		UNLEAK(value); |  | ||||||
| 		ret = git_config_set_in_file_gently(given_config_source.file, argv[0], value); | 		ret = git_config_set_in_file_gently(given_config_source.file, argv[0], value); | ||||||
| 		if (ret == CONFIG_NOTHING_SET) | 		if (ret == CONFIG_NOTHING_SET) | ||||||
| 			error(_("cannot overwrite multiple values with a single value\n" | 			error(_("cannot overwrite multiple values with a single value\n" | ||||||
| 			"       Use a regexp, --add or --replace-all to change %s."), argv[0]); | 			"       Use a regexp, --add or --replace-all to change %s."), argv[0]); | ||||||
| 		return ret; |  | ||||||
| 	} | 	} | ||||||
| 	else if (actions == ACTION_SET_ALL) { | 	else if (actions == ACTION_SET_ALL) { | ||||||
| 		check_write(); | 		check_write(); | ||||||
| 		check_argc(argc, 2, 3); | 		check_argc(argc, 2, 3); | ||||||
| 		value = normalize_value(argv[0], argv[1]); | 		value = normalize_value(argv[0], argv[1]); | ||||||
| 		UNLEAK(value); | 		ret = git_config_set_multivar_in_file_gently(given_config_source.file, | ||||||
| 		return git_config_set_multivar_in_file_gently(given_config_source.file, | 							     argv[0], value, argv[2], | ||||||
| 							      argv[0], value, argv[2], | 							     flags); | ||||||
| 							      flags); |  | ||||||
| 	} | 	} | ||||||
| 	else if (actions == ACTION_ADD) { | 	else if (actions == ACTION_ADD) { | ||||||
| 		check_write(); | 		check_write(); | ||||||
| 		check_argc(argc, 2, 2); | 		check_argc(argc, 2, 2); | ||||||
| 		value = normalize_value(argv[0], argv[1]); | 		value = normalize_value(argv[0], argv[1]); | ||||||
| 		UNLEAK(value); | 		ret = git_config_set_multivar_in_file_gently(given_config_source.file, | ||||||
| 		return git_config_set_multivar_in_file_gently(given_config_source.file, | 							     argv[0], value, | ||||||
| 							      argv[0], value, | 							     CONFIG_REGEX_NONE, | ||||||
| 							      CONFIG_REGEX_NONE, | 							     flags); | ||||||
| 							      flags); |  | ||||||
| 	} | 	} | ||||||
| 	else if (actions == ACTION_REPLACE_ALL) { | 	else if (actions == ACTION_REPLACE_ALL) { | ||||||
| 		check_write(); | 		check_write(); | ||||||
| 		check_argc(argc, 2, 3); | 		check_argc(argc, 2, 3); | ||||||
| 		value = normalize_value(argv[0], argv[1]); | 		value = normalize_value(argv[0], argv[1]); | ||||||
| 		UNLEAK(value); | 		ret = git_config_set_multivar_in_file_gently(given_config_source.file, | ||||||
| 		return git_config_set_multivar_in_file_gently(given_config_source.file, | 							     argv[0], value, argv[2], | ||||||
| 							      argv[0], value, argv[2], | 							     flags | CONFIG_FLAGS_MULTI_REPLACE); | ||||||
| 							      flags | CONFIG_FLAGS_MULTI_REPLACE); |  | ||||||
| 	} | 	} | ||||||
| 	else if (actions == ACTION_GET) { | 	else if (actions == ACTION_GET) { | ||||||
| 		check_argc(argc, 1, 2); | 		check_argc(argc, 1, 2); | ||||||
|  | @ -934,26 +929,28 @@ int cmd_config(int argc, const char **argv, const char *prefix) | ||||||
| 							      flags | CONFIG_FLAGS_MULTI_REPLACE); | 							      flags | CONFIG_FLAGS_MULTI_REPLACE); | ||||||
| 	} | 	} | ||||||
| 	else if (actions == ACTION_RENAME_SECTION) { | 	else if (actions == ACTION_RENAME_SECTION) { | ||||||
| 		int ret; |  | ||||||
| 		check_write(); | 		check_write(); | ||||||
| 		check_argc(argc, 2, 2); | 		check_argc(argc, 2, 2); | ||||||
| 		ret = git_config_rename_section_in_file(given_config_source.file, | 		ret = git_config_rename_section_in_file(given_config_source.file, | ||||||
| 							argv[0], argv[1]); | 							argv[0], argv[1]); | ||||||
| 		if (ret < 0) | 		if (ret < 0) | ||||||
| 			return ret; | 			return ret; | ||||||
| 		if (ret == 0) | 		else if (!ret) | ||||||
| 			die(_("no such section: %s"), argv[0]); | 			die(_("no such section: %s"), argv[0]); | ||||||
|  | 		else | ||||||
|  | 			ret = 0; | ||||||
| 	} | 	} | ||||||
| 	else if (actions == ACTION_REMOVE_SECTION) { | 	else if (actions == ACTION_REMOVE_SECTION) { | ||||||
| 		int ret; |  | ||||||
| 		check_write(); | 		check_write(); | ||||||
| 		check_argc(argc, 1, 1); | 		check_argc(argc, 1, 1); | ||||||
| 		ret = git_config_rename_section_in_file(given_config_source.file, | 		ret = git_config_rename_section_in_file(given_config_source.file, | ||||||
| 							argv[0], NULL); | 							argv[0], NULL); | ||||||
| 		if (ret < 0) | 		if (ret < 0) | ||||||
| 			return ret; | 			return ret; | ||||||
| 		if (ret == 0) | 		else if (!ret) | ||||||
| 			die(_("no such section: %s"), argv[0]); | 			die(_("no such section: %s"), argv[0]); | ||||||
|  | 		else | ||||||
|  | 			ret = 0; | ||||||
| 	} | 	} | ||||||
| 	else if (actions == ACTION_GET_COLOR) { | 	else if (actions == ACTION_GET_COLOR) { | ||||||
| 		check_argc(argc, 1, 2); | 		check_argc(argc, 1, 2); | ||||||
|  | @ -966,5 +963,6 @@ int cmd_config(int argc, const char **argv, const char *prefix) | ||||||
| 		return get_colorbool(argv[0], argc == 2); | 		return get_colorbool(argv[0], argc == 2); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return 0; | 	free(value); | ||||||
|  | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -612,7 +612,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix) | ||||||
| 	if (1 < rev.diffopt.skip_stat_unmatch) | 	if (1 < rev.diffopt.skip_stat_unmatch) | ||||||
| 		refresh_index_quietly(); | 		refresh_index_quietly(); | ||||||
| 	release_revisions(&rev); | 	release_revisions(&rev); | ||||||
| 	UNLEAK(ent); | 	object_array_clear(&ent); | ||||||
| 	UNLEAK(blob); | 	UNLEAK(blob); | ||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -613,6 +613,7 @@ void overlay_tree_on_index(struct index_state *istate, | ||||||
| 	if (!fn) | 	if (!fn) | ||||||
| 		fn = read_one_entry_quick; | 		fn = read_one_entry_quick; | ||||||
| 	err = read_tree(the_repository, tree, &pathspec, fn, istate); | 	err = read_tree(the_repository, tree, &pathspec, fn, istate); | ||||||
|  | 	clear_pathspec(&pathspec); | ||||||
| 	if (err) | 	if (err) | ||||||
| 		die("unable to read tree entries %s", tree_name); | 		die("unable to read tree entries %s", tree_name); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -1789,5 +1789,6 @@ done: | ||||||
| 	} | 	} | ||||||
| 	strbuf_release(&buf); | 	strbuf_release(&buf); | ||||||
| 	free(branch_to_free); | 	free(branch_to_free); | ||||||
|  | 	discard_index(&the_index); | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1322,6 +1322,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) | ||||||
| 		if (reset_head(the_repository, &ropts) < 0) | 		if (reset_head(the_repository, &ropts) < 0) | ||||||
| 			die(_("could not move back to %s"), | 			die(_("could not move back to %s"), | ||||||
| 			    oid_to_hex(&options.orig_head->object.oid)); | 			    oid_to_hex(&options.orig_head->object.oid)); | ||||||
|  | 		strbuf_release(&head_msg); | ||||||
| 		remove_branch_state(the_repository, 0); | 		remove_branch_state(the_repository, 0); | ||||||
| 		ret = finish_rebase(&options); | 		ret = finish_rebase(&options); | ||||||
| 		goto cleanup; | 		goto cleanup; | ||||||
|  | @ -1828,10 +1829,13 @@ cleanup: | ||||||
| 	strbuf_release(&revisions); | 	strbuf_release(&revisions); | ||||||
| 	free(options.reflog_action); | 	free(options.reflog_action); | ||||||
| 	free(options.head_name); | 	free(options.head_name); | ||||||
|  | 	strvec_clear(&options.git_am_opts); | ||||||
| 	free(options.gpg_sign_opt); | 	free(options.gpg_sign_opt); | ||||||
| 	free(options.cmd); | 	free(options.cmd); | ||||||
| 	free(options.strategy); | 	free(options.strategy); | ||||||
| 	strbuf_release(&options.git_format_patch_opt); | 	strbuf_release(&options.git_format_patch_opt); | ||||||
| 	free(squash_onto_name); | 	free(squash_onto_name); | ||||||
|  | 	string_list_clear(&exec, 0); | ||||||
|  | 	string_list_clear(&strategy_options, 0); | ||||||
| 	return !!ret; | 	return !!ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -973,6 +973,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix) | ||||||
| 		item = string_list_append(&names, line.buf); | 		item = string_list_append(&names, line.buf); | ||||||
| 		item->util = populate_pack_exts(item->string); | 		item->util = populate_pack_exts(item->string); | ||||||
| 	} | 	} | ||||||
|  | 	strbuf_release(&line); | ||||||
| 	fclose(out); | 	fclose(out); | ||||||
| 	ret = finish_command(&cmd); | 	ret = finish_command(&cmd); | ||||||
| 	if (ret) | 	if (ret) | ||||||
|  | @ -1175,7 +1176,6 @@ int cmd_repack(int argc, const char **argv, const char *prefix) | ||||||
| 	string_list_clear(&existing_nonkept_packs, 0); | 	string_list_clear(&existing_nonkept_packs, 0); | ||||||
| 	string_list_clear(&existing_kept_packs, 0); | 	string_list_clear(&existing_kept_packs, 0); | ||||||
| 	clear_pack_geometry(geometry); | 	clear_pack_geometry(geometry); | ||||||
| 	strbuf_release(&line); |  | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -485,5 +485,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix) | ||||||
| 	if (!pathspec.nr) | 	if (!pathspec.nr) | ||||||
| 		remove_branch_state(the_repository, 0); | 		remove_branch_state(the_repository, 0); | ||||||
|  |  | ||||||
|  | 	discard_index(&the_index); | ||||||
|  |  | ||||||
| 	return update_ref_status; | 	return update_ref_status; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -530,6 +530,7 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix) | ||||||
| 	strbuf_addstr(&parsed, " --"); | 	strbuf_addstr(&parsed, " --"); | ||||||
| 	sq_quote_argv(&parsed, argv); | 	sq_quote_argv(&parsed, argv); | ||||||
| 	puts(parsed.buf); | 	puts(parsed.buf); | ||||||
|  | 	strbuf_release(&parsed); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -221,6 +221,7 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts) | ||||||
| 	opts->strategy = xstrdup_or_null(opts->strategy); | 	opts->strategy = xstrdup_or_null(opts->strategy); | ||||||
| 	if (!opts->strategy && getenv("GIT_TEST_MERGE_ALGORITHM")) | 	if (!opts->strategy && getenv("GIT_TEST_MERGE_ALGORITHM")) | ||||||
| 		opts->strategy = xstrdup(getenv("GIT_TEST_MERGE_ALGORITHM")); | 		opts->strategy = xstrdup(getenv("GIT_TEST_MERGE_ALGORITHM")); | ||||||
|  | 	free(options); | ||||||
|  |  | ||||||
| 	if (cmd == 'q') { | 	if (cmd == 'q') { | ||||||
| 		int ret = sequencer_remove_state(opts); | 		int ret = sequencer_remove_state(opts); | ||||||
|  | @ -261,6 +262,9 @@ int cmd_cherry_pick(int argc, const char **argv, const char *prefix) | ||||||
| 	opts.action = REPLAY_PICK; | 	opts.action = REPLAY_PICK; | ||||||
| 	sequencer_init_config(&opts); | 	sequencer_init_config(&opts); | ||||||
| 	res = run_sequencer(argc, argv, &opts); | 	res = run_sequencer(argc, argv, &opts); | ||||||
|  | 	if (opts.revs) | ||||||
|  | 		release_revisions(opts.revs); | ||||||
|  | 	free(opts.revs); | ||||||
| 	if (res < 0) | 	if (res < 0) | ||||||
| 		die(_("cherry-pick failed")); | 		die(_("cherry-pick failed")); | ||||||
| 	return res; | 	return res; | ||||||
|  |  | ||||||
|  | @ -1689,8 +1689,10 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| done: | done: | ||||||
|  | 	strbuf_release(&patch); | ||||||
| 	free_stash_info(&info); | 	free_stash_info(&info); | ||||||
| 	strbuf_release(&stash_msg_buf); | 	strbuf_release(&stash_msg_buf); | ||||||
|  | 	strbuf_release(&untracked_files); | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -19,6 +19,7 @@ static char *create_temp_file(struct object_id *oid) | ||||||
| 	if (write_in_full(fd, buf, size) < 0) | 	if (write_in_full(fd, buf, size) < 0) | ||||||
| 		die_errno("unable to write temp-file"); | 		die_errno("unable to write temp-file"); | ||||||
| 	close(fd); | 	close(fd); | ||||||
|  | 	free(buf); | ||||||
| 	return path; | 	return path; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -629,6 +629,7 @@ static int add(int ac, const char **av, const char *prefix) | ||||||
| 			 N_("try to match the new branch name with a remote-tracking branch")), | 			 N_("try to match the new branch name with a remote-tracking branch")), | ||||||
| 		OPT_END() | 		OPT_END() | ||||||
| 	}; | 	}; | ||||||
|  | 	int ret; | ||||||
|  |  | ||||||
| 	memset(&opts, 0, sizeof(opts)); | 	memset(&opts, 0, sizeof(opts)); | ||||||
| 	opts.checkout = 1; | 	opts.checkout = 1; | ||||||
|  | @ -705,9 +706,9 @@ static int add(int ac, const char **av, const char *prefix) | ||||||
| 		die(_("--[no-]track can only be used if a new branch is created")); | 		die(_("--[no-]track can only be used if a new branch is created")); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	UNLEAK(path); | 	ret = add_worktree(path, branch, &opts); | ||||||
| 	UNLEAK(opts); | 	free(path); | ||||||
| 	return add_worktree(path, branch, &opts); | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void show_worktree_porcelain(struct worktree *wt, int line_terminator) | static void show_worktree_porcelain(struct worktree *wt, int line_terminator) | ||||||
|  |  | ||||||
|  | @ -85,6 +85,7 @@ int check_connected(oid_iterate_fn fn, void *cb_data, | ||||||
| promisor_pack_found: | promisor_pack_found: | ||||||
| 			; | 			; | ||||||
| 		} while ((oid = fn(cb_data)) != NULL); | 		} while ((oid = fn(cb_data)) != NULL); | ||||||
|  | 		free(new_pack); | ||||||
| 		return 0; | 		return 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -121,8 +122,10 @@ no_promisor_pack_found: | ||||||
| 	else | 	else | ||||||
| 		rev_list.no_stderr = opt->quiet; | 		rev_list.no_stderr = opt->quiet; | ||||||
|  |  | ||||||
| 	if (start_command(&rev_list)) | 	if (start_command(&rev_list)) { | ||||||
|  | 		free(new_pack); | ||||||
| 		return error(_("Could not run 'git rev-list'")); | 		return error(_("Could not run 'git rev-list'")); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	sigchain_push(SIGPIPE, SIG_IGN); | 	sigchain_push(SIGPIPE, SIG_IGN); | ||||||
|  |  | ||||||
|  | @ -154,5 +157,6 @@ no_promisor_pack_found: | ||||||
| 		err = error_errno(_("failed to close rev-list's stdin")); | 		err = error_errno(_("failed to close rev-list's stdin")); | ||||||
|  |  | ||||||
| 	sigchain_pop(SIGPIPE); | 	sigchain_pop(SIGPIPE); | ||||||
|  | 	free(new_pack); | ||||||
| 	return finish_command(&rev_list) || err; | 	return finish_command(&rev_list) || err; | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								dir.c
								
								
								
								
							
							
						
						
									
										10
									
								
								dir.c
								
								
								
								
							|  | @ -3581,8 +3581,12 @@ static void free_untracked(struct untracked_cache_dir *ucd) | ||||||
|  |  | ||||||
| void free_untracked_cache(struct untracked_cache *uc) | void free_untracked_cache(struct untracked_cache *uc) | ||||||
| { | { | ||||||
| 	if (uc) | 	if (!uc) | ||||||
| 		free_untracked(uc->root); | 		return; | ||||||
|  |  | ||||||
|  | 	free(uc->exclude_per_dir_to_free); | ||||||
|  | 	strbuf_release(&uc->ident); | ||||||
|  | 	free_untracked(uc->root); | ||||||
| 	free(uc); | 	free(uc); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -3739,7 +3743,7 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long | ||||||
| 		      next + offset + hashsz); | 		      next + offset + hashsz); | ||||||
| 	uc->dir_flags = get_be32(next + ouc_offset(dir_flags)); | 	uc->dir_flags = get_be32(next + ouc_offset(dir_flags)); | ||||||
| 	exclude_per_dir = (const char *)next + exclude_per_dir_offset; | 	exclude_per_dir = (const char *)next + exclude_per_dir_offset; | ||||||
| 	uc->exclude_per_dir = xstrdup(exclude_per_dir); | 	uc->exclude_per_dir = uc->exclude_per_dir_to_free = xstrdup(exclude_per_dir); | ||||||
| 	/* NUL after exclude_per_dir is covered by sizeof(*ouc) */ | 	/* NUL after exclude_per_dir is covered by sizeof(*ouc) */ | ||||||
| 	next += exclude_per_dir_offset + strlen(exclude_per_dir) + 1; | 	next += exclude_per_dir_offset + strlen(exclude_per_dir) + 1; | ||||||
| 	if (next >= end) | 	if (next >= end) | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								dir.h
								
								
								
								
							
							
						
						
									
										1
									
								
								dir.h
								
								
								
								
							|  | @ -188,6 +188,7 @@ struct untracked_cache { | ||||||
| 	struct oid_stat ss_info_exclude; | 	struct oid_stat ss_info_exclude; | ||||||
| 	struct oid_stat ss_excludes_file; | 	struct oid_stat ss_excludes_file; | ||||||
| 	const char *exclude_per_dir; | 	const char *exclude_per_dir; | ||||||
|  | 	char *exclude_per_dir_to_free; | ||||||
| 	struct strbuf ident; | 	struct strbuf ident; | ||||||
| 	/* | 	/* | ||||||
| 	 * dir_struct#flags must match dir_flags or the untracked | 	 * dir_struct#flags must match dir_flags or the untracked | ||||||
|  |  | ||||||
|  | @ -2558,6 +2558,11 @@ void discard_index(struct index_state *istate) | ||||||
| 	free_untracked_cache(istate->untracked); | 	free_untracked_cache(istate->untracked); | ||||||
| 	istate->untracked = NULL; | 	istate->untracked = NULL; | ||||||
|  |  | ||||||
|  | 	if (istate->sparse_checkout_patterns) { | ||||||
|  | 		clear_pattern_list(istate->sparse_checkout_patterns); | ||||||
|  | 		FREE_AND_NULL(istate->sparse_checkout_patterns); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (istate->ce_mem_pool) { | 	if (istate->ce_mem_pool) { | ||||||
| 		mem_pool_discard(istate->ce_mem_pool, should_validate_cache_entries()); | 		mem_pool_discard(istate->ce_mem_pool, should_validate_cache_entries()); | ||||||
| 		FREE_AND_NULL(istate->ce_mem_pool); | 		FREE_AND_NULL(istate->ce_mem_pool); | ||||||
|  |  | ||||||
|  | @ -1358,6 +1358,7 @@ static void find_subpos(const char *buf, | ||||||
|  |  | ||||||
| 	/* parse signature first; we might not even have a subject line */ | 	/* parse signature first; we might not even have a subject line */ | ||||||
| 	parse_signature(buf, end - buf, &payload, &signature); | 	parse_signature(buf, end - buf, &payload, &signature); | ||||||
|  | 	strbuf_release(&payload); | ||||||
|  |  | ||||||
| 	/* skip past header until we hit empty line */ | 	/* skip past header until we hit empty line */ | ||||||
| 	while (*buf && *buf != '\n') { | 	while (*buf && *buf != '\n') { | ||||||
|  |  | ||||||
|  | @ -3054,6 +3054,7 @@ void release_revisions(struct rev_info *revs) | ||||||
| 	date_mode_release(&revs->date_mode); | 	date_mode_release(&revs->date_mode); | ||||||
| 	release_revisions_mailmap(revs->mailmap); | 	release_revisions_mailmap(revs->mailmap); | ||||||
| 	free_grep_patterns(&revs->grep_filter); | 	free_grep_patterns(&revs->grep_filter); | ||||||
|  | 	graph_clear(revs->graph); | ||||||
| 	/* TODO (need to handle "no_free"): diff_free(&revs->diffopt) */ | 	/* TODO (need to handle "no_free"): diff_free(&revs->diffopt) */ | ||||||
| 	diff_free(&revs->pruning); | 	diff_free(&revs->pruning); | ||||||
| 	reflog_walk_info_release(revs->reflog_info); | 	reflog_walk_info_release(revs->reflog_info); | ||||||
|  |  | ||||||
|  | @ -2897,6 +2897,7 @@ static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf) | ||||||
| 	strbuf_reset(buf); | 	strbuf_reset(buf); | ||||||
| 	if (!read_oneliner(buf, rebase_path_strategy(), 0)) | 	if (!read_oneliner(buf, rebase_path_strategy(), 0)) | ||||||
| 		return; | 		return; | ||||||
|  | 	free(opts->strategy); | ||||||
| 	opts->strategy = strbuf_detach(buf, NULL); | 	opts->strategy = strbuf_detach(buf, NULL); | ||||||
| 	if (!read_oneliner(buf, rebase_path_strategy_opts(), 0)) | 	if (!read_oneliner(buf, rebase_path_strategy_opts(), 0)) | ||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
|  | @ -17,6 +17,7 @@ int cmd_main(int argc, const char **argv) | ||||||
| 	f = fopen(buf.buf, "w"); | 	f = fopen(buf.buf, "w"); | ||||||
| 	if (!f) | 	if (!f) | ||||||
| 		die("Could not write to %s", buf.buf); | 		die("Could not write to %s", buf.buf); | ||||||
|  | 	strbuf_release(&buf); | ||||||
| 	for (i = 0; i < argc; i++) | 	for (i = 0; i < argc; i++) | ||||||
| 		fprintf(f, "%s%s", i > 0 ? " " : "", i > 0 ? argv[i] : "ssh:"); | 		fprintf(f, "%s%s", i > 0 ? " " : "", i > 0 ? argv[i] : "ssh:"); | ||||||
| 	fprintf(f, "\n"); | 	fprintf(f, "\n"); | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='git for-each-repo builtin' | test_description='git for-each-repo builtin' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'run based on configured value' ' | test_expect_success 'run based on configured value' ' | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ test_description='check that the most basic functions work | ||||||
| Verify wrappers and compatibility functions. | Verify wrappers and compatibility functions. | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'character classes (isspace, isalpha etc.)' ' | test_expect_success 'character classes (isspace, isalpha etc.)' ' | ||||||
|  |  | ||||||
|  | @ -12,6 +12,7 @@ test_description='sparse checkout tests | ||||||
| ' | ' | ||||||
|  |  | ||||||
| TEST_CREATE_REPO_NO_TEMPLATE=1 | TEST_CREATE_REPO_NO_TEMPLATE=1 | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
| . "$TEST_DIRECTORY"/lib-read-tree.sh | . "$TEST_DIRECTORY"/lib-read-tree.sh | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ | ||||||
| test_description='git read-tree in partial clones' | test_description='git read-tree in partial clones' | ||||||
|  |  | ||||||
| TEST_NO_CREATE_REPO=1 | TEST_NO_CREATE_REPO=1 | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'read-tree in partial clone prefetches in one batch' ' | test_expect_success 'read-tree in partial clone prefetches in one batch' ' | ||||||
|  |  | ||||||
|  | @ -1,6 +1,8 @@ | ||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  |  | ||||||
| test_description='Test git update-ref error handling' | test_description='Test git update-ref error handling' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| # Create some references, perhaps run pack-refs --all, then try to | # Create some references, perhaps run pack-refs --all, then try to | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='avoid rewriting packed-refs unnecessarily' | test_description='avoid rewriting packed-refs unnecessarily' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| # Add an identifying mark to the packed-refs file header line. This | # Add an identifying mark to the packed-refs file header line. This | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ test_description='Test reflog interaction with detached HEAD' | ||||||
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | ||||||
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| reset_state () { | reset_state () { | ||||||
|  |  | ||||||
|  | @ -1,6 +1,8 @@ | ||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  |  | ||||||
| test_description='test separate work tree' | test_description='test separate work tree' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup' ' | test_expect_success 'setup' ' | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ test_description='checkout can switch to last branch and merge base' | ||||||
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | ||||||
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup' ' | test_expect_success 'setup' ' | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ | ||||||
| test_description='checkout' | test_description='checkout' | ||||||
|  |  | ||||||
| TEST_CREATE_REPO_NO_TEMPLATE=1 | TEST_CREATE_REPO_NO_TEMPLATE=1 | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| # Arguments: [!] <branch> <oid> [<checkout options>] | # Arguments: [!] <branch> <oid> [<checkout options>] | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='checkout --no-overlay <tree-ish> -- <pathspec>' | test_description='checkout --no-overlay <tree-ish> -- <pathspec>' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup' ' | test_expect_success 'setup' ' | ||||||
|  |  | ||||||
|  | @ -18,6 +18,7 @@ This test runs git ls-files --others with the following working tree: | ||||||
|       git repository with a commit and an untracked file |       git repository with a commit and an untracked file | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup: directories' ' | test_expect_success 'setup: directories' ' | ||||||
|  |  | ||||||
|  | @ -41,6 +41,8 @@ Also for modification test, the cache and working tree have: | ||||||
| We should report path0, path1, path2/file2, path3/file3, path7 and path8 | We should report path0, path1, path2/file2, path3/file3, path7 and path8 | ||||||
| modified without reporting path9 and path10.  submod1 is also modified. | modified without reporting path9 and path10.  submod1 is also modified. | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'git update-index --add to add various paths.' ' | test_expect_success 'git update-index --add to add various paths.' ' | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='fetching and pushing project with subproject' | test_description='fetching and pushing project with subproject' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success setup ' | test_expect_success setup ' | ||||||
|  |  | ||||||
|  | @ -8,6 +8,8 @@ test_description='git ls-files test (--with-tree). | ||||||
| This test runs git ls-files --with-tree and in particular in | This test runs git ls-files --with-tree and in particular in | ||||||
| a scenario known to trigger a crash with some versions of git. | a scenario known to trigger a crash with some versions of git. | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup' ' | test_expect_success 'setup' ' | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='git rebase interactive environment' | test_description='git rebase interactive environment' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup' ' | test_expect_success 'setup' ' | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ test_description='git rebase with its hook(s)' | ||||||
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | ||||||
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success setup ' | test_expect_success setup ' | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ test_description='git rebase --signoff | ||||||
| This test runs git rebase --signoff and make sure that it works. | This test runs git rebase --signoff and make sure that it works. | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| # A simple file to commit | # A simple file to commit | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='rebase should reread the todo file if an exec modifies it' | test_description='rebase should reread the todo file if an exec modifies it' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
| . "$TEST_DIRECTORY"/lib-rebase.sh | . "$TEST_DIRECTORY"/lib-rebase.sh | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='git rebase across mode change' | test_description='git rebase across mode change' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup' ' | test_expect_success 'setup' ' | ||||||
|  |  | ||||||
|  | @ -1638,7 +1638,7 @@ test_expect_success 'no effect on diff from --color-moved with --word-diff' ' | ||||||
| 	test_cmp expect actual | 	test_cmp expect actual | ||||||
| ' | ' | ||||||
|  |  | ||||||
| test_expect_success !SANITIZE_LEAK 'no effect on show from --color-moved with --word-diff' ' | test_expect_success 'no effect on show from --color-moved with --word-diff' ' | ||||||
| 	git show --color-moved --word-diff >actual && | 	git show --color-moved --word-diff >actual && | ||||||
| 	git show --word-diff >expect && | 	git show --word-diff >expect && | ||||||
| 	test_cmp expect actual | 	test_cmp expect actual | ||||||
|  | @ -2024,7 +2024,7 @@ test_expect_success '--color-moved rewinds for MIN_ALNUM_COUNT' ' | ||||||
| 	test_cmp expected actual | 	test_cmp expected actual | ||||||
| ' | ' | ||||||
|  |  | ||||||
| test_expect_success !SANITIZE_LEAK 'move detection with submodules' ' | test_expect_success 'move detection with submodules' ' | ||||||
| 	test_create_repo bananas && | 	test_create_repo bananas && | ||||||
| 	echo ripe >bananas/recipe && | 	echo ripe >bananas/recipe && | ||||||
| 	git -C bananas add recipe && | 	git -C bananas add recipe && | ||||||
|  |  | ||||||
|  | @ -1,6 +1,8 @@ | ||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  |  | ||||||
| test_description='diff --relative tests' | test_description='diff --relative tests' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup' ' | test_expect_success 'setup' ' | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ test_description='test --stat output of various commands' | ||||||
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | ||||||
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
| . "$TEST_DIRECTORY"/lib-terminal.sh | . "$TEST_DIRECTORY"/lib-terminal.sh | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='diff --no-index' | test_description='diff --no-index' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup' ' | test_expect_success 'setup' ' | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='behavior of diff when reading objects in a partial clone' | test_description='behavior of diff when reading objects in a partial clone' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'git show batches blobs' ' | test_expect_success 'git show batches blobs' ' | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='patching from inconvenient places' | test_description='patching from inconvenient places' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup' ' | test_expect_success 'setup' ' | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='git apply with weird postimage filenames' | test_description='git apply with weird postimage filenames' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup' ' | test_expect_success 'setup' ' | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='log/show --expand-tabs' | test_description='log/show --expand-tabs' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| HT="	" | HT="	" | ||||||
|  |  | ||||||
|  | @ -1,6 +1,8 @@ | ||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  |  | ||||||
| test_description='test custom script in place of pack-objects' | test_description='test custom script in place of pack-objects' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'create some history to fetch' ' | test_expect_success 'create some history to fetch' ' | ||||||
|  |  | ||||||
|  | @ -1,6 +1,8 @@ | ||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  |  | ||||||
| test_description='test noop fetch negotiator' | test_description='test noop fetch negotiator' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'noop negotiator does not emit any "have"' ' | test_expect_success 'noop negotiator does not emit any "have"' ' | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ test_description='test cloning a repository with detached HEAD' | ||||||
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | ||||||
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| head_is_detached() { | head_is_detached() { | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ test_description='tests for git clone -c key=value' | ||||||
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | ||||||
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'clone -c sets config in cloned repo' ' | test_expect_success 'clone -c sets config in cloned repo' ' | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='Test shallow cloning of repos with submodules' | test_description='Test shallow cloning of repos with submodules' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| pwd=$(pwd) | pwd=$(pwd) | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ test_description='Test cloning repos with submodules using remote-tracking branc | ||||||
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | ||||||
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| pwd=$(pwd) | pwd=$(pwd) | ||||||
|  |  | ||||||
|  | @ -1,6 +1,8 @@ | ||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  |  | ||||||
| test_description='test handling of --alternate-refs traversal' | test_description='test handling of --alternate-refs traversal' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| # Avoid test_commit because we want a specific and known set of refs: | # Avoid test_commit because we want a specific and known set of refs: | ||||||
|  |  | ||||||
|  | @ -1,6 +1,8 @@ | ||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  |  | ||||||
| test_description='basic git merge-index / git-merge-one-file tests' | test_description='basic git merge-index / git-merge-one-file tests' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup diverging branches' ' | test_expect_success 'setup diverging branches' ' | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='for-each-ref errors for broken refs' | test_description='for-each-ref errors for broken refs' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| ZEROS=$ZERO_OID | ZEROS=$ZERO_OID | ||||||
|  |  | ||||||
|  | @ -8,6 +8,8 @@ | ||||||
|  |  | ||||||
|  |  | ||||||
| test_description='Test criss-cross merge' | test_description='Test criss-cross merge' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'prepare repository' ' | test_expect_success 'prepare repository' ' | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ test_description='per path merge controlled by merge attribute' | ||||||
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | ||||||
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success setup ' | test_expect_success setup ' | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ test_description='ask merge-recursive to merge binary files' | ||||||
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | ||||||
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success setup ' | test_expect_success setup ' | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ test_description='merging when a directory was replaced with a symlink' | ||||||
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | ||||||
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'create a commit where dir a/b changed to symlink' ' | test_expect_success 'create a commit where dir a/b changed to symlink' ' | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ | ||||||
| test_description='merge with sparse files' | test_description='merge with sparse files' | ||||||
|  |  | ||||||
| TEST_CREATE_REPO_NO_TEMPLATE=1 | TEST_CREATE_REPO_NO_TEMPLATE=1 | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| # test_file $filename $content | # test_file $filename $content | ||||||
|  |  | ||||||
|  | @ -63,7 +63,7 @@ test_expect_success '"mixed" reset is not allowed in bare' ' | ||||||
| 	test_must_fail git reset --mixed HEAD^ | 	test_must_fail git reset --mixed HEAD^ | ||||||
| ' | ' | ||||||
|  |  | ||||||
| test_expect_success !SANITIZE_LEAK '"soft" reset is allowed in bare' ' | test_expect_success '"soft" reset is allowed in bare' ' | ||||||
| 	git reset --soft HEAD^ && | 	git reset --soft HEAD^ && | ||||||
| 	git show --pretty=format:%s >out && | 	git show --pretty=format:%s >out && | ||||||
| 	echo one >expect && | 	echo one >expect && | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ test_description='commit-msg hook' | ||||||
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | ||||||
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'with no hook' ' | test_expect_success 'with no hook' ' | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ test_description='per-repo forced setting of email address' | ||||||
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | ||||||
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup a likely user.useConfigOnly use case' ' | test_expect_success 'setup a likely user.useConfigOnly use case' ' | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
|  |  | ||||||
| test_description='ignored hook warning' | test_description='ignored hook warning' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success setup ' | test_expect_success setup ' | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ test_description='git merge | ||||||
|  |  | ||||||
| Testing the resolve strategy.' | Testing the resolve strategy.' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup' ' | test_expect_success 'setup' ' | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ This test runs git merge --signoff and makes sure that it works. | ||||||
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | ||||||
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| # Setup test files | # Setup test files | ||||||
|  |  | ||||||
|  | @ -1,6 +1,8 @@ | ||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  |  | ||||||
| test_description='help.autocorrect finding a match' | test_description='help.autocorrect finding a match' | ||||||
|  |  | ||||||
|  | TEST_PASSES_SANITIZE_LEAK=true | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup' ' | test_expect_success 'setup' ' | ||||||
|  |  | ||||||
|  | @ -5,7 +5,6 @@ | ||||||
|  |  | ||||||
| test_description='git svn dcommit can commit renames of files with ugly names' | test_description='git svn dcommit can commit renames of files with ugly names' | ||||||
|  |  | ||||||
| TEST_FAILS_SANITIZE_LEAK=true |  | ||||||
| . ./lib-git-svn.sh | . ./lib-git-svn.sh | ||||||
|  |  | ||||||
| test_expect_success 'load repository with strange names' ' | test_expect_success 'load repository with strange names' ' | ||||||
|  |  | ||||||
|  | @ -4,7 +4,6 @@ | ||||||
|  |  | ||||||
| test_description='git svn creates empty directories' | test_description='git svn creates empty directories' | ||||||
|  |  | ||||||
| TEST_FAILS_SANITIZE_LEAK=true |  | ||||||
| . ./lib-git-svn.sh | . ./lib-git-svn.sh | ||||||
|  |  | ||||||
| test_expect_success 'initialize repo' ' | test_expect_success 'initialize repo' ' | ||||||
|  |  | ||||||
|  | @ -5,7 +5,6 @@ | ||||||
|  |  | ||||||
| test_description='git svn propset tests' | test_description='git svn propset tests' | ||||||
|  |  | ||||||
| TEST_FAILS_SANITIZE_LEAK=true |  | ||||||
| . ./lib-git-svn.sh | . ./lib-git-svn.sh | ||||||
|  |  | ||||||
| test_expect_success 'setup propset via import' ' | test_expect_success 'setup propset via import' ' | ||||||
|  |  | ||||||
|  | @ -9,7 +9,6 @@ This test uses git to clone a Subversion repository that contains empty | ||||||
| directories, and checks that corresponding directories are created in the | directories, and checks that corresponding directories are created in the | ||||||
| local Git repository with placeholder files.' | local Git repository with placeholder files.' | ||||||
|  |  | ||||||
| TEST_FAILS_SANITIZE_LEAK=true |  | ||||||
| . ./lib-git-svn.sh | . ./lib-git-svn.sh | ||||||
|  |  | ||||||
| GIT_REPO=git-svn-repo | GIT_REPO=git-svn-repo | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano