Commit Diff


commit - 991ff1aa4f423a1faea1bae0e85a913a88038309
commit + 1d0f405485b02cc4480ea188879e4122e0ea32bd
blob - 192b847bcb16c4c5fe215175d5a8109d0712f76b
blob + 097226da2568c25ff532d61bf72b41de086e3af9
--- got/got.c
+++ got/got.c
@@ -1800,8 +1800,11 @@ done:
 	}
 	if (fetchfd != -1 && close(fetchfd) == -1 && error == NULL)
 		error = got_error_from_errno("close");
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	TAILQ_FOREACH(pe, &refs, entry) {
 		free((void *)pe->path);
 		free(pe->data);
@@ -2515,8 +2518,11 @@ done:
 	}
 	if (fetchfd != -1 && close(fetchfd) == -1 && error == NULL)
 		error = got_error_from_errno("close");
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	TAILQ_FOREACH(pe, &refs, entry) {
@@ -4063,10 +4069,9 @@ done:
 	if (worktree)
 		got_worktree_close(worktree);
 	if (repo) {
-		const struct got_error *repo_error;
-		repo_error = got_repo_close(repo);
+		const struct got_error *close_err = got_repo_close(repo);
 		if (error == NULL)
-			error = repo_error;
+			error = close_err;
 	}
 	if (refs_idmap)
 		got_reflist_object_id_map_free(refs_idmap);
@@ -4488,10 +4493,9 @@ done:
 	if (worktree)
 		got_worktree_close(worktree);
 	if (repo) {
-		const struct got_error *repo_error;
-		repo_error = got_repo_close(repo);
+		const struct got_error *close_err = got_repo_close(repo);
 		if (error == NULL)
-			error = repo_error;
+			error = close_err;
 	}
 	got_ref_list_free(&refs);
 	return error;
@@ -4818,10 +4822,9 @@ done:
 	if (worktree)
 		got_worktree_close(worktree);
 	if (repo) {
-		const struct got_error *repo_error;
-		repo_error = got_repo_close(repo);
+		const struct got_error *close_err = got_repo_close(repo);
 		if (error == NULL)
-			error = repo_error;
+			error = close_err;
 	}
 	if (bca.lines) {
 		for (i = 0; i < bca.nlines; i++) {
@@ -5106,10 +5109,9 @@ done:
 	if (worktree)
 		got_worktree_close(worktree);
 	if (repo) {
-		const struct got_error *repo_error;
-		repo_error = got_repo_close(repo);
+		const struct got_error *close_err = got_repo_close(repo);
 		if (error == NULL)
-			error = repo_error;
+			error = close_err;
 	}
 	return error;
 }
@@ -5495,8 +5497,11 @@ cmd_ref(int argc, char *argv[])
 	}
 done:
 	free(refname);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	free(cwd);
@@ -5877,8 +5882,11 @@ cmd_branch(int argc, char *argv[])
 done:
 	if (ref)
 		got_ref_close(ref);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	free(cwd);
@@ -6387,8 +6395,11 @@ cmd_tag(int argc, char *argv[])
 		    commit_id_str ? commit_id_str : commit_id_arg, tagmsg);
 	}
 done:
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	free(cwd);
@@ -6519,8 +6530,11 @@ cmd_add(int argc, char *argv[])
 	error = got_worktree_schedule_add(worktree, &paths, add_progress,
 	    NULL, repo, no_ignores);
 done:
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	TAILQ_FOREACH(pe, &paths, entry)
@@ -6668,8 +6682,11 @@ cmd_remove(int argc, char *argv[])
 	    delete_local_mods, status_codes, print_remove_status, NULL,
 	    repo, keep_on_disk);
 done:
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	TAILQ_FOREACH(pe, &paths, entry)
@@ -6929,8 +6946,11 @@ done:
 	if (patch_script_file && fclose(patch_script_file) == EOF &&
 	    error == NULL)
 		error = got_error_from_errno2("fclose", patch_script_path);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	free(path);
@@ -7234,8 +7254,11 @@ done:
 	    error == NULL)
 		error = got_error_from_errno2("unlink", cl_arg.logmsg_path);
 	free(cl_arg.logmsg_path);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	free(cwd);
@@ -7365,8 +7388,11 @@ done:
 		got_ref_close(head_ref);
 	if (worktree)
 		got_worktree_close(worktree);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	return error;
 }
 
@@ -7485,8 +7511,11 @@ done:
 		got_ref_close(head_ref);
 	if (worktree)
 		got_worktree_close(worktree);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	return error;
 }
 
@@ -8322,8 +8351,11 @@ done:
 		got_ref_close(tmp_branch);
 	if (worktree)
 		got_worktree_close(worktree);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	return error;
 }
 
@@ -9620,8 +9652,11 @@ done:
 		got_ref_close(tmp_branch);
 	if (worktree)
 		got_worktree_close(worktree);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	return error;
 }
 
@@ -9753,8 +9788,11 @@ cmd_integrate(int argc, char *argv[])
 	printf("Integrated %s into %s\n", refname, base_refname);
 	print_update_progress_stats(&upa);
 done:
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	free(cwd);
@@ -9900,8 +9938,11 @@ done:
 	if (patch_script_file && fclose(patch_script_file) == EOF &&
 	    error == NULL)
 		error = got_error_from_errno2("fclose", patch_script_path);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	TAILQ_FOREACH(pe, &paths, entry)
@@ -10010,8 +10051,11 @@ done:
 	if (patch_script_file && fclose(patch_script_file) == EOF &&
 	    error == NULL)
 		error = got_error_from_errno2("fclose", patch_script_path);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	TAILQ_FOREACH(pe, &paths, entry)
@@ -10322,10 +10366,9 @@ done:
 	if (worktree)
 		got_worktree_close(worktree);
 	if (repo) {
-		const struct got_error *repo_error;
-		repo_error = got_repo_close(repo);
+		const struct got_error *close_err = got_repo_close(repo);
 		if (error == NULL)
-			error = repo_error;
+			error = close_err;
 	}
 	got_ref_list_free(&refs);
 	return error;
blob - 4cc5428af954c47772c98d07aff210d72929cc7c
blob + 3a689cd14ad0dacbec839cd0d7dead37f4d5f83c
--- gotweb/gotweb.c
+++ gotweb/gotweb.c
@@ -2833,8 +2833,11 @@ gw_get_repo_age(char **repo_age, struct gw_trans *gw_t
 	}
 done:
 	got_ref_list_free(&refs);
-	if (gw_trans->repo == NULL)
-		got_repo_close(repo);
+	if (gw_trans->repo == NULL) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	return error;
 }
 
@@ -2927,7 +2930,7 @@ done:
 static const struct got_error *
 gw_get_repo_owner(char **owner, struct gw_trans *gw_trans, char *dir)
 {
-	const struct got_error *error = NULL;
+	const struct got_error *error = NULL, *close_err;
 	struct got_repository *repo;
 	const char *gitconfig_owner;
 
@@ -2945,7 +2948,9 @@ gw_get_repo_owner(char **owner, struct gw_trans *gw_tr
 		if (*owner == NULL)
 			error = got_error_from_errno("strdup");
 	}
-	got_repo_close(repo);
+	close_err = got_repo_close(repo);
+	if (error == NULL)
+		error = close_err;
 	return error;
 }
 
@@ -4736,6 +4741,12 @@ main(int argc, char *argv[])
 	else
 		error = gw_display_index(gw_trans);
 done:
+	if (gw_trans->repo) {
+		const struct got_error *close_err;
+		close_err = got_repo_close(gw_trans->repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (error) {
 		gw_trans->error = error;
 		gw_trans->action = GW_ERR;
@@ -4768,9 +4779,6 @@ cleanup:
 	free(gw_trans->prev_id);
 	free(gw_trans->prev_prev_id);
 	free(gw_trans->repo_path);
-	if (gw_trans->repo)
-		got_repo_close(gw_trans->repo);
-
 	TAILQ_FOREACH_SAFE(dir, &gw_trans->gw_dirs, entry, tdir) {
 		free(dir->name);
 		free(dir->description);
blob - 16616cca614bcd144f1e84477ab65ea3f34b7b0e
blob + 2f1abf58087e2648591e03485c907e2b79bb7baa
--- lib/repository.c
+++ lib/repository.c
@@ -752,8 +752,9 @@ got_repo_close(struct got_repository *repo)
 			err = got_error_from_errno("close");
 	}
 
-	if (repo->gitdir_fd != -1)
-		close(repo->gitdir_fd);
+	if (repo->gitdir_fd != -1 && close(repo->gitdir_fd) == -1 &&
+	    err == NULL)
+		err = got_error_from_errno("close");
 
 	if (repo->gotconfig)
 		got_gotconfig_free(repo->gotconfig);
blob - 13cc9fbaca9c08dbb86084c978e908bee7eebe17
blob + 522c2fe12ca9c96345952c0586dcca8194d69202
--- lib/worktree.c
+++ lib/worktree.c
@@ -436,8 +436,11 @@ open_worktree(struct got_worktree **worktree, const ch
 		goto done;
 	}
 done:
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (err == NULL)
+			err = close_err;
+	}
 	free(path_got);
 	free(path_lock);
 	free(base_commit_id_str);
blob - c426e9d11b25926d3d473cea50910a6e8ecd3240
blob + b6840e939dec6d2d98e812c0a0ca34d74e03eee1
--- tog/tog.c
+++ tog/tog.c
@@ -2111,7 +2111,7 @@ stop_log_thread(struct tog_log_view_state *s)
 	}
 
 	if (s->thread_args.repo) {
-		got_repo_close(s->thread_args.repo);
+		err = got_repo_close(s->thread_args.repo);
 		s->thread_args.repo = NULL;
 	}
 
@@ -2806,8 +2806,11 @@ done:
 	free(label);
 	if (ref)
 		got_ref_close(ref);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	tog_free_refs();
@@ -3861,8 +3864,11 @@ done:
 	free(label2);
 	free(repo_path);
 	free(cwd);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	tog_free_refs();
@@ -4092,7 +4098,7 @@ done:
 static void *
 blame_thread(void *arg)
 {
-	const struct got_error *err;
+	const struct got_error *err, *close_err;
 	struct tog_blame_thread_args *ta = arg;
 	struct tog_blame_cb_args *a = ta->cb_args;
 	int errcode;
@@ -4111,7 +4117,9 @@ blame_thread(void *arg)
 		return (void *)got_error_set_errno(errcode,
 		    "pthread_mutex_lock");
 
-	got_repo_close(ta->repo);
+	close_err = got_repo_close(ta->repo);
+	if (err == NULL)
+		err = close_err;
 	ta->repo = NULL;
 	*ta->complete = 1;
 
@@ -4162,7 +4170,10 @@ stop_blame(struct tog_blame *blame)
 		blame->thread = NULL;
 	}
 	if (blame->thread_args.repo) {
-		got_repo_close(blame->thread_args.repo);
+		const struct got_error *close_err;
+		close_err = got_repo_close(blame->thread_args.repo);
+		if (err == NULL)
+			err = close_err;
 		blame->thread_args.repo = NULL;
 	}
 	if (blame->f) {
@@ -4782,8 +4793,11 @@ done:
 	free(commit_id);
 	if (worktree)
 		got_worktree_close(worktree);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	tog_free_refs();
 	return error;
 }
@@ -5613,8 +5627,11 @@ done:
 		got_object_commit_close(commit);
 	if (tree)
 		got_object_tree_close(tree);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	tog_free_refs();
 	return error;
 }
@@ -6289,8 +6306,11 @@ cmd_ref(int argc, char *argv[])
 done:
 	free(repo_path);
 	free(cwd);
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		const struct got_error *close_err = got_repo_close(repo);
+		if (close_err)
+			error = close_err;
+	}
 	tog_free_refs();
 	return error;
 }
@@ -6354,7 +6374,7 @@ make_argv(int argc, ...)
 static const struct got_error *
 tog_log_with_path(int argc, char *argv[])
 {
-	const struct got_error *error = NULL;
+	const struct got_error *error = NULL, *close_err;
 	struct tog_cmd *cmd = NULL;
 	struct got_repository *repo = NULL;
 	struct got_worktree *worktree = NULL;
@@ -6412,7 +6432,9 @@ tog_log_with_path(int argc, char *argv[])
 		/* not reached */
 	}
 
-	got_repo_close(repo);
+	close_err = got_repo_close(repo);
+	if (error == NULL)
+		error = close_err;
 	repo = NULL;
 
 	error = got_object_id_str(&commit_id_str, commit_id);
@@ -6424,8 +6446,11 @@ tog_log_with_path(int argc, char *argv[])
 	cmd_argv = make_argv(argc, cmd->name, "-c", commit_id_str, argv[0]);
 	error = cmd->cmd_main(argc, cmd_argv);
 done:
-	if (repo)
-		got_repo_close(repo);
+	if (repo) {
+		close_err = got_repo_close(repo);
+		if (error == NULL)
+			error = close_err;
+	}
 	if (worktree)
 		got_worktree_close(worktree);
 	free(id);