Re: [PATCH v3 1/1] MacOS: precompose_argv_prefix()
From: Junio C Hamano <hidden>
Date: 2021-02-02 17:46:05
tboegi@web.de writes:
quoted hunk
diff --git a/builtin/diff-files.c b/builtin/diff-files.c index 1e352dd8f7..e3851dd1c0 100644 --- a/builtin/diff-files.c +++ b/builtin/diff-files.c@@ -35,7 +35,7 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix) */ rev.diffopt.ita_invisible_in_index = 1; - precompose_argv(argc, argv); + prefix = precompose_argv_prefix(argc, argv, prefix);
When git.c::cmd_main() calls run_builtin() to call cmd_diff_files(), precompose would have already been called, and we end up calling the already processed argv[] and prefix again here. Is there a codepath where cmd_diff_files() gets called _without_ making the call to precompose() in git.c::run_builtin()? Previous round removed the precompose call and I thought the logic was sound, but I must be missing something. The same question applies to other built-ins. Standalone commands that go through execv_dashed_external() should still have a call to precompose() in their own cmd_main() as the prefix is not affected for them, but I suspect that they are not expected to be run from a subdirectory to begin with?
+const char *precompose_argv_prefix(int argc, const char **argv, const char *prefix)
+{
+ int i = 0;
while (i < argc) {
- size_t namelen;
- oldarg = argv[i];
- if (has_non_ascii(oldarg, (size_t)-1, &namelen)) {
- newarg = reencode_string_iconv(oldarg, namelen, ic_precompose, 0, NULL);
- if (newarg)
- argv[i] = newarg;
- }
+ argv[i] = precompose_string_if_needed(argv[i]);
i++;
}
- iconv_close(ic_precompose);
+ if (prefix) {
+ prefix = precompose_string_if_needed(prefix);
+ }
+ return prefix;
}OK. I missed that the previous round did return NULL when the original should have been returned. It is clear that this caller, and the updated precompose_string_if_needed(), returns the original. Good.
quoted hunk
diff --git a/git.c b/git.c index a00a0a4d94..16a485fbe7 100644 --- a/git.c +++ b/git.c@@ -420,7 +420,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv) int nongit_ok; prefix = setup_git_directory_gently(&nongit_ok); } - + prefix = precompose_argv_prefix(argc, argv, prefix); if (use_pager == -1 && p->option & (RUN_SETUP | RUN_SETUP_GENTLY) && !(p->option & DELAY_PAGER_CONFIG)) use_pager = check_pager_config(p->cmd);diff --git a/parse-options.c b/parse-options.c index f0507432ee..fbea16eaf5 100644 --- a/parse-options.c +++ b/parse-options.c@@ -869,7 +869,7 @@ int parse_options(int argc, const char **argv, const char *prefix, usage_with_options(usagestr, options); } - precompose_argv(argc, argv); + precompose_argv_prefix(argc, argv, NULL);
The correctness of this call also relies on that precompose() is expected to be idempotent (not saying it is necessarily bad, but just making a note), as argv[] must have been already processed before a built-in calls this function.
quoted hunk
diff --git a/t/t3910-mac-os-precompose.sh b/t/t3910-mac-os-precompose.sh index 54ce19e353..8f7b49221f 100755 --- a/t/t3910-mac-os-precompose.sh +++ b/t/t3910-mac-os-precompose.sh@@ -191,6 +191,22 @@ test_expect_failure 'handle existing decomposed filenames' ' test_must_be_empty untracked ' +test_expect_success "unicode decomposed: git restore -p . " ' + DIRNAMEPWD=dir.Odiarnfc && + DIRNAMEINREPO=dir.$Adiarnfc && + export DIRNAMEPWD DIRNAMEINREPO &&
The above is fine, but
+ git init $DIRNAMEPWD && + ( + cd $DIRNAMEPWD && + mkdir $DIRNAMEINREPO && + cd $DIRNAMEINREPO &&
Shouldn't these variable references be "quoted" for readers (I know they happen to be free of $IFS whitespaces etc., but readers and more importantly those who may casually cut-and-paste would not know)?
+ echo "Initial" >file && + git add file && + echo "More stuff" >>file && + echo y | git restore -p . + ) +' + # Test if the global core.precomposeunicode stops autosensing # Must be the last test case test_expect_success "respect git config --global core.precomposeunicode" ' -- 2.30.0.155.g66e871b664
Thanks.