On 24.11.15 23:43, Beat Bolli wrote:
> On 24.11.15 09:21, Johannes Schindelin wrote:
>> Hi Beat,
>>
>> On Mon, 23 Nov 2015, Beat Bolli wrote:
>>
>>> When merging files in repos with core.eol = crlf, git merge-file inserts
>>> just a LF at the end of the merge markers. Files with mixed line endings
>>> cause trouble in Windows editors and e.g. contrib/git-jump, where an
>>> unmerged file in a run of "git jump merge" is reported as simply "binary
>>> file matches".
>>
>> Wow, what a beautiful contribution!
>>
>> I wonder how difficult it would be to make this work with gitattributes,
>> i.e. when .gitattributes' `eol` setting disagrees with core.eol.
>>
>> I imagine that we could use convert.c to do all the hard work, e.g. by
>> adding a function
>>
>>      const char *eol_for_path(const char *path, const char *contents)
>>      {
>>              enum eol eol;
>>              struct conv_attrs ca;
>>              struct text_stat stats;
>>
>>              convert_attrs(&ca, path);
>>              eol = output_eol(ca.crlf_action);
>>              if (eol != EOL_CRLF)
>>                      eol = EOL_LF;
>>              else if (!*contents || (crlf_action != CRLF_AUTO &&
>>                              crlf_action != CRLF_GUESS)
>>                      eol = EOL_CRLF;
>>              else {
>>                      ca.crlf_action = input_crlf_action(ca.crlf_action,
>>                                      ca.eol_attr);
>>                      if (crlf_action == CRLF_GUESS && stats.cr > stats.crlf)
>>                              eol = core_eol;
>>                      else if (stats.crlf)
>>                              eol = EOL_CRLF;
>>                      else
>>                              eol = EOL_LF;
>>              }
>>
>>              return eol == EOL_CRLF ? "\r\n" : "\n";
>>      }
> 
> Hi Johannes,
> 
> I have implemented this according to your algorithm. Now, I have to set
> core.autocrlf to true for making the new test pass. Setting core.eol no
> longer has an effect on the merge markers. Is this expected? (I haven't
> set any attributes)

PS: the function looks like this now:

enum eol eol_for_path(const char *path, const char *src, size_t len)
{
        struct conv_attrs ca;
        struct text_stat stats;

        convert_attrs(&ca, path);
        if (output_eol(ca.crlf_action) != EOL_CRLF)
                return EOL_LF;
        if (!len || ca.crlf_action != CRLF_AUTO &&
                    ca.crlf_action != CRLF_GUESS)
                return EOL_CRLF;
        ca.crlf_action = input_crlf_action(ca.crlf_action, ca.eol_attr);
        gather_stats(src, len, &stats);
        if (ca.crlf_action == CRLF_GUESS && stats.cr > stats.crlf)
                return core_eol;
        else if (stats.crlf)
                return EOL_CRLF;
        else
                return EOL_LF;
}
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to