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

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

From
Christian Couder <christian.couder@gmail.com>
Date
Aug 10, 2016, 16:52 UTC
Message-ID
<CAP8UFD2ZAdUjQnO-4qnum2_AK84SfBN2_yO=py+Jj+pkV8pk-w@mail.gmail.com>
In-Reply-To
<xmqq60raewod.fsf@gitster.mtv.corp.google.com>
On Tue, Aug 9, 2016 at 12:13 AM, Junio C Hamano <gitster@pobox.com> wrote:
Show 43 quoted lines
> Christian Couder <christian.couder@gmail.com> writes:
>
>> 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.
>
> That is OK, but I do not think NO_THE_INDEX_COMPATIBILITY_MACROS has
> much to do with this hack.  Even if you stop using the_index and
> have the caller pass its own temporary index_state, that structure
> does *not* know which file to read the (temporary) index from, or
> which file to write the (temporary) index to.  In fact, apply.c
> already does this in build_fake_ancestor():
>
>     static int build_fake_ancestor(struct patch *list, const char *filename)
>     {
>             ...
>             hold_lock_file_for_update(&lock, filename, LOCK_DIE_ON_ERROR);
>             res = write_locked_index(&result, &lock, COMMIT_LOCK);
>             ...
>     }
>
> As you can see, this function works with a non-standard/default
> index file _without_ having to use non-default index_state.  What
> the set_index_file() hack allows you to do is to use interface that
> does *NOT* pass "filename" like the caller does to this function.
>
> Isn't the mention on NO_THE_INDEX_COMPATIBILITY_MACROS in the added
> comments (there are two) pure red-herring?
Yeah, true.

So do you want me to refactor the code to use hold_lock_file_for_update() instead of hold_locked_index() and to avoid the set_index_file() hack?

Or would the set_index_file() hack be ok with a commit message like the following:

--- 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, that could perhaps be avoided with a refactoring and by using hold_lock_file_for_update() instead of hold_locked_index() to pass the filename where the index should be written.

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. ---

And with comments like this on top of set_index_file() definition and declaration:

/*
 * Hack to temporarily change the index.
 * Yeah, the libification of 'apply' took a short-circuit by adding
 * this technical debt.
 * Please set the filename using for example hold_lock_file_for_update(),
 * 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.
 */
?
Previous: Junio C HamanoNext: Junio C Hamano
Message 34 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.