From: Torsten Bögershausen <tbo...@web.de>

Make .gitattributes "* text=auto eol=crlf" to do the same as
setting core.autocrlf=true and "* text=auto eol=crlf" the same
as core.autocrlf=input

Signed-off-by: Torsten Bögershausen <tbo...@web.de>
---
 Documentation/config.txt        | 10 ++++-----
 Documentation/gitattributes.txt | 11 +++++-----
 convert.c                       | 37 ++++++++++++++++-----------------
 t/t0025-crlf-auto.sh            |  4 ++--
 t/t0027-auto-crlf.sh            | 45 +++++++++++++++++++----------------------
 5 files changed, 53 insertions(+), 54 deletions(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index 4a27ad4..dfaf39c 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -389,13 +389,13 @@ file with mixed line endings would be reported by the 
`core.safecrlf`
 mechanism.
 
 core.autocrlf::
-       Setting this variable to "true" is almost the same as setting
-       the `text` attribute to "auto" on all files except that text
-       files are not guaranteed to be normalized: files that contain
+       Setting this variable to "true" is the same as setting
+       the attributes to "auto eol=crlf" on all files.
+       Files are not guaranteed to be normalized: files that contain
        `CRLF` in the repository will not be touched.  Use this
        setting if you want to have `CRLF` line endings in your
-       working directory even though the repository does not have
-       normalized line endings.  This variable can be set to 'input',
+       working directory and the repository has normalized line endings.
+       This variable can be set to 'input',
        in which case no output conversion is performed.
 
 core.symlinks::
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index e3b1de8..c2663c7 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -115,6 +115,7 @@ text file is normalized, its line endings are converted to 
LF in the
 repository.  To control what line ending style is used in the working
 directory, use the `eol` attribute for a single file and the
 `core.eol` configuration variable for all text files.
+Note that `core.autocrlf` overrides `core.eol`
 
 Set::
 
@@ -146,8 +147,8 @@ unspecified.
 ^^^^^
 
 This attribute sets a specific line-ending style to be used in the
-working directory.  It enables end-of-line normalization without any
-content checks, effectively setting the `text` attribute.
+working directory.  It sets the `text` attribute,
+unless `text=auto` is specified.
 
 Set to string value "crlf"::
 
@@ -187,8 +188,8 @@ regardless of their content.
 
 ------------------------
 *.txt          text
-*.vcproj       eol=crlf
-*.sh           eol=lf
+*.vcproj       text eol=crlf
+*.sh           text eol=lf
 *.jpg          -text
 ------------------------
 
@@ -198,7 +199,7 @@ normalization in Git.
 
 If you simply want to have CRLF line endings in your working directory
 regardless of the repository you are working with, you can set the
-config variable "core.autocrlf" without changing any attributes.
+config variable "core.autocrlf" without using any attributes.
 
 ------------------------
 [core]
diff --git a/convert.c b/convert.c
index b6da114..4ed5d89 100644
--- a/convert.c
+++ b/convert.c
@@ -229,7 +229,9 @@ static enum eol output_eol(enum crlf_action crlf_action)
                return EOL_LF;
        case CRLF_UNDEFINED:
        case CRLF_AUTO_CRLF:
+               return EOL_CRLF;
        case CRLF_AUTO_INPUT:
+               return EOL_LF;
        case CRLF_TEXT:
        case CRLF_AUTO:
                /* fall through */
@@ -302,15 +304,12 @@ static int crlf_to_git(const char *path, const char *src, 
size_t len,
        if (crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_INPUT || 
crlf_action == CRLF_AUTO_CRLF) {
                if (stats.stat_bits & CONVERT_STAT_BITS_BIN)
                        return 0;
-
-               if (crlf_action == CRLF_AUTO_INPUT || crlf_action == 
CRLF_AUTO_CRLF) {
-                       /*
-                        * If the file in the index has any CR in it, do not 
convert.
-                        * This is the new safer autocrlf handling.
-                        */
-                       if (has_cr_in_index(path))
-                               return 0;
-               }
+               /*
+                * If the file in the index has any CR in it, do not convert.
+                * This is the new safer autocrlf handling.
+                */
+               if (has_cr_in_index(path))
+                       return 0;
        }
 
        check_safe_crlf(path, crlf_action, &stats, checksafe);
@@ -370,12 +369,10 @@ static int crlf_to_worktree(const char *path, const char 
*src, size_t len,
                return 0;
 
        if (crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_INPUT || 
crlf_action == CRLF_AUTO_CRLF) {
-               if (crlf_action == CRLF_AUTO_INPUT || crlf_action == 
CRLF_AUTO_CRLF) {
-                       /* If we have any CR or CRLF line endings, we do not 
touch it */
-                       /* This is the new safer autocrlf-handling */
-                       if (stats.lonecr || stats.crlf )
-                               return 0;
-               }
+               /* If we have any CR or CRLF line endings, we do not touch it */
+               /* This is the new safer autocrlf-handling */
+               if (stats.lonecr || stats.crlf )
+                       return 0;
 
                if (stats.stat_bits & CONVERT_STAT_BITS_BIN)
                        return 0;
@@ -836,7 +833,11 @@ static void convert_attrs(struct conv_attrs *ca, const 
char *path)
                ca->drv = git_path_check_convert(ccheck + 2);
                if (ca->crlf_action != CRLF_BINARY) {
                        enum eol eol_attr = git_path_check_eol(ccheck + 3);
-                       if (eol_attr == EOL_LF)
+                       if (ca->crlf_action == CRLF_AUTO && eol_attr == EOL_LF)
+                               ca->crlf_action = CRLF_AUTO_INPUT;
+                       else if (ca->crlf_action == CRLF_AUTO && eol_attr == 
EOL_CRLF)
+                               ca->crlf_action = CRLF_AUTO_CRLF;
+                       else if (eol_attr == EOL_LF)
                                ca->crlf_action = CRLF_TEXT_INPUT;
                        else if (eol_attr == EOL_CRLF)
                                ca->crlf_action = CRLF_TEXT_CRLF;
@@ -895,9 +896,9 @@ const char *get_convert_attr_ascii(const char *path)
        case CRLF_AUTO:
                return "text=auto";
        case CRLF_AUTO_CRLF:
-               return "text=auto eol=crlf"; /* This is not supported yet */
+               return "text=auto eol=crlf";
        case CRLF_AUTO_INPUT:
-               return "text=auto eol=lf"; /* This is not supported yet */
+               return "text=auto eol=lf";
        }
        return "";
 }
diff --git a/t/t0025-crlf-auto.sh b/t/t0025-crlf-auto.sh
index c164b46..d0bee08 100755
--- a/t/t0025-crlf-auto.sh
+++ b/t/t0025-crlf-auto.sh
@@ -114,7 +114,7 @@ test_expect_success 'autocrlf=true does not normalize CRLF 
files' '
        test -z "$LFonlydiff" -a -z "$CRLFonlydiff" -a -z "$LFwithNULdiff"
 '
 
-test_expect_success 'text=auto, autocrlf=true _does_ normalize CRLF files' '
+test_expect_success 'text=auto, autocrlf=true does not normalize CRLF files' '
 
        rm -f .gitattributes tmp LFonly CRLFonly LFwithNUL &&
        git config core.autocrlf true &&
@@ -126,7 +126,7 @@ test_expect_success 'text=auto, autocrlf=true _does_ 
normalize CRLF files' '
        LFonlydiff=$(git diff LFonly) &&
        CRLFonlydiff=$(git diff CRLFonly) &&
        LFwithNULdiff=$(git diff LFwithNUL) &&
-       test -z "$LFonlydiff" -a -n "$CRLFonlydiff" -a -z "$LFwithNULdiff"
+       test -z "$LFonlydiff" -a -z "$CRLFonlydiff" -a -z "$LFwithNULdiff"
 '
 
 test_expect_success 'text=auto, autocrlf=true does not normalize binary files' 
'
diff --git a/t/t0027-auto-crlf.sh b/t/t0027-auto-crlf.sh
index 55f45d3..86175cf 100755
--- a/t/t0027-auto-crlf.sh
+++ b/t/t0027-auto-crlf.sh
@@ -174,8 +174,8 @@ attr_ascii () {
        text,lf)   echo "text eol=lf" ;;
        text,crlf) echo "text eol=crlf" ;;
        auto,)     echo "text=auto" ;;
-       auto,lf)   echo "text eol=lf" ;;
-       auto,crlf) echo "text eol=crlf" ;;
+       auto,lf)   echo "text=auto eol=lf" ;;
+       auto,crlf) echo "text=auto eol=crlf" ;;
        lf,)       echo "text eol=lf" ;;
        crlf,)     echo "text eol=crlf" ;;
        ,) echo "" ;;
@@ -396,10 +396,9 @@ commit_chk_wrnNNO ""      ""      false   ""        ""     
   ""          ""
 commit_chk_wrnNNO ""      ""      true    LF_CRLF   ""        ""          ""   
       ""
 commit_chk_wrnNNO ""      ""      input   ""        ""        ""          ""   
       ""
 
-commit_chk_wrnNNO "auto"  ""      false   "$WILC"   "$WICL"   "$WAMIX"    ""   
       ""
-commit_chk_wrnNNO "auto"  ""      true    LF_CRLF   ""        LF_CRLF     ""   
       ""
-commit_chk_wrnNNO "auto"  ""      input   ""        CRLF_LF   CRLF_LF     ""   
       ""
-
+commit_chk_wrnNNO "auto"  ""      false   "$WILC"   ""        ""          ""   
       ""
+commit_chk_wrnNNO "auto"  ""      true    LF_CRLF   ""        ""          ""   
       ""
+commit_chk_wrnNNO "auto"  ""      input   ""        ""        ""          ""   
       ""
 for crlf in true false input;
 do
        commit_chk_wrnNNO -text ""      $crlf   ""        ""        ""          
""          ""
@@ -407,8 +406,8 @@ do
        commit_chk_wrnNNO -text crlf    $crlf   ""        ""        ""          
""          ""
        commit_chk_wrnNNO ""    lf      $crlf   ""       CRLF_LF    CRLF_LF     
 ""         CRLF_LF
        commit_chk_wrnNNO ""    crlf    $crlf   LF_CRLF   ""        LF_CRLF     
LF_CRLF     ""
-       commit_chk_wrnNNO auto  lf      $crlf   ""       CRLF_LF    CRLF_LF     
""          CRLF_LF
-       commit_chk_wrnNNO auto  crlf    $crlf   LF_CRLF   ""        LF_CRLF     
LF_CRLF     ""
+       commit_chk_wrnNNO auto  lf      $crlf   ""        ""        ""          
""          ""
+       commit_chk_wrnNNO auto  crlf    $crlf   LF_CRLF   ""        ""          
""          ""
        commit_chk_wrnNNO text  lf      $crlf   ""       CRLF_LF    CRLF_LF     
""          CRLF_LF
        commit_chk_wrnNNO text  crlf    $crlf   LF_CRLF   ""        LF_CRLF     
LF_CRLF     ""
 done
@@ -453,9 +452,9 @@ do
        check_in_repo_NNO -text ""     $crlf   LF  CRLF  CRLF_mix_LF  LF_mix_CR 
 CRLF_nul
        check_in_repo_NNO -text lf     $crlf   LF  CRLF  CRLF_mix_LF  LF_mix_CR 
 CRLF_nul
        check_in_repo_NNO -text crlf   $crlf   LF  CRLF  CRLF_mix_LF  LF_mix_CR 
 CRLF_nul
-       check_in_repo_NNO auto  ""     $crlf   LF  LF    LF           LF_mix_CR 
 CRLF_nul
-       check_in_repo_NNO auto  lf     $crlf   LF  LF    LF           LF_mix_CR 
 LF_nul
-       check_in_repo_NNO auto  crlf   $crlf   LF  LF    LF           LF_mix_CR 
 LF_nul
+       check_in_repo_NNO auto  ""     $crlf   LF  CRLF  CRLF_mix_LF  LF_mix_CR 
 CRLF_nul
+       check_in_repo_NNO auto  lf     $crlf   LF  CRLF  CRLF_mix_LF  LF_mix_CR 
 CRLF_nul
+       check_in_repo_NNO auto  crlf   $crlf   LF  CRLF  CRLF_mix_LF  LF_mix_CR 
 CRLF_nul
        check_in_repo_NNO text  ""     $crlf   LF  LF    LF           LF_mix_CR 
 LF_nul
        check_in_repo_NNO text  lf     $crlf   LF  LF    LF           LF_mix_CR 
 LF_nul
        check_in_repo_NNO text  crlf   $crlf   LF  LF    LF           LF_mix_CR 
 LF_nul
@@ -513,8 +512,6 @@ do
        # text: core.autocrlf=false and core.eol unset(or native) uses native 
eol
        checkout_files "text"  "$id"  ""    false  ""       $NL   CRLF  
$MIX_CRLF_LF $MIX_LF_CR   $LFNUL
        checkout_files "text"  "$id"  ""    false  native   $NL   CRLF  
$MIX_CRLF_LF $MIX_LF_CR   $LFNUL
-       checkout_files "auto"  "$id"  ""    false  ""       $NL   CRLF  
$MIX_CRLF_LF $MIX_LF_CR   $LFNUL
-       checkout_files "auto"  "$id"  ""    false  native   $NL   CRLF  
$MIX_CRLF_LF $MIX_LF_CR   $LFNUL
 
        for ceol in "" lf crlf native;
        do
@@ -541,30 +538,30 @@ do
        for ceol in "" lf crlf native;
        do
                # core.autocrlf=true
-               checkout_files ""      "$id" ""    true   "$ceol"   CRLF  CRLF  
CRLF_mix_LF  LF_mix_CR    LF_nul
-               checkout_files "auto"  "$id" ""    true   "$ceol"   CRLF  CRLF  
CRLF         LF_mix_CR    LF_nul
+               checkout_files ""      "$id" ""     true   "$ceol"   CRLF  CRLF 
 CRLF_mix_LF  LF_mix_CR    LF_nul
+               checkout_files "auto"  "$id" ""     true   "$ceol"   CRLF  CRLF 
 CRLF_mix_LF  LF_mix_CR    LF_nul
+               checkout_files "auto"  "$id"  ""    false   ""       $NL   CRLF 
 CRLF_mix_LF  LF_mix_CR    LF_nul
+               checkout_files "auto"  "$id"  ""    false   native   $NL   CRLF 
 CRLF_mix_LF  LF_mix_CR    LF_nul
                # text=auto + eol=XXX
-               # currently the same as text, eol=XXX
-               checkout_files "auto"  "$id" "lf"   "$crlf"  "$ceol"    LF    
CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-               checkout_files "auto"  "$id" "crlf" "$crlf"  "$ceol"    CRLF  
CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+               checkout_files "auto"  "$id" "lf"   "$crlf" "$ceol"  LF    CRLF 
 CRLF_mix_LF  LF_mix_CR    LF_nul
+               checkout_files "auto"  "$id" "crlf" "$crlf" "$ceol"  CRLF  CRLF 
 CRLF_mix_LF  LF_mix_CR    LF_nul
        done
 done
 
 #Handling with ident
 for id in ident;
 do
-       for crlf in "" true false input;
+       for crlf in true false input;
        do
                for ceol in "" lf crlf native;
                do
                        # ident does not react on core.autocrlf=true
-                       checkout_files ""      "$id" ""   "$crlf" "$ceol"   LF  
  CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+                       checkout_files ""      "$id" ""     "$crlf" "$ceol"   
LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
                        # ident does not react on text=auto
-                       checkout_files "auto"  "$id" ""    true   "$ceol"   LF  
  CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+                       checkout_files "auto"  "$id" ""      true   "$ceol"   
LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
                        # text=auto + eol=XXX
-                       # currently the same as text, eol=XXX
-                       checkout_files "auto"  "$id" "lf"   "$crlf"  "$ceol"    
LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
-                       checkout_files "auto"  "$id" "crlf" "$crlf"  "$ceol"    
CRLF  CRLF  CRLF         CRLF_mix_CR  CRLF_nul
+                       checkout_files "auto"  "$id" "lf"   "$crlf"  "$ceol"  
LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
+                       checkout_files "auto"  "$id" "crlf" "$crlf"  "$ceol"  
LF    CRLF  CRLF_mix_LF  LF_mix_CR    LF_nul
                done
        done
 done
-- 
2.8.0.rc2.2.g1a4d45a.dirty

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