t / t3910-mac-os-precompose.shon commit t3404: rebase -i: demonstrate short SHA-1 collision (66ae9a5)
   1#!/bin/sh
   2#
   3# Copyright (c) 2012 Torsten Bögershausen
   4#
   5
   6test_description='utf-8 decomposed (nfd) converted to precomposed (nfc)'
   7
   8. ./test-lib.sh
   9
  10if ! test_have_prereq UTF8_NFD_TO_NFC
  11then
  12        skip_all="filesystem does not corrupt utf-8"
  13        test_done
  14fi
  15
  16# create utf-8 variables
  17Adiarnfc=`printf '\303\204'`
  18Adiarnfd=`printf 'A\314\210'`
  19
  20Odiarnfc=`printf '\303\226'`
  21Odiarnfd=`printf 'O\314\210'`
  22AEligatu=`printf '\303\206'`
  23Invalidu=`printf '\303\377'`
  24
  25
  26#Create a string with 255 bytes (decomposed)
  27Alongd=$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd #21 Byte
  28Alongd=$Alongd$Alongd$Alongd                                           #63 Byte
  29Alongd=$Alongd$Alongd$Alongd$Alongd$Adiarnfd                           #255 Byte
  30
  31#Create a string with 254 bytes (precomposed)
  32Alongc=$AEligatu$AEligatu$AEligatu$AEligatu$AEligatu #10 Byte
  33Alongc=$Alongc$Alongc$Alongc$Alongc$Alongc           #50 Byte
  34Alongc=$Alongc$Alongc$Alongc$Alongc$Alongc           #250 Byte
  35Alongc=$Alongc$AEligatu$AEligatu                     #254 Byte
  36
  37test_expect_success "detect if nfd needed" '
  38        precomposeunicode=`git config core.precomposeunicode` &&
  39        test "$precomposeunicode" = false &&
  40        git config core.precomposeunicode true
  41'
  42test_expect_success "setup" '
  43        >x &&
  44        git add x &&
  45        git commit -m "1st commit" &&
  46        git rm x &&
  47        git commit -m "rm x"
  48'
  49test_expect_success "setup case mac" '
  50        git checkout -b mac_os
  51'
  52# This will test nfd2nfc in readdir()
  53test_expect_success "add file Adiarnfc" '
  54        echo f.Adiarnfc >f.$Adiarnfc &&
  55        git add f.$Adiarnfc &&
  56        git commit -m "add f.$Adiarnfc"
  57'
  58# This will test nfd2nfc in git stage()
  59test_expect_success "stage file d.Adiarnfd/f.Adiarnfd" '
  60        mkdir d.$Adiarnfd &&
  61        echo d.$Adiarnfd/f.$Adiarnfd >d.$Adiarnfd/f.$Adiarnfd &&
  62        git stage d.$Adiarnfd/f.$Adiarnfd &&
  63        git commit -m "add d.$Adiarnfd/f.$Adiarnfd"
  64'
  65test_expect_success "add link Adiarnfc" '
  66        ln -s d.$Adiarnfd/f.$Adiarnfd l.$Adiarnfc &&
  67        git add l.$Adiarnfc &&
  68        git commit -m "add l.Adiarnfc"
  69'
  70# This will test git log
  71test_expect_success "git log f.Adiar" '
  72        git log f.$Adiarnfc > f.Adiarnfc.log &&
  73        git log f.$Adiarnfd > f.Adiarnfd.log &&
  74        test -s f.Adiarnfc.log &&
  75        test -s f.Adiarnfd.log &&
  76        test_cmp f.Adiarnfc.log f.Adiarnfd.log &&
  77        rm f.Adiarnfc.log f.Adiarnfd.log
  78'
  79# This will test git ls-files
  80test_expect_success "git lsfiles f.Adiar" '
  81        git ls-files f.$Adiarnfc > f.Adiarnfc.log &&
  82        git ls-files f.$Adiarnfd > f.Adiarnfd.log &&
  83        test -s f.Adiarnfc.log &&
  84        test -s f.Adiarnfd.log &&
  85        test_cmp f.Adiarnfc.log f.Adiarnfd.log &&
  86        rm f.Adiarnfc.log f.Adiarnfd.log
  87'
  88# This will test git mv
  89test_expect_success "git mv" '
  90        git mv f.$Adiarnfd f.$Odiarnfc &&
  91        git mv d.$Adiarnfd d.$Odiarnfc &&
  92        git mv l.$Adiarnfd l.$Odiarnfc &&
  93        git commit -m "mv Adiarnfd Odiarnfc"
  94'
  95# Files can be checked out as nfc
  96# And the link has been corrected from nfd to nfc
  97test_expect_success "git checkout nfc" '
  98        rm f.$Odiarnfc &&
  99        git checkout f.$Odiarnfc
 100'
 101# Make it possible to checkout files with their NFD names
 102test_expect_success "git checkout file nfd" '
 103        rm -f f.* &&
 104        git checkout f.$Odiarnfd
 105'
 106# Make it possible to checkout links with their NFD names
 107test_expect_success "git checkout link nfd" '
 108        rm l.* &&
 109        git checkout l.$Odiarnfd
 110'
 111test_expect_success "setup case mac2" '
 112        git checkout master &&
 113        git reset --hard &&
 114        git checkout -b mac_os_2
 115'
 116# This will test nfd2nfc in git commit
 117test_expect_success "commit file d2.Adiarnfd/f.Adiarnfd" '
 118        mkdir d2.$Adiarnfd &&
 119        echo d2.$Adiarnfd/f.$Adiarnfd >d2.$Adiarnfd/f.$Adiarnfd &&
 120        git add d2.$Adiarnfd/f.$Adiarnfd &&
 121        git commit -m "add d2.$Adiarnfd/f.$Adiarnfd" -- d2.$Adiarnfd/f.$Adiarnfd
 122'
 123test_expect_success "setup for long decomposed filename" '
 124        git checkout master &&
 125        git reset --hard &&
 126        git checkout -b mac_os_long_nfd_fn
 127'
 128test_expect_success "Add long decomposed filename" '
 129        echo longd >$Alongd &&
 130        git add * &&
 131        git commit -m "Long filename"
 132'
 133test_expect_success "setup for long precomposed filename" '
 134        git checkout master &&
 135        git reset --hard &&
 136        git checkout -b mac_os_long_nfc_fn
 137'
 138test_expect_success "Add long precomposed filename" '
 139        echo longc >$Alongc &&
 140        git add * &&
 141        git commit -m "Long filename"
 142'
 143# Test if the global core.precomposeunicode stops autosensing
 144# Must be the last test case
 145test_expect_success "respect git config --global core.precomposeunicode" '
 146        git config --global core.precomposeunicode true &&
 147        rm -rf .git &&
 148        git init &&
 149        precomposeunicode=`git config core.precomposeunicode` &&
 150        test "$precomposeunicode" = "true"
 151'
 152
 153test_done