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

[PATCH v10 33/40] environment: add set_index_file()

From
Christian Couder <christian.couder@gmail.com>
Date
Aug 8, 2016, 21:03 UTC
Message-ID
<20160808210337.5038-34-chriscool@tuxfamily.org>
In-Reply-To
<20160808210337.5038-1-chriscool@tuxfamily.org>

Introduce set_index_file() to be able to temporarily change the index file.

Yeah, this is a short cut and this new function should not be used by other code.

It adds a small technical debt, because unfortunately a very big technical debt already exists as the apply code and a lot of other "libified" code already call functions like read_cache(), discard_cache() and cache_name_pos() instead of functions like read_index_from(), discard_index() and index_name_pos() that are available when the NO_THE_INDEX_COMPATIBILITY_MACROS env variable is defined.

Avoiding this small new technical debt is unfortunately not as simple as just changing these functions in "apply.c", as these functions can be called by other "libified" code that can indirectly be called by apply code.

For example cache_name_pos() is used in "dir.c" and "diff.c", and then "dir.h" and "diff.h" are included in many other "libified" *.c files (including "apply.c"). So it is very difficult to make sure that apply code doesn't indirectly call any of the problematic functions.

And even if it was possible to make sure that now "apply.c" doesn't indirectly call any of these functions, how could we make sure that later a refactoring in other "libified" code will not change a function that is indirectly called by "apply.c" to make it call another function that indirectly calls a problematic function?

So it's a different project altogether to remove calls to problematic functions (like read_cache(), discard_cache(), cache_name_pos() and so on) in all the libified code, starting maybe with "dir.c" and "diff.c".

Now if someone really needs to use this new function, it should be used like this:

    /* Save current index file */
    old_index_file = get_index_file();
    set_index_file((char *)tmp_index_file);
    /* Do stuff that will use tmp_index_file as the index file */
    ...
    /* When finished reset the index file */
    set_index_file(old_index_file);

It is intended to be used by builtins commands, in fact only `git am`, to temporarily change the index file used by libified code.

This is useful when libified code uses the global index, but a builtin command wants another index file to be used instead.

Helped-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 cache.h       | 13 +++++++++++++
 environment.c | 16 ++++++++++++++++
 2 files changed, 29 insertions(+)
diff --git a/cache.h b/cache.h
index b5f76a4..c9ad7f9 100644
--- a/cache.h
+++ b/cache.h
@@ -471,6 +471,19 @@ extern const char *strip_namespace(const char *namespaced_ref);
 extern const char *get_git_work_tree(void);
 
 /*
+ * Hack to temporarily change the index.
+ * Yeah, the libification of 'apply' took a short-circuit by adding
+ * this technical debt.
+ * Please use functions available when
+ * NO_THE_INDEX_COMPATIBILITY_MACROS is defined, instead of this
+ * function.
+ * If you really need to use this function, please save the current
+ * index file using get_index_file() before changing the index
+ * file. And when finished, reset it to the saved value.
+ */
+extern void set_index_file(char *index_file);
+
+/*
  * Return true if the given path is a git directory; note that this _just_
  * looks at the directory itself. If you want to know whether "foo/.git"
  * is a repository, you must feed that path, not just "foo".
diff --git a/environment.c b/environment.c
index ca72464..55b2b6b 100644
--- a/environment.c
+++ b/environment.c
@@ -292,6 +292,22 @@ int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1)
 	return open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
 }
 
+/*
+ * Hack to temporarily change the index.
+ * Yeah, the libification of 'apply' took a short-circuit by adding
+ * this technical debt.
+ * Please use functions available when
+ * NO_THE_INDEX_COMPATIBILITY_MACROS is defined, instead of this
+ * function.
+ * If you really need to use this function, please save the current
+ * index file using get_index_file() before changing the index
+ * file. And when finished, reset it to the saved value.
+ */
+void set_index_file(char *index_file)
+{
+	git_index_file = index_file;
+}
+
 char *get_index_file(void)
 {
 	if (!git_index_file)
-- 
2.9.2.614.g4980f51
Previous: Christian CouderNext: Junio C Hamano
Message 32 of 51 in “libify apply and use lib in am, part 2”
  1. 00/40 libify apply and use lib in am, part 2Christian Couder, Aug 8, 2016
  2. 02/40 apply: move 'struct apply_state' to apply.hChristian Couder, Aug 8, 2016
  3. 03/40 builtin/apply: make apply_patch() return -1 or -128 instead of die()ingChristian Couder, Aug 8, 2016
  4. 04/40 builtin/apply: read_patch_file() return -1 instead of die()ingChristian Couder, Aug 8, 2016
  5. 07/40 builtin/apply: make parse_single_patch() return -1 on errorChristian Couder, Aug 8, 2016
  6. 05/40 builtin/apply: make find_header() return -128 instead of die()ingChristian Couder, Aug 8, 2016
  7. 06/40 builtin/apply: make parse_chunk() return a negative integer on errorChristian Couder, Aug 8, 2016
  8. 10/40 builtin/apply: move init_apply_state() to apply.cChristian Couder, Aug 8, 2016
  9. 09/40 builtin/apply: make parse_ignorewhitespace_option() return -1 instead of die()ingChristian Couder, Aug 8, 2016
  10. 12/40 builtin/apply: make check_apply_state() return -1 instead of die()ingChristian Couder, Aug 8, 2016
  11. 13/40 builtin/apply: move check_apply_state() to apply.cChristian Couder, Aug 8, 2016
  12. 11/40 apply: make init_apply_state() return -1 instead of exit()ingChristian Couder, Aug 8, 2016
  13. 15/40 builtin/apply: make parse_traditional_patch() return -1 on errorChristian Couder, Aug 8, 2016
  14. 21/40 builtin/apply: make add_conflicted_stages_file() return -1 on errorChristian Couder, Aug 8, 2016
  15. 20/40 builtin/apply: make remove_file() return -1 on errorChristian Couder, Aug 8, 2016
  16. 22/40 builtin/apply: make add_index_file() return -1 on errorChristian Couder, Aug 8, 2016
  17. 23/40 builtin/apply: make create_file() return -1 on errorChristian Couder, Aug 8, 2016
  18. 27/40 builtin/apply: make create_one_file() return -1 on errorChristian Couder, Aug 8, 2016
  19. 29/40 apply: rename and move opt constants to apply.hChristian Couder, Aug 8, 2016
  20. 28/40 builtin/apply: rename option parsing functionsChristian Couder, Aug 8, 2016
  21. stefan.naewe@atlas-elektronik.comAug 9, 2016
  22. 26/40 builtin/apply: make try_create_file() return -1 on errorChristian Couder, Aug 8, 2016
  23. 25/40 builtin/apply: make write_out_results() return -1 on errorChristian Couder, Aug 8, 2016
  24. 31/40 apply: make some parsing functions static againChristian Couder, Aug 8, 2016
  25. 24/40 builtin/apply: make write_out_one_result() return -1 on errorChristian Couder, Aug 8, 2016
  26. 32/40 apply: use error_errno() where possibleChristian Couder, Aug 8, 2016
  27. 19/40 builtin/apply: make build_fake_ancestor() return -1 on errorChristian Couder, Aug 8, 2016
  28. 37/40 usage: add get_error_routine() and get_warn_routine()Christian Couder, Aug 8, 2016
  29. 36/40 usage: add set_warn_routine()Christian Couder, Aug 8, 2016
  30. 35/40 apply: don't print on stdout in verbosity_silent modeChristian Couder, Aug 8, 2016
  31. 39/40 apply: refactor `git apply` option parsingChristian Couder, Aug 8, 2016
  32. 33/40 environment: add set_index_file()Christian Couder, Aug 8, 2016
  33. Junio C HamanoAug 8, 2016
  34. Christian CouderAug 10, 2016
  35. Junio C HamanoAug 10, 2016
  36. Christian CouderAug 11, 2016
  37. Junio C HamanoAug 11, 2016
  38. 34/40 apply: make it possible to silently applyChristian Couder, Aug 8, 2016
  39. 38/40 apply: change error_routine when silentChristian Couder, Aug 8, 2016
  40. 18/40 builtin/apply: change die_on_unsafe_path() to check_unsafe_path()Christian Couder, Aug 8, 2016
  41. 40/40 builtin/am: use apply api in run_apply()Christian Couder, Aug 8, 2016
  42. 17/40 builtin/apply: make gitdiff_*() return -1 on errorChristian Couder, Aug 8, 2016
  43. 16/40 builtin/apply: make gitdiff_*() return 1 at end of headerChristian Couder, Aug 8, 2016
  44. 14/40 builtin/apply: make apply_all_patches() return 128 or 1 on errorChristian Couder, Aug 8, 2016
  45. 08/40 builtin/apply: make parse_whitespace_option() return -1 instead of die()ingChristian Couder, Aug 8, 2016
  46. 01/40 apply: make some names more specificChristian Couder, Aug 8, 2016
  47. stefan.naewe@atlas-elektronik.comAug 9, 2016
  48. Christian CouderAug 11, 2016
  49. stefan.naewe@atlas-elektronik.comAug 11, 2016
  50. Christian CouderAug 8, 2016
  51. Junio C HamanoAug 8, 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.