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

[PATCH v9 14/41] builtin/apply: make apply_all_patches() return 128 or 1 on error

From
Christian Couder <christian.couder@gmail.com>
Date
Jul 30, 2016, 17:24 UTC
Message-ID
<20160730172509.22939-15-chriscool@tuxfamily.org>
In-Reply-To
<20160730172509.22939-1-chriscool@tuxfamily.org>

To finish libifying the apply functionality, apply_all_patches() should not die() or exit() in case of error, but return either 128 or 1, so that it gives the same exit code as when die() or exit(1) is called. This way scripts relying on the exit code don't need to be changed.

While doing that we must take care that file descriptors are properly closed and, if needed, reset to a sensible value.

Also, according to the lockfile API, when finished with a lockfile, one should either commit it or roll it back.

This is even more important now that the same lockfile can be passed to init_apply_state() many times to be reused by series of calls to the apply lib functions.

Helped-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Helped-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 builtin/apply.c | 37 ++++++++++++++++++++++++++-----------
 1 file changed, 26 insertions(+), 11 deletions(-)
diff --git a/builtin/apply.c b/builtin/apply.c
index 8f5e2fa..84dcf41 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -4578,15 +4578,18 @@ static int apply_all_patches(struct apply_state *state,
 					      arg);
 
 		fd = open(arg, O_RDONLY);
-		if (fd < 0)
-			die_errno(_("can't open patch '%s'"), arg);
+		if (fd < 0) {
+			error(_("can't open patch '%s': %s"), arg, strerror(errno));
+			res = -128;
+			goto end;
+		}
 		read_stdin = 0;
 		set_default_whitespace_mode(state);
 		res = apply_patch(state, fd, arg, options);
+		close(fd);
 		if (res < 0)
 			goto end;
 		errs |= res;
-		close(fd);
 	}
 	set_default_whitespace_mode(state);
 	if (read_stdin) {
@@ -4606,11 +4609,14 @@ static int apply_all_patches(struct apply_state *state,
 				   squelched),
 				squelched);
 		}
-		if (state->ws_error_action == die_on_ws_error)
-			die(Q_("%d line adds whitespace errors.",
-			       "%d lines add whitespace errors.",
-			       state->whitespace_error),
-			    state->whitespace_error);
+		if (state->ws_error_action == die_on_ws_error) {
+			error(Q_("%d line adds whitespace errors.",
+				 "%d lines add whitespace errors.",
+				 state->whitespace_error),
+			      state->whitespace_error);
+			res = -128;
+			goto end;
+		}
 		if (state->applied_after_fixing_ws && state->apply)
 			warning("%d line%s applied after"
 				" fixing whitespace errors.",
@@ -4624,15 +4630,24 @@ static int apply_all_patches(struct apply_state *state,
 	}
 
 	if (state->update_index) {
-		if (write_locked_index(&the_index, state->lock_file, COMMIT_LOCK))
-			die(_("Unable to write new index file"));
+		res = write_locked_index(&the_index, state->lock_file, COMMIT_LOCK);
+		if (res) {
+			error(_("Unable to write new index file"));
+			res = -128;
+			goto end;
+		}
 		state->newfd = -1;
 	}
 
 	return !!errs;
 
 end:
-	exit(res == -1 ? 1 : 128);
+	if (state->newfd >= 0) {
+		rollback_lock_file(state->lock_file);
+		state->newfd = -1;
+	}
+
+	return (res == -1 ? 1 : 128);
 }
 
 int cmd_apply(int argc, const char **argv, const char *prefix)
-- 
2.9.2.558.gf53e569
Previous: Christian CouderNext: Christian Couder
Message 45 of 53 in “libify apply and use lib in am, part 2”
  1. 00/41 libify apply and use lib in am, part 2Christian Couder, Jul 30, 2016
  2. 01/41 apply: make some names more specificChristian Couder, Jul 30, 2016
  3. 02/41 apply: move 'struct apply_state' to apply.hChristian Couder, Jul 30, 2016
  4. 03/41 builtin/apply: make apply_patch() return -1 or -128 instead of die()ingChristian Couder, Jul 30, 2016
  5. Stefan BellerAug 1, 2016
  6. 04/41 builtin/apply: read_patch_file() return -1 instead of die()ingChristian Couder, Jul 30, 2016
  7. Stefan BellerAug 1, 2016
  8. 05/41 builtin/apply: make find_header() return -128 instead of die()ingChristian Couder, Jul 30, 2016
  9. 06/41 builtin/apply: make parse_chunk() return a negative integer on errorChristian Couder, Jul 30, 2016
  10. 07/41 builtin/apply: make parse_single_patch() return -1 on errorChristian Couder, Jul 30, 2016
  11. 20/41 builtin/apply: make remove_file() return -1 on errorChristian Couder, Jul 30, 2016
  12. 16/41 builtin/apply: make gitdiff_*() return 1 at end of headerChristian Couder, Jul 30, 2016
  13. 18/41 builtin/apply: change die_on_unsafe_path() to check_unsafe_path()Christian Couder, Jul 30, 2016
  14. 23/41 builtin/apply: make create_file() return -1 on errorChristian Couder, Jul 30, 2016
  15. 25/41 builtin/apply: make write_out_results() return -1 on errorChristian Couder, Jul 30, 2016
  16. 27/41 builtin/apply: make create_one_file() return -1 on errorChristian Couder, Jul 30, 2016
  17. 21/41 builtin/apply: make add_conflicted_stages_file() return -1 on errorChristian Couder, Jul 30, 2016
  18. 24/41 builtin/apply: make write_out_one_result() return -1 on errorChristian Couder, Jul 30, 2016
  19. 29/41 apply: rename and move opt constants to apply.hChristian Couder, Jul 30, 2016
  20. 36/41 apply: don't print on stdout in verbosity_silent modeChristian Couder, Jul 30, 2016
  21. 31/41 apply: make some parsing functions static againChristian Couder, Jul 30, 2016
  22. 22/41 builtin/apply: make add_index_file() return -1 on errorChristian Couder, Jul 30, 2016
  23. 37/41 usage: add set_warn_routine()Christian Couder, Jul 30, 2016
  24. 19/41 builtin/apply: make build_fake_ancestor() return -1 on errorChristian Couder, Jul 30, 2016
  25. 26/41 builtin/apply: make try_create_file() return -1 on errorChristian Couder, Jul 30, 2016
  26. 39/41 apply: change error_routine when silentChristian Couder, Jul 30, 2016
  27. Stefan BellerAug 1, 2016
  28. Christian CouderAug 8, 2016
  29. 17/41 builtin/apply: make gitdiff_*() return -1 on errorChristian Couder, Jul 30, 2016
  30. 33/41 environment: add set_index_file()Christian Couder, Jul 30, 2016
  31. Stefan BellerAug 1, 2016
  32. Junio C HamanoAug 1, 2016
  33. Junio C HamanoAug 1, 2016
  34. Christian CouderAug 3, 2016
  35. Christian CouderAug 3, 2016
  36. 28/41 builtin/apply: rename option parsing functionsChristian Couder, Jul 30, 2016
  37. 34/41 write_or_die: use warning() instead of fprintf(stderr, ...)Christian Couder, Jul 30, 2016
  38. 38/41 usage: add get_error_routine() and get_warn_routine()Christian Couder, Jul 30, 2016
  39. 35/41 apply: make it possible to silently applyChristian Couder, Jul 30, 2016
  40. Junio C HamanoAug 1, 2016
  41. 41/41 builtin/am: use apply api in run_apply()Christian Couder, Jul 30, 2016
  42. 32/41 apply: use error_errno() where possibleChristian Couder, Jul 30, 2016
  43. 40/41 apply: refactor `git apply` option parsingChristian Couder, Jul 30, 2016
  44. 15/41 builtin/apply: make parse_traditional_patch() return -1 on errorChristian Couder, Jul 30, 2016
  45. 14/41 builtin/apply: make apply_all_patches() return 128 or 1 on errorChristian Couder, Jul 30, 2016
  46. 10/41 builtin/apply: move init_apply_state() to apply.cChristian Couder, Jul 30, 2016
  47. 12/41 builtin/apply: make check_apply_state() return -1 instead of die()ingChristian Couder, Jul 30, 2016
  48. 13/41 builtin/apply: move check_apply_state() to apply.cChristian Couder, Jul 30, 2016
  49. 11/41 apply: make init_apply_state() return -1 instead of exit()ingChristian Couder, Jul 30, 2016
  50. 08/41 builtin/apply: make parse_whitespace_option() return -1 instead of die()ingChristian Couder, Jul 30, 2016
  51. 09/41 builtin/apply: make parse_ignorewhitespace_option() return -1 instead of die()ingChristian Couder, Jul 30, 2016
  52. Christian CouderJul 30, 2016
  53. Junio C HamanoAug 1, 2016

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.