From: Phillip Wood Date: Mon, 19 Aug 2019 09:55:27 GMT Subject: Re: [PATCH v4 2/2] apply: reload .gitattributes after patching it Message-ID: <2c33a668-4c7d-2114-41b1-8907c4384a15@gmail.com> In-Reply-To: <9b940950-666a-0c4c-58c0-1e61ac9e654c@gmail.com> On 19/08/2019 10:41, Phillip Wood wrote: > [...] >> diff --git a/convert.c b/convert.c >> index 94ff837649..030e9b81b9 100644 >> --- a/convert.c >> +++ b/convert.c >> @@ -1293,10 +1293,11 @@ struct conv_attrs { >>       const char *working_tree_encoding; /* Supported encoding or >> default encoding if NULL */ >>   }; >> +static struct attr_check *check; > > I was concerned about the impact adding a file global if we ever want to > multi-thread this for submodules, but looking through the file there are > a couple of others already so this isn't creating a new problem. Doh, I've just realized it was static already - ignore that. One thing did occur to me though - does this patch reset attributes like the merge marker length (they're less critical though if there is a conflict after an attribute change it would be nice to have the correct length) or just the ones for filtering files? Best Wishes Phillip > > Best Wishes > > Phillip > >> + >>   static void convert_attrs(const struct index_state *istate, >>                 struct conv_attrs *ca, const char *path) >>   { >> -    static struct attr_check *check; >>       struct attr_check_item *ccheck = NULL; >>       if (!check) { >> @@ -1339,6 +1340,12 @@ static void convert_attrs(const struct >> index_state *istate, >>           ca->crlf_action = CRLF_AUTO_INPUT; >>   } >> +void reset_parsed_attributes(void) >> +{ >> +    attr_check_free(check); >> +    check = NULL; >> +} >> + >>   int would_convert_to_git_filter_fd(const struct index_state *istate, >> const char *path) >>   { >>       struct conv_attrs ca; >> diff --git a/convert.h b/convert.h >> index 831559f10d..3710969d43 100644 >> --- a/convert.h >> +++ b/convert.h >> @@ -94,6 +94,12 @@ void convert_to_git_filter_fd(const struct >> index_state *istate, >>   int would_convert_to_git_filter_fd(const struct index_state *istate, >>                      const char *path); >> +/* >> + * Reset the internal list of attributes used by convert_to_git and >> + * convert_to_working_tree. >> + */ >> +void reset_parsed_attributes(void); >> + >>   /***************************************************************** >>    * >>    * Streaming conversion support >> diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh >> index 80b23fd326..23469cc789 100755 >> --- a/t/t3400-rebase.sh >> +++ b/t/t3400-rebase.sh >> @@ -301,6 +301,42 @@ test_expect_success 'rebase --am and >> --show-current-patch' ' >>       ) >>   ' >> +test_expect_success 'rebase --am and .gitattributes' ' >> +    test_create_repo attributes && >> +    ( >> +        cd attributes && >> +        test_commit init && >> +        git config filter.test.clean "sed -e >> '\''s/smudged/clean/g'\''" && >> +        git config filter.test.smudge "sed -e >> '\''s/clean/smudged/g'\''" && >> + >> +        test_commit second && >> +        git checkout -b test HEAD^ && >> + >> +        echo "*.txt filter=test" >.gitattributes && >> +        git add .gitattributes && >> +        test_commit third && >> + >> +        echo "This text is smudged." >a.txt && >> +        git add a.txt && >> +        test_commit fourth && >> + >> +        git checkout -b removal HEAD^ && >> +        git rm .gitattributes && >> +        git add -u && >> +        test_commit fifth && >> +        git cherry-pick test && >> + >> +        git checkout test && >> +        git rebase master && >> +        grep "smudged" a.txt && >> + >> +        git checkout removal && >> +        git reset --hard && >> +        git rebase master && >> +        grep "clean" a.txt >> +    ) >> +' >> + >>   test_expect_success 'rebase--merge.sh and --show-current-patch' ' >>       test_create_repo conflict-merge && >>       ( >>