git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 5/5] checkout: "best effort" checkout

From
Junio C Hamano <gitster@pobox.com>
Date
May 29, 2008, 00:17 UTC
Message-ID
<1212020246-26480-6-git-send-email-gitster@pobox.com>
In-Reply-To
<1212020246-26480-5-git-send-email-gitster@pobox.com>

When unpack_trees() returned an error while switching branches, we used to stop right there, exiting without writing the index out or switching HEAD.

This is Ok when unpack_trees() detected a locally modified paths or untracked files that could be overwritten by branch switching, but it is undesirable if unpack_trees() already committed to update the work tree and a failure is returned because some but not all paths are updated (perhaps a directory that some files need to go in was made read-only by mistake, or a file that will be overwritten by branch switching had a mandatory lock on it and we could not unlink).

This changes the behaviour upon such an error to complete the branch switching; the files updated in the work tree will hopefully much more consistent with the index and HEAD derived from the switched-to branch.

We still issue error messages, and exit the command with non-zero status, so scripted callers need to notice it.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 builtin-checkout.c |   22 ++++++++++++++++++----
 1 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/builtin-checkout.c b/builtin-checkout.c
index 9af5197..93ea69b 100644
--- a/builtin-checkout.c
+++ b/builtin-checkout.c
@@ -155,6 +155,7 @@ struct checkout_opts {
 	int quiet;
 	int merge;
 	int force;
+	int writeout_error;
 
 	char *new_branch;
 	int new_branch_log;
@@ -178,9 +179,20 @@ static int reset_tree(struct tree *tree, struct checkout_opts *o, int worktree)
 	opts.dst_index = &the_index;
 	parse_tree(tree);
 	init_tree_desc(&tree_desc, tree->buffer, tree->size);
-	if (unpack_trees(1, &tree_desc, &opts))
+	switch (unpack_trees(1, &tree_desc, &opts)) {
+	case -2:
+		o->writeout_error = 1;
+		/*
+		 * We return 0 nevertheless, as the index is all right
+		 * and more importantly we have made best efforts to
+		 * update paths in the work tree, and we cannot revert
+		 * them.
+		 */
+	case 0:
+		return 0;
+	default:
 		return 128;
-	return 0;
+	}
 }
 
 struct branch_info {
@@ -243,7 +255,8 @@ static int merge_working_tree(struct checkout_opts *opts,
 		tree = parse_tree_indirect(new->commit->object.sha1);
 		init_tree_desc(&trees[1], tree->buffer, tree->size);
 
-		if (unpack_trees(2, trees, &topts)) {
+		ret = unpack_trees(2, trees, &topts);
+		if (ret == -1) {
 			/*
 			 * Unpack couldn't do a trivial merge; either
 			 * give up or do a real merge, depending on
@@ -478,7 +491,8 @@ static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
 
 	update_refs_for_switch(opts, &old, new);
 
-	return post_checkout_hook(old.commit, new->commit, 1);
+	ret = post_checkout_hook(old.commit, new->commit, 1);
+	return ret || opts->writeout_error;
 }
 
 int cmd_checkout(int argc, const char **argv, const char *prefix)
-- 
1.5.6.rc0.43.g823ea
Previous: Junio C HamanoNext: Junio C Hamano
Message 6 of 20 in “"best effort" checkout”
  1. 0/5 "best effort" checkoutJunio C Hamano, May 29, 2008
  2. 1/5 "git checkout -- paths..." should error out when paths cannot be writtenJunio C Hamano, May 29, 2008
  3. 2/5 checkout: make reset_clean_to_new() not die by itselfJunio C Hamano, May 29, 2008
  4. 3/5 checkout: consolidate reset_{to_new,clean_to_new|()Junio C Hamano, May 29, 2008
  5. 4/5 unpack_trees(): allow callers to differentiate worktree errors from merge errorsJunio C Hamano, May 29, 2008
  6. 5/5 checkout: "best effort" checkoutJunio C Hamano, May 29, 2008
  7. 6/5 NUL hack to create_file()Junio C Hamano, May 29, 2008
  8. Johannes SixtMay 29, 2008
  9. Marius Storm-OlsenMay 29, 2008
  10. Johannes SixtMay 29, 2008
  11. Daniel BarkalowMay 29, 2008
  12. Brian DessentMay 29, 2008
  13. Daniel BarkalowMay 29, 2008
  14. Johannes SchindelinMay 29, 2008
  15. Daniel BarkalowMay 29, 2008
  16. Junio C HamanoMay 29, 2008
  17. Alex RiesenMay 29, 2008
  18. Mark LevedahlMay 29, 2008
  19. Junio C HamanoMay 30, 2008
  20. Mark LevedahlMay 30, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.