"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Tracey Emery <tracey@traceyemery.com>
Subject:
Re: Move got_opentempfd out of got_repo_open
To:
gameoftrees@openbsd.org
Date:
Mon, 6 Jun 2022 15:28:16 -0600

Download raw body.

Thread
  • Tracey Emery:

    Move got_opentempfd out of got_repo_open

  • Let's give this one a look over. This passes all regress and tog works.
    This should be tested thoroughly before going in. Comments? Suggestions?
    
    -- 
    
    Tracey Emery
    
    diff 9fdde394b8229cc24073709050d2ef7a1443b0a9 54f90a648e6d99ac814b466722564de55c4cf1e6
    blob - d88f23ce5b63a9d80862b5fac05c212d054a0b74
    blob + d74dbf2ed450afc60b916fc494faef2dbcc8d982
    --- got/got.c
    +++ got/got.c
    @@ -715,6 +715,7 @@ cmd_import(int argc, char *argv[])
     	struct got_pathlist_head ignores;
     	struct got_pathlist_entry *pe;
     	int preserve_logmsg = 0;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&ignores);
     
    @@ -773,9 +774,15 @@ cmd_import(int argc, char *argv[])
     	error = get_gitconfig_path(&gitconfig_path);
     	if (error)
     		goto done;
    -	error = got_repo_open(&repo, repo_path, gitconfig_path);
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +	error = got_repo_open(&repo, repo_path, gitconfig_path, pack_fds);
     	if (error)
     		goto done;
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
     
     	error = get_author(&author, repo, NULL);
     	if (error)
    @@ -1484,6 +1491,7 @@ cmd_clone(int argc, char *argv[])
     	char *git_url = NULL;
     	int verbosity = 0, fetch_all_branches = 0, mirror_references = 0;
     	int list_refs_only = 0;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&refs);
     	TAILQ_INIT(&symrefs);
    @@ -1628,9 +1636,15 @@ cmd_clone(int argc, char *argv[])
     		error = got_repo_init(repo_path);
     		if (error)
     			goto done;
    -		error = got_repo_open(&repo, repo_path, NULL);
    +		error = got_repo_pack_fds_open(&pack_fds);
    +		if (error != NULL)
    +			goto done;
    +		error = got_repo_open(&repo, repo_path, NULL, pack_fds);
     		if (error)
     			goto done;
    +		error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
     	}
     
     	fpa.last_scaled_size[0] = '\0';
    @@ -2212,6 +2226,7 @@ cmd_fetch(int argc, char *argv[])
     	struct got_fetch_progress_arg fpa;
     	int verbosity = 0, fetch_all_branches = 0, list_refs_only = 0;
     	int delete_refs = 0, replace_tags = 0, delete_remote = 0;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&refs);
     	TAILQ_INIT(&symrefs);
    @@ -2333,10 +2348,18 @@ cmd_fetch(int argc, char *argv[])
     		}
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
     	if (error)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	if (delete_remote) {
     		error = delete_refs_for_remote(repo, remote_name);
     		goto done; /* nothing else to do */
    @@ -2848,6 +2871,7 @@ cmd_checkout(int argc, char *argv[])
     	int ch, same_path_prefix, allow_nonempty = 0, verbosity = 0;
     	struct got_pathlist_head paths;
     	struct got_checkout_progress_arg cpa;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&paths);
     
    @@ -2936,10 +2960,14 @@ cmd_checkout(int argc, char *argv[])
     	got_path_strip_trailing_slashes(repo_path);
     	got_path_strip_trailing_slashes(worktree_path);
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	/* Pre-create work tree path for unveil(2) */
     	error = got_path_mkdir(worktree_path);
     	if (error) {
    @@ -2979,6 +3007,9 @@ cmd_checkout(int argc, char *argv[])
     		goto done;
     	}
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error != NULL)
    +		goto done;
     	if (commit_id_str) {
     		struct got_reflist_head refs;
     		TAILQ_INIT(&refs);
    @@ -3281,11 +3312,20 @@ wrap_not_worktree_error(const struct got_error *orig_e
     	const struct got_error *err;
     	struct got_repository *repo;
     	static char msg[512];
    +	int *pack_fds = NULL;
     
    -	err = got_repo_open(&repo, path, NULL);
    +	err = got_repo_pack_fds_open(&pack_fds);
     	if (err)
    +		return err;
    +
    +	err = got_repo_open(&repo, path, NULL, pack_fds);
    +	if (err)
     		return orig_err;
     
    +	err = got_repo_pack_fds_close(pack_fds);
    +	if (err)
    +		return err;
    +
     	snprintf(msg, sizeof(msg),
     	    "'got %s' needs a work tree in addition to a git repository\n"
     	    "Work trees can be checked out from this Git repository with "
    @@ -3311,6 +3351,7 @@ cmd_update(int argc, char *argv[])
     	struct got_pathlist_entry *pe;
     	int ch, verbosity = 0;
     	struct got_update_progress_arg upa;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&paths);
     
    @@ -3358,8 +3399,12 @@ cmd_update(int argc, char *argv[])
     	if (error)
     		goto done;
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = got_repo_open(&repo, got_worktree_get_repo_path(worktree),
    -	    NULL);
    +	    NULL, pack_fds);
     	if (error != NULL)
     		goto done;
     
    @@ -3458,6 +3503,10 @@ cmd_update(int argc, char *argv[])
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	if (upa.did_something) {
     		printf("Updated to %s: %s\n",
     		    got_worktree_get_head_ref_name(worktree), commit_id_str);
    @@ -4120,6 +4169,7 @@ cmd_log(int argc, char *argv[])
     	const char *errstr;
     	struct got_reflist_head refs;
     	struct got_reflist_object_id_map *refs_idmap = NULL;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&refs);
     
    @@ -4227,10 +4277,18 @@ cmd_log(int argc, char *argv[])
     		goto done;
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	error = apply_unveil(got_repo_get_path(repo), 1,
     	    worktree ? got_worktree_get_root_path(worktree) : NULL);
     	if (error)
    @@ -4579,6 +4637,7 @@ cmd_diff(int argc, char *argv[])
     	struct got_pathlist_head paths;
     	struct got_pathlist_entry *pe;
     	FILE *f1 = NULL, *f2 = NULL;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&refs);
     	TAILQ_INIT(&paths);
    @@ -4660,7 +4719,11 @@ cmd_diff(int argc, char *argv[])
     		}
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
     	free(repo_path);
     	if (error != NULL)
     		goto done;
    @@ -5061,6 +5124,7 @@ cmd_blame(int argc, char *argv[])
     	struct blame_cb_args bca;
     	int ch, obj_type, i;
     	off_t filesize;
    +	int *pack_fds = NULL;
     
     	memset(&bca, 0, sizeof(bca));
     
    @@ -5124,10 +5188,14 @@ cmd_blame(int argc, char *argv[])
     		}
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	if (worktree) {
     		const char *prefix = got_worktree_get_path_prefix(worktree);
     		char *p;
    @@ -5258,6 +5326,8 @@ done:
     		if (error == NULL)
     			error = close_err;
     	}
    +	if (error == NULL)
    +		error = got_repo_pack_fds_close(pack_fds);
     	if (bca.lines) {
     		for (i = 0; i < bca.nlines; i++) {
     			struct blame_line *bline = &bca.lines[i];
    @@ -5402,6 +5472,7 @@ cmd_tree(int argc, char *argv[])
     	char *commit_id_str = NULL;
     	int show_ids = 0, recurse = 0;
     	int ch;
    +	int *pack_fds = NULL;
     
     #ifndef PROFILE
     	if (pledge("stdio rpath wpath cpath flock proc exec sendfd unveil",
    @@ -5470,10 +5541,18 @@ cmd_tree(int argc, char *argv[])
     		}
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	if (worktree) {
     		const char *prefix = got_worktree_get_path_prefix(worktree);
     		char *p;
    @@ -5624,7 +5703,9 @@ cmd_status(int argc, char *argv[])
     	struct got_pathlist_head paths;
     	struct got_pathlist_entry *pe;
     	int ch, i, no_ignores = 0;
    +	int *pack_fds = NULL;
     
    +
     	TAILQ_INIT(&paths);
     
     	memset(&st, 0, sizeof(st));
    @@ -5690,11 +5771,19 @@ cmd_status(int argc, char *argv[])
     		goto done;
     	}
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = got_repo_open(&repo, got_worktree_get_repo_path(worktree),
    -	    NULL);
    +	    NULL, pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = apply_unveil(got_repo_get_path(repo), 1,
     	    got_worktree_get_root_path(worktree));
     	if (error)
    @@ -5848,6 +5937,7 @@ cmd_ref(int argc, char *argv[])
     	int ch, do_list = 0, do_delete = 0, sort_by_time = 0;
     	const char *obj_arg = NULL, *symref_target= NULL;
     	char *refname = NULL;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "c:dr:ls:t")) != -1) {
     		switch (ch) {
    @@ -5953,10 +6043,18 @@ cmd_ref(int argc, char *argv[])
     		}
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     #ifndef PROFILE
     	if (do_list) {
     		/* Remove "cpath" promise. */
    @@ -6238,6 +6336,7 @@ cmd_branch(int argc, char *argv[])
     	struct got_pathlist_entry *pe;
     	struct got_object_id *commit_id = NULL;
     	char *commit_id_str = NULL;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&paths);
     
    @@ -6324,10 +6423,14 @@ cmd_branch(int argc, char *argv[])
     		}
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     #ifndef PROFILE
     	if (do_list || do_show) {
     		/* Remove "cpath" promise. */
    @@ -6342,6 +6445,10 @@ cmd_branch(int argc, char *argv[])
     	if (error)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	if (do_show)
     		error = show_current_branch(repo, worktree);
     	else if (do_list)
    @@ -6796,6 +6903,7 @@ cmd_tag(int argc, char *argv[])
     	char *gitconfig_path = NULL, *tagger = NULL;
     	const char *tag_name, *commit_id_arg = NULL, *tagmsg = NULL;
     	int ch, do_list = 0;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "c:m:r:l")) != -1) {
     		switch (ch) {
    @@ -6870,15 +6978,23 @@ cmd_tag(int argc, char *argv[])
     		}
     	}
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	if (do_list) {
     		if (worktree) {
     			/* Release work tree lock. */
     			got_worktree_close(worktree);
     			worktree = NULL;
     		}
    -		error = got_repo_open(&repo, repo_path, NULL);
    +		error = got_repo_open(&repo, repo_path, NULL, pack_fds);
     		if (error != NULL)
     			goto done;
    +		error = got_repo_pack_fds_close(pack_fds);
    +		if (error)
    +			goto done;
    +
     #ifndef PROFILE
     		/* Remove "cpath" promise. */
     		if (pledge("stdio rpath wpath flock proc exec sendfd unveil",
    @@ -6893,9 +7009,13 @@ cmd_tag(int argc, char *argv[])
     		error = get_gitconfig_path(&gitconfig_path);
     		if (error)
     			goto done;
    -		error = got_repo_open(&repo, repo_path, gitconfig_path);
    +		error = got_repo_open(&repo, repo_path, gitconfig_path,
    +		    pack_fds);
     		if (error != NULL)
     			goto done;
    +		error = got_repo_pack_fds_close(pack_fds);
    +		if (error)
    +			goto done;
     
     		error = get_author(&tagger, repo, worktree);
     		if (error)
    @@ -6976,6 +7096,7 @@ cmd_add(int argc, char *argv[])
     	struct got_pathlist_head paths;
     	struct got_pathlist_entry *pe;
     	int ch, can_recurse = 0, no_ignores = 0;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&paths);
     
    @@ -7017,11 +7138,19 @@ cmd_add(int argc, char *argv[])
     		goto done;
     	}
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = got_repo_open(&repo, got_worktree_get_repo_path(worktree),
    -	    NULL);
    +	    NULL, pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	error = apply_unveil(got_repo_get_path(repo), 1,
     	    got_worktree_get_root_path(worktree));
     	if (error)
    @@ -7111,6 +7240,7 @@ cmd_remove(int argc, char *argv[])
     	struct got_pathlist_entry *pe;
     	int ch, delete_local_mods = 0, can_recurse = 0, keep_on_disk = 0, i;
     	int ignore_missing_paths = 0;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&paths);
     
    @@ -7171,11 +7301,19 @@ cmd_remove(int argc, char *argv[])
     		goto done;
     	}
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = got_repo_open(&repo, got_worktree_get_repo_path(worktree),
    -	    NULL);
    +	    NULL, pack_fds);
     	if (error)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	error = apply_unveil(got_repo_get_path(repo), 1,
     	    got_worktree_get_root_path(worktree));
     	if (error)
    @@ -7327,6 +7465,7 @@ cmd_patch(int argc, char *argv[])
     	char *cwd = NULL;
     	int ch, nop = 0, strip = -1, reverse = 0;
     	int patchfd;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "np:R")) != -1) {
     		switch (ch) {
    @@ -7373,11 +7512,19 @@ cmd_patch(int argc, char *argv[])
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	const char *repo_path = got_worktree_get_repo_path(worktree);
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	error = apply_unveil(got_repo_get_path(repo), 0,
     	    got_worktree_get_root_path(worktree));
     	if (error != NULL)
    @@ -7552,6 +7699,7 @@ cmd_revert(int argc, char *argv[])
     	FILE *patch_script_file = NULL;
     	const char *patch_script_path = NULL;
     	struct choose_patch_arg cpa;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&paths);
     
    @@ -7597,8 +7745,12 @@ cmd_revert(int argc, char *argv[])
     		goto done;
     	}
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = got_repo_open(&repo, got_worktree_get_repo_path(worktree),
    -	    NULL);
    +	    NULL, pack_fds);
     	if (error != NULL)
     		goto done;
     
    @@ -7661,6 +7813,9 @@ done:
     		if (error == NULL)
     			error = close_err;
     	}
    +	if (error == NULL)
    +		error = got_repo_pack_fds_close(pack_fds);
    +
     	if (worktree)
     		got_worktree_close(worktree);
     	free(path);
    @@ -7836,6 +7991,7 @@ cmd_commit(int argc, char *argv[])
     	int ch, rebase_in_progress, histedit_in_progress, preserve_logmsg = 0;
     	int allow_bad_symlinks = 0, non_interactive = 0, merge_in_progress = 0;
     	struct got_pathlist_head paths;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&paths);
     	cl_arg.logmsg_path = NULL;
    @@ -7903,8 +8059,11 @@ cmd_commit(int argc, char *argv[])
     	error = get_gitconfig_path(&gitconfig_path);
     	if (error)
     		goto done;
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
     	error = got_repo_open(&repo, got_worktree_get_repo_path(worktree),
    -	    gitconfig_path);
    +	    gitconfig_path, pack_fds);
     	if (error != NULL)
     		goto done;
     
    @@ -7977,6 +8136,8 @@ done:
     		if (error == NULL)
     			error = close_err;
     	}
    +	if (error == NULL)
    +		error = got_repo_pack_fds_close(pack_fds);
     	if (worktree)
     		got_worktree_close(worktree);
     	free(cwd);
    @@ -8215,6 +8376,7 @@ cmd_send(int argc, char *argv[])
     	int verbosity = 0, overwrite_refs = 0;
     	int send_all_branches = 0, send_all_tags = 0;
     	struct got_reference *ref = NULL;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&branches);
     	TAILQ_INIT(&tags);
    @@ -8316,10 +8478,18 @@ cmd_send(int argc, char *argv[])
     		}
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
     	if (error)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	if (worktree) {
     		worktree_conf = got_worktree_get_gotconfig(worktree);
     		if (worktree_conf) {
    @@ -8561,6 +8731,7 @@ cmd_cherrypick(int argc, char *argv[])
     	struct got_object_qid *pid;
     	int ch;
     	struct got_update_progress_arg upa;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "")) != -1) {
     		switch (ch) {
    @@ -8594,11 +8765,19 @@ cmd_cherrypick(int argc, char *argv[])
     		goto done;
     	}
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = got_repo_open(&repo, got_worktree_get_repo_path(worktree),
    -	    NULL);
    +	    NULL, pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	error = apply_unveil(got_repo_get_path(repo), 0,
     	    got_worktree_get_root_path(worktree));
     	if (error)
    @@ -8659,6 +8838,7 @@ cmd_backout(int argc, char *argv[])
     	struct got_object_qid *pid;
     	int ch;
     	struct got_update_progress_arg upa;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "")) != -1) {
     		switch (ch) {
    @@ -8691,11 +8871,19 @@ cmd_backout(int argc, char *argv[])
     		goto done;
     	}
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = got_repo_open(&repo, got_worktree_get_repo_path(worktree),
    -	    NULL);
    +	    NULL, pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	error = apply_unveil(got_repo_get_path(repo), 0,
     	    got_worktree_get_root_path(worktree));
     	if (error)
    @@ -9322,6 +9510,7 @@ cmd_rebase(int argc, char *argv[])
     	const struct got_object_id_queue *parent_ids;
     	struct got_object_qid *qid, *pid;
     	struct got_update_progress_arg upa;
    +	int *pack_fds = NULL;
     
     	STAILQ_INIT(&commits);
     	TAILQ_INIT(&merged_paths);
    @@ -9401,8 +9590,13 @@ cmd_rebase(int argc, char *argv[])
     		}
     	}
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = got_repo_open(&repo,
    -	    worktree ? got_worktree_get_repo_path(worktree) : cwd, NULL);
    +	    worktree ? got_worktree_get_repo_path(worktree) : cwd, NULL,
    +	    pack_fds);
     	if (error != NULL)
     		goto done;
     
    @@ -9606,6 +9800,10 @@ cmd_rebase(int argc, char *argv[])
     		}
     	}
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	pid = NULL;
     	STAILQ_FOREACH(qid, &commits, entry) {
     
    @@ -10541,6 +10739,7 @@ cmd_histedit(int argc, char *argv[])
     	struct got_object_qid *pid;
     	struct got_histedit_list histedit_cmds;
     	struct got_histedit_list_entry *hle;
    +	int *pack_fds = NULL;
     
     	STAILQ_INIT(&commits);
     	TAILQ_INIT(&histedit_cmds);
    @@ -10675,12 +10874,19 @@ cmd_histedit(int argc, char *argv[])
     		}
     	}
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	if (list_backups || delete_backups) {
     		error = got_repo_open(&repo,
     		    worktree ? got_worktree_get_repo_path(worktree) : cwd,
    -		    NULL);
    +		    NULL, pack_fds);
     		if (error != NULL)
     			goto done;
    +		error = got_repo_pack_fds_close(pack_fds);
    +		if (error)
    +			goto done;
     		error = apply_unveil(got_repo_get_path(repo), 0,
     		    worktree ? got_worktree_get_root_path(worktree) : NULL);
     		if (error)
    @@ -10691,8 +10897,12 @@ cmd_histedit(int argc, char *argv[])
     		goto done; /* nothing else to do */
     	}
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = got_repo_open(&repo, got_worktree_get_repo_path(worktree),
    -	    NULL);
    +	    NULL, pack_fds);
     	if (error != NULL)
     		goto done;
     
    @@ -11043,6 +11253,7 @@ cmd_histedit(int argc, char *argv[])
     	} else
     		error = histedit_complete(worktree, fileindex, tmp_branch,
     		    branch, repo);
    +	error = got_repo_pack_fds_close(pack_fds);
     done:
     	got_object_id_queue_free(&commits);
     	histedit_free_list(&histedit_cmds);
    @@ -11085,6 +11296,7 @@ cmd_integrate(int argc, char *argv[])
     	struct got_object_id *commit_id = NULL, *base_commit_id = NULL;
     	int ch;
     	struct got_update_progress_arg upa;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "")) != -1) {
     		switch (ch) {
    @@ -11123,11 +11335,19 @@ cmd_integrate(int argc, char *argv[])
     	if (error)
     		goto done;
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = got_repo_open(&repo, got_worktree_get_repo_path(worktree),
    -	    NULL);
    +	    NULL, pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	error = apply_unveil(got_repo_get_path(repo), 0,
     	    got_worktree_get_root_path(worktree));
     	if (error)
    @@ -11236,6 +11456,7 @@ cmd_merge(int argc, char *argv[])
     	struct got_update_progress_arg upa;
     	struct got_object_id *merge_commit_id = NULL;
     	char *branch_name = NULL;
    +	int *pack_fds = NULL;
     
     	memset(&upa, 0, sizeof(upa));
     
    @@ -11287,11 +11508,20 @@ cmd_merge(int argc, char *argv[])
     		goto done;
     	}
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = got_repo_open(&repo,
    -	    worktree ? got_worktree_get_repo_path(worktree) : cwd, NULL);
    +	    worktree ? got_worktree_get_repo_path(worktree) : cwd, NULL,
    +	    pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	error = apply_unveil(got_repo_get_path(repo), 0,
     	    worktree ? got_worktree_get_root_path(worktree) : NULL);
     	if (error)
    @@ -11526,6 +11756,7 @@ cmd_stage(int argc, char *argv[])
     	FILE *patch_script_file = NULL;
     	const char *patch_script_path = NULL;
     	struct choose_patch_arg cpa;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&paths);
     
    @@ -11575,11 +11806,19 @@ cmd_stage(int argc, char *argv[])
     		goto done;
     	}
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = got_repo_open(&repo, got_worktree_get_repo_path(worktree),
    -	    NULL);
    +	    NULL, pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	if (patch_script_path) {
     		patch_script_file = fopen(patch_script_path, "re");
     		if (patch_script_file == NULL) {
    @@ -11654,6 +11893,7 @@ cmd_unstage(int argc, char *argv[])
     	FILE *patch_script_file = NULL;
     	const char *patch_script_path = NULL;
     	struct choose_patch_arg cpa;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&paths);
     
    @@ -11695,11 +11935,19 @@ cmd_unstage(int argc, char *argv[])
     		goto done;
     	}
     
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
     	error = got_repo_open(&repo, got_worktree_get_repo_path(worktree),
    -	    NULL);
    +	    NULL, pack_fds);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	if (patch_script_path) {
     		patch_script_file = fopen(patch_script_path, "re");
     		if (patch_script_file == NULL) {
    @@ -11938,6 +12186,7 @@ cmd_cat(int argc, char *argv[])
     	struct got_commit_object *commit = NULL;
     	int ch, obj_type, i, force_path = 0;
     	struct got_reflist_head refs;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&refs);
     
    @@ -12001,11 +12250,19 @@ cmd_cat(int argc, char *argv[])
     			return got_error_from_errno("strdup");
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
     	free(repo_path);
     	if (error != NULL)
     		goto done;
     
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
    +
     	error = apply_unveil(got_repo_get_path(repo), 1, NULL);
     	if (error)
     		goto done;
    blob - 59c11d1ab01684d8a2f16d934fb1d6870d7ac871
    blob + 7298490d60cffe7576fa166b8a73fba0d14bb76a
    --- gotadmin/gotadmin.c
    +++ gotadmin/gotadmin.c
    @@ -275,6 +275,7 @@ cmd_info(int argc, char *argv[])
     	int ch, npackfiles, npackedobj, nobj;
     	off_t packsize, loose_size;
     	char scaled[FMT_SCALED_STRSIZE];
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "r:")) != -1) {
     		switch (ch) {
    @@ -304,7 +305,10 @@ cmd_info(int argc, char *argv[])
     		if (error)
     			goto done;
     	}
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
     	if (error)
     		goto done;
     #ifndef PROFILE
    @@ -371,6 +375,7 @@ cmd_info(int argc, char *argv[])
     done:
     	if (repo)
     		got_repo_close(repo);
    +	error = got_repo_pack_fds_close(pack_fds);
     	free(repo_path);
     	return error;
     }
    @@ -629,6 +634,7 @@ cmd_pack(int argc, char *argv[])
     	struct got_reflist_head exclude_refs;
     	struct got_reflist_head include_refs;
     	struct got_reflist_entry *re, *new;
    +	int *pack_fds = NULL;
     
     	TAILQ_INIT(&exclude_args);
     	TAILQ_INIT(&exclude_refs);
    @@ -675,7 +681,10 @@ cmd_pack(int argc, char *argv[])
     		if (error)
     			goto done;
     	}
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
     	if (error)
     		goto done;
     
    @@ -731,6 +740,9 @@ cmd_pack(int argc, char *argv[])
     			printf("\n");
     		goto done;
     	}
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
     
     	error = got_object_id_str(&id_str, pack_hash);
     	if (error)
    @@ -775,6 +787,7 @@ cmd_indexpack(int argc, char *argv[])
     	char *id_str = NULL;
     	struct got_pack_progress_arg ppa;
     	FILE *packfile = NULL;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "")) != -1) {
     		switch (ch) {
    @@ -800,9 +813,15 @@ cmd_indexpack(int argc, char *argv[])
     		err(1, "pledge");
     #endif
     
    -	error = got_repo_open(&repo, packfile_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +	error = got_repo_open(&repo, packfile_path, NULL, pack_fds);
     	if (error)
     		goto done;
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
     
     	error = apply_unveil(got_repo_get_path_git_dir(repo), 0);
     	if (error)
    @@ -943,6 +962,7 @@ cmd_listpack(int argc, char *argv[])
     	struct gotadmin_list_pack_cb_args lpa;
     	FILE *packfile = NULL;
     	int show_stats = 0, human_readable = 0;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "hs")) != -1) {
     		switch (ch) {
    @@ -972,9 +992,15 @@ cmd_listpack(int argc, char *argv[])
     	    NULL) == -1)
     		err(1, "pledge");
     #endif
    -	error = got_repo_open(&repo, packfile_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +	error = got_repo_open(&repo, packfile_path, NULL, pack_fds);
     	if (error)
     		goto done;
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
     #ifndef PROFILE
     	/* Remove "cpath" promise. */
     	if (pledge("stdio rpath wpath flock proc exec sendfd unveil",
    @@ -1120,6 +1146,7 @@ cmd_cleanup(int argc, char *argv[])
     	char scaled_diff[FMT_SCALED_STRSIZE];
     	char **extensions;
     	int nextensions, i;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "apr:nq")) != -1) {
     		switch (ch) {
    @@ -1161,9 +1188,15 @@ cmd_cleanup(int argc, char *argv[])
     		if (error)
     			goto done;
     	}
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
     	if (error)
     		goto done;
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
     
     	error = apply_unveil(got_repo_get_path_git_dir(repo), 0);
     	if (error)
    blob - 613976ee0e8a3f55e862ceb0aa730fd85f3e46e3
    blob + e36610bb8f42b4e466bde3c7d20d2138169f08df
    --- gotweb/gotweb.c
    +++ gotweb/gotweb.c
    @@ -2784,6 +2784,7 @@ gw_get_repo_age(char **repo_age, struct gw_trans *gw_t
     	struct got_reflist_head refs;
     	struct got_reflist_entry *re;
     	time_t committer_time = 0, cmp_time = 0;
    +	int *pack_fds = NULL;
     
     	*repo_age = NULL;
     	TAILQ_INIT(&refs);
    @@ -2794,9 +2795,15 @@ gw_get_repo_age(char **repo_age, struct gw_trans *gw_t
     	if (gw_trans->repo)
     		repo = gw_trans->repo;
     	else {
    -		error = got_repo_open(&repo, dir, NULL);
    +		error = got_repo_pack_fds_open(&pack_fds);
    +		if (error != NULL)
    +			goto done;
    +		error = got_repo_open(&repo, dir, NULL, pack_fds);
     		if (error)
     			return error;
    +		error = got_repo_pack_fds_close(pack_fds);
    +		if (error)
    +			return error;
     	}
     
     	error = got_ref_list(&refs, repo, "refs/heads",
    @@ -2955,15 +2962,23 @@ gw_get_repo_owner(char **owner, struct gw_trans *gw_tr
     	const struct got_error *error = NULL, *close_err;
     	struct got_repository *repo;
     	const char *gitconfig_owner;
    +	int *pack_fds = NULL;
     
     	*owner = NULL;
     
     	if (gw_trans->gw_conf->got_show_repo_owner == 0)
     		return NULL;
     
    -	error = got_repo_open(&repo, dir, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		return error;
    +	error = got_repo_open(&repo, dir, NULL, pack_fds);
     	if (error)
     		return error;
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		return error;
    +
     	gitconfig_owner = got_repo_get_gitconfig_owner(repo);
     	if (gitconfig_owner) {
     		*owner = strdup(gitconfig_owner);
    @@ -3772,10 +3787,18 @@ gw_get_header(struct gw_trans *gw_trans, struct gw_hea
     	char *in_repo_path = NULL;
     	struct got_object_id *id = NULL;
     	struct got_reference *ref;
    +	int *pack_fds = NULL;
     
    -	error = got_repo_open(&gw_trans->repo, gw_trans->repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
    +	if (error != NULL)
    +		goto done;
    +	error = got_repo_open(&gw_trans->repo, gw_trans->repo_path, NULL,
    +	    pack_fds);
     	if (error)
     		return error;
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		return error;
     
     	if (gw_trans->commit_id == NULL || gw_trans->action == GW_COMMITS ||
     	    gw_trans->action == GW_BRIEFS || gw_trans->action == GW_SUMMARY ||
    blob - b6e44e8b40b8476a471c53fd10cffd4a7ff3b32d
    blob + 5e5b1f7c71fc56334193c602e3ac3da456f3b6c2
    --- include/got_repository.h
    +++ include/got_repository.h
    @@ -20,7 +20,7 @@ struct got_tag_object;
     
     /* Open and close repositories. */
     const struct got_error *got_repo_open(struct got_repository**, const char *,
    -    const char *);
    +    const char *, int *);
     const struct got_error *got_repo_close(struct got_repository*);
     
     /* Obtain the on-disk path to the repository. */
    @@ -177,3 +177,12 @@ const struct got_error *got_repo_get_loose_object_info
     /* Obtain the number and size of packed objects in the repository. */
     const struct got_error *got_repo_get_packfile_info(int *npackfiles,
         int *nobjects, off_t *total_packsize, struct got_repository *);
    +
    +/* Create an array of file descriptors to hand over to got_repo_open for pack */
    +const struct got_error *got_repo_pack_fds_open(int **);
    +
    +/* Create an array of file descriptors to hand over to got_repo_open for pack */
    +const struct got_error *got_repo_pack_fds_copy(int **, struct got_repository *);
    +
    +/* Close the array of file descriptors handed over to got_repo_open for pack */
    +const struct got_error *got_repo_pack_fds_close(int *);
    blob - 5be66db732b6a51d032ae835a233ef3cbcd3733b
    blob + e00a949d33adcaf5783b0d9f9769b07a23748ad8
    --- lib/repository.c
    +++ lib/repository.c
    @@ -68,6 +68,8 @@
     #define nitems(_a) (sizeof(_a) / sizeof((_a)[0]))
     #endif
     
    +#define GOT_PACK_NUM_TEMPFILES		GOT_PACK_CACHE_SIZE * 2
    +
     RB_PROTOTYPE(got_packidx_bloom_filter_tree, got_packidx_bloom_filter, entry,
         got_packidx_bloom_filter_cmp);
     
    @@ -247,6 +249,67 @@ done:
     }
     
     const struct got_error *
    +got_repo_pack_fds_open(int **pack_fds)
    +{
    +	const struct got_error *err = NULL;
    +	int i, pack_fds_tmp[GOT_PACK_NUM_TEMPFILES];
    +
    +	*pack_fds = calloc(GOT_PACK_NUM_TEMPFILES, sizeof(**pack_fds));
    +	if (*pack_fds == NULL)
    +		return got_error_from_errno("calloc");
    +
    +	for (i = 0; i < GOT_PACK_NUM_TEMPFILES; i++) {
    +		pack_fds_tmp[i] = got_opentempfd();
    +		if (pack_fds_tmp[i] == -1)
    +			return got_error_from_errno("got_opentempfd");
    +	}
    +	memcpy(*pack_fds, pack_fds_tmp, sizeof(pack_fds_tmp));
    +	return err;
    +}
    +
    +const struct got_error *
    +got_repo_pack_fds_copy(int **pack_fds, struct got_repository *repo)
    +{
    +	const struct got_error *err = NULL;
    +	int i, pack_fds_tmp[GOT_PACK_NUM_TEMPFILES];
    +
    +	*pack_fds = calloc(GOT_PACK_NUM_TEMPFILES, sizeof(**pack_fds));
    +	if (*pack_fds == NULL)
    +		return got_error_from_errno("calloc");
    +
    +	for (i = 0; i < GOT_PACK_NUM_TEMPFILES / 2; i++) {
    +		pack_fds_tmp[i] = repo->packs[i].accumfd;
    +		if (pack_fds_tmp[i] == -1)
    +			return got_error_from_errno("got_repo_pack_fds_copy");
    +	}
    +	for (i = GOT_PACK_NUM_TEMPFILES / 2; i < GOT_PACK_NUM_TEMPFILES; i++) {
    +		pack_fds_tmp[i] = repo->packs[i -
    +		    (GOT_PACK_NUM_TEMPFILES / 2)].basefd;
    +		if (pack_fds_tmp[i] == -1)
    +			return got_error_from_errno("got_repo_pack_fds_copy");
    +	}
    +	memcpy(*pack_fds, pack_fds_tmp, sizeof(pack_fds_tmp));
    +	return err;
    +}
    +
    +const struct got_error *
    +got_repo_pack_fds_close(int *pack_fds)
    +{
    +	const struct got_error *err = NULL;
    +	int i;
    +
    +	for (i = 0; i < GOT_PACK_NUM_TEMPFILES; i++) {
    +		if (close(pack_fds[i]) == -1) {
    +			err = got_error_from_errno("close");
    +			free(pack_fds);
    +			break;
    +		}
    +	}
    +	free(pack_fds);
    +	return err;
    +}
    +
    +const struct got_error *
     got_repo_cache_object(struct got_repository *repo, struct got_object_id *id,
         struct got_object *obj)
     {
    @@ -651,12 +714,12 @@ static const char *const repo_extensions[] = {
     
     const struct got_error *
     got_repo_open(struct got_repository **repop, const char *path,
    -    const char *global_gitconfig_path)
    +    const char *global_gitconfig_path, int *pack_fds)
     {
     	struct got_repository *repo = NULL;
     	const struct got_error *err = NULL;
     	char *repo_path = NULL;
    -	size_t i;
    +	size_t i, j = 0;
     	struct rlimit rl;
     
     	*repop = NULL;
    @@ -703,12 +766,8 @@ got_repo_open(struct got_repository **repop, const cha
     		repo->pack_cache_size = rl.rlim_cur / 8;
     	for (i = 0; i < nitems(repo->packs); i++) {
     		if (i < repo->pack_cache_size) {
    -			repo->packs[i].basefd = got_opentempfd();
    -			if (repo->packs[i].basefd == -1)
    -				return got_error_from_errno("got_opentempfd");
    -			repo->packs[i].accumfd = got_opentempfd();
    -			if (repo->packs[i].accumfd == -1)
    -				return got_error_from_errno("got_opentempfd");
    +			repo->packs[i].basefd = pack_fds[j++];
    +			repo->packs[i].accumfd = pack_fds[j++];
     		} else {
     			repo->packs[i].basefd = -1;
     			repo->packs[i].accumfd = -1;
    @@ -796,20 +855,10 @@ got_repo_close(struct got_repository *repo)
     		free(bf);
     	}
     
    -	for (i = 0; i < repo->pack_cache_size; i++) {
    +	for (i = 0; i < repo->pack_cache_size; i++)
     		if (repo->packs[i].path_packfile)
    -			got_pack_close(&repo->packs[i]);
    -		if (repo->packs[i].basefd != -1) {
    -			if (close(repo->packs[i].basefd) == -1 && err == NULL)
    -				err = got_error_from_errno("close");
    -			repo->packs[i].basefd = -1;
    -		}
    -		if (repo->packs[i].accumfd != -1) {
    -			if (close(repo->packs[i].accumfd) == -1 && err == NULL)
    -				err = got_error_from_errno("close");
    -			repo->packs[i].accumfd = -1;
    -		}
    -	}
    +			if (repo->packs[i].path_packfile)
    +				got_pack_close(&repo->packs[i]);
     
     	free(repo->path);
     	free(repo->path_git_dir);
    blob - 673cbeb89c705904097774881d38ef9d51751939
    blob + e9e78bc36b5f9613cfa035ebc14f4d43b400d667
    --- lib/worktree_open.c
    +++ lib/worktree_open.c
    @@ -117,6 +117,7 @@ open_worktree(struct got_worktree **worktree, const ch
     	const char *errstr;
     	struct got_repository *repo = NULL;
     	uint32_t uuid_status;
    +	int *pack_fds = NULL;
     
     	*worktree = NULL;
     
    @@ -190,10 +191,18 @@ open_worktree(struct got_worktree **worktree, const ch
     		goto done;
     	}
     
    -	err = got_repo_open(&repo, (*worktree)->repo_path, NULL);
    +	err = got_repo_pack_fds_open(&pack_fds);
    +	if (err != NULL)
    +		goto done;
    +
    +	err = got_repo_open(&repo, (*worktree)->repo_path, NULL, pack_fds);
     	if (err)
     		goto done;
     
    +	err = got_repo_pack_fds_close(pack_fds);
    +	if (err != NULL)
    +		goto done;
    +
     	err = got_object_resolve_id_str(&(*worktree)->base_commit_id, repo,
     	    base_commit_id_str);
     	if (err)
    blob - b4efe82ad2000b743da8b7312623bf0fe3708969
    blob + 9f9fbd712374125502d1a28f5cb355753ad8530d
    --- tog/tog.c
    +++ tog/tog.c
    @@ -503,6 +503,7 @@ struct tog_view {
     	int dying;
     	struct tog_view *parent;
     	struct tog_view *child;
    +	struct got_repository *repo;
     
     	/*
     	 * This flag is initially set on parent views when a new child view
    @@ -1125,7 +1126,7 @@ view_loop(struct tog_view *view)
     			}
     			TAILQ_INSERT_TAIL(&views, new_view, entry);
     			view = new_view;
    -		} 
    +		}
     		if (view) {
     			if (view_is_parent_view(view)) {
     				if (view->child && view->child->focussed)
    @@ -2317,6 +2318,7 @@ open_log_view(struct tog_view *view, struct got_object
     	struct got_repository *thread_repo = NULL;
     	struct got_commit_graph *thread_graph = NULL;
     	int errcode;
    +	int *pack_fds = NULL;
     
     	if (in_repo_path != s->in_repo_path) {
     		free(s->in_repo_path);
    @@ -2370,9 +2372,16 @@ open_log_view(struct tog_view *view, struct got_object
     	view->search_start = search_start_log_view;
     	view->search_next = search_next_log_view;
     
    -	err = got_repo_open(&thread_repo, got_repo_get_path(repo), NULL);
    +	err = got_repo_pack_fds_open(&pack_fds);
     	if (err)
     		goto done;
    +	err = got_repo_open(&thread_repo, got_repo_get_path(repo), NULL,
    +	    pack_fds);
    +	if (err)
    +		goto done;
    +	err = got_repo_pack_fds_close(pack_fds);
    +	if (err)
    +		goto done;
     	err = got_commit_graph_open(&thread_graph, s->in_repo_path,
     	    !s->log_branches);
     	if (err)
    @@ -2442,6 +2451,7 @@ input_log_view(struct tog_view **new_view, struct tog_
     	struct tog_view *ref_view = NULL;
     	struct commit_queue_entry *entry;
     	int begin_x = 0, n;
    +	int *pack_fds = NULL;
     
     	if (s->thread_args.load_all) {
     		if (ch == KEY_BACKSPACE)
    @@ -2634,10 +2644,16 @@ input_log_view(struct tog_view **new_view, struct tog_
     		} else /* 'B' */
     			s->log_branches = !s->log_branches;
     
    +		err = got_repo_pack_fds_open(&pack_fds);
    +		if (err)
    +			return err;
     		err = got_repo_open(&s->thread_args.repo,
    -		    got_repo_get_path(s->repo), NULL);
    +		    got_repo_get_path(s->repo), NULL, pack_fds);
     		if (err)
     			return err;
    +		err = got_repo_pack_fds_close(pack_fds);
    +		if (err)
    +			return err;
     		tog_free_refs();
     		err = tog_load_refs(s->repo, 0);
     		if (err)
    @@ -2791,6 +2807,7 @@ cmd_log(int argc, char *argv[])
     	const char *head_ref_name = NULL;
     	int ch, log_branches = 0;
     	struct tog_view *view;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "bc:r:")) != -1) {
     		switch (ch) {
    @@ -2836,9 +2853,12 @@ cmd_log(int argc, char *argv[])
     		}
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
     	if (error != NULL)
     		goto done;
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
    +	if (error != NULL)
    +		goto done;
     
     	error = get_in_repo_path_from_argv0(&in_repo_path, argc, argv,
     	    repo, worktree);
    @@ -2893,6 +2913,9 @@ cmd_log(int argc, char *argv[])
     		worktree = NULL;
     	}
     	error = view_loop(view);
    +	if (error != NULL)
    +		goto done;
    +	error = got_repo_pack_fds_close(pack_fds);
     done:
     	free(in_repo_path);
     	free(repo_path);
    @@ -3911,6 +3934,7 @@ cmd_diff(int argc, char *argv[])
     	int ch, force_text_diff = 0;
     	const char *errstr;
     	struct tog_view *view;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "aC:r:w")) != -1) {
     		switch (ch) {
    @@ -3969,9 +3993,12 @@ cmd_diff(int argc, char *argv[])
     		}
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
     	if (error)
     		goto done;
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
    +	if (error)
    +		goto done;
     
     	init_curses();
     
    @@ -4003,6 +4030,9 @@ cmd_diff(int argc, char *argv[])
     	if (error)
     		goto done;
     	error = view_loop(view);
    +	if (error)
    +		return error;
    +	error = got_repo_pack_fds_close(pack_fds);
     done:
     	free(label1);
     	free(label2);
    @@ -4162,7 +4192,7 @@ draw_blame(struct tog_view *view)
     			width = 9;
     			wline = wcsdup(L"");
     			if (wline == NULL) {
    -				err = got_error_from_errno("wcsdup");
    +				err = got_error_from_errno("wcsup");
     				free(line);
     				return err;
     			}
    @@ -4372,6 +4402,7 @@ run_blame(struct tog_view *view)
     	struct got_repository *thread_repo = NULL;
     	struct got_object_id *obj_id = NULL;
     	int obj_type;
    +	int *pack_fds = NULL;
     
     	err = got_object_open_as_commit(&commit, s->repo,
     	    &s->blamed_commit->id);
    @@ -4418,9 +4449,13 @@ run_blame(struct tog_view *view)
     		goto done;
     	}
     
    -	err = got_repo_open(&thread_repo, got_repo_get_path(s->repo), NULL);
    +	err = got_repo_pack_fds_copy(&pack_fds, view->repo);
     	if (err)
     		goto done;
    +	err = got_repo_open(&thread_repo, got_repo_get_path(s->repo), NULL,
    +	    pack_fds);
    +	if (err)
    +		goto done;
     
     	blame->cb_args.view = view;
     	blame->cb_args.lines = blame->lines;
    @@ -4494,6 +4529,7 @@ open_blame_view(struct tog_view *view, char *path,
     			return err;
     	}
     
    +	view->repo = repo;
     	view->show = show_blame_view;
     	view->input = input_blame_view;
     	view->close = close_blame_view;
    @@ -4861,6 +4897,7 @@ cmd_blame(int argc, char *argv[])
     	char *commit_id_str = NULL;
     	int ch;
     	struct tog_view *view;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "c:r:")) != -1) {
     		switch (ch) {
    @@ -4903,9 +4940,12 @@ cmd_blame(int argc, char *argv[])
     		}
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
     	if (error != NULL)
     		goto done;
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
    +	if (error != NULL)
    +		goto done;
     
     	error = get_in_repo_path_from_argv0(&in_repo_path, argc, argv, repo,
     	    worktree);
    @@ -4962,6 +5002,9 @@ cmd_blame(int argc, char *argv[])
     		worktree = NULL;
     	}
     	error = view_loop(view);
    +	if (error)
    +		goto done;
    +	error = got_repo_pack_fds_close(pack_fds);
     done:
     	free(repo_path);
     	free(in_repo_path);
    @@ -5723,6 +5766,7 @@ cmd_tree(int argc, char *argv[])
     	const char *head_ref_name = NULL;
     	int ch;
     	struct tog_view *view;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "c:r:")) != -1) {
     		switch (ch) {
    @@ -5765,9 +5809,12 @@ cmd_tree(int argc, char *argv[])
     		}
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
     	if (error != NULL)
     		goto done;
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
    +	if (error != NULL)
    +		goto done;
     
     	error = get_in_repo_path_from_argv0(&in_repo_path, argc, argv,
     	    repo, worktree);
    @@ -5828,6 +5875,9 @@ cmd_tree(int argc, char *argv[])
     		worktree = NULL;
     	}
     	error = view_loop(view);
    +	if (error)
    +		goto done;
    +	error = got_repo_pack_fds_close(pack_fds);
     done:
     	free(repo_path);
     	free(cwd);
    @@ -6476,6 +6526,7 @@ cmd_ref(int argc, char *argv[])
     	char *cwd = NULL, *repo_path = NULL;
     	int ch;
     	struct tog_view *view;
    +	int *pack_fds = NULL;
     
     	while ((ch = getopt(argc, argv, "r:")) != -1) {
     		switch (ch) {
    @@ -6515,9 +6566,12 @@ cmd_ref(int argc, char *argv[])
     		}
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
     	if (error != NULL)
     		goto done;
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
    +	if (error != NULL)
    +		goto done;
     
     	init_curses();
     
    @@ -6545,6 +6599,9 @@ cmd_ref(int argc, char *argv[])
     		worktree = NULL;
     	}
     	error = view_loop(view);
    +	if (error)
    +		goto done;
    +	error = got_repo_pack_fds_close(pack_fds);
     done:
     	free(repo_path);
     	free(cwd);
    @@ -6624,6 +6681,7 @@ tog_log_with_path(int argc, char *argv[])
     	struct got_commit_object *commit = NULL;
     	char *cwd = NULL, *repo_path = NULL, *in_repo_path = NULL;
     	char *commit_id_str = NULL, **cmd_argv = NULL;
    +	int *pack_fds = NULL;
     
     	cwd = getcwd(NULL, 0);
     	if (cwd == NULL)
    @@ -6642,9 +6700,15 @@ tog_log_with_path(int argc, char *argv[])
     		goto done;
     	}
     
    -	error = got_repo_open(&repo, repo_path, NULL);
    +	error = got_repo_pack_fds_open(&pack_fds);
     	if (error != NULL)
     		goto done;
    +	error = got_repo_open(&repo, repo_path, NULL, pack_fds);
    +	if (error != NULL)
    +		goto done;
    +	error = got_repo_pack_fds_close(pack_fds);
    +	if (error)
    +		goto done;
     
     	error = get_in_repo_path_from_argv0(&in_repo_path, argc, argv,
     	    repo, worktree);
    @@ -6806,4 +6870,5 @@ main(int argc, char *argv[])
     	if (error && error->code != GOT_ERR_CANCELLED)
     		fprintf(stderr, "%s: %s\n", getprogname(), error->msg);
     	return 0;
    +
     }
    
    
    
  • Tracey Emery:

    Move got_opentempfd out of got_repo_open