| 1 | #!/bin/sh |
| 2 | # |
| 3 | # Copyright (c) 2006 Eric Wong |
| 4 | # |
| 5 | |
| 6 | test_description='git svn property tests' |
| 7 | |
| 8 | . ./lib-git-svn.sh |
| 9 | |
| 10 | mkdir import |
| 11 | |
| 12 | a_crlf= |
| 13 | a_lf= |
| 14 | a_cr= |
| 15 | a_ne_crlf= |
| 16 | a_ne_lf= |
| 17 | a_ne_cr= |
| 18 | a_empty= |
| 19 | a_empty_lf= |
| 20 | a_empty_cr= |
| 21 | a_empty_crlf= |
| 22 | |
| 23 | cd import |
| 24 | cat >>kw.c <<\EOF |
| 25 | /* Somebody prematurely put a keyword into this file */ |
| 26 | /* $Id$ */ |
| 27 | EOF |
| 28 | |
| 29 | printf "Hello\r\nWorld\r\n" >crlf |
| 30 | a_crlf=$(git hash-object -w crlf) |
| 31 | printf "Hello\rWorld\r" >cr |
| 32 | a_cr=$(git hash-object -w cr) |
| 33 | printf "Hello\nWorld\n" >lf |
| 34 | a_lf=$(git hash-object -w lf) |
| 35 | |
| 36 | printf "Hello\r\nWorld" >ne_crlf |
| 37 | a_ne_crlf=$(git hash-object -w ne_crlf) |
| 38 | printf "Hello\nWorld" >ne_lf |
| 39 | a_ne_lf=$(git hash-object -w ne_lf) |
| 40 | printf "Hello\rWorld" >ne_cr |
| 41 | a_ne_cr=$(git hash-object -w ne_cr) |
| 42 | |
| 43 | touch empty |
| 44 | a_empty=$(git hash-object -w empty) |
| 45 | printf "\n" >empty_lf |
| 46 | a_empty_lf=$(git hash-object -w empty_lf) |
| 47 | printf "\r" >empty_cr |
| 48 | a_empty_cr=$(git hash-object -w empty_cr) |
| 49 | printf "\r\n" >empty_crlf |
| 50 | a_empty_crlf=$(git hash-object -w empty_crlf) |
| 51 | |
| 52 | svn_cmd import --no-auto-props -m 'import for git svn' . "$svnrepo" >/dev/null |
| 53 | cd .. |
| 54 | |
| 55 | rm -rf import |
| 56 | test_expect_success 'checkout working copy from svn' 'svn co "$svnrepo" test_wc' |
| 57 | test_expect_success 'setup some commits to svn' ' |
| 58 | ( |
| 59 | cd test_wc && |
| 60 | echo Greetings >>kw.c && |
| 61 | poke kw.c && |
| 62 | svn_cmd commit -m "Not yet an Id" && |
| 63 | echo Hello world >>kw.c && |
| 64 | poke kw.c && |
| 65 | svn_cmd commit -m "Modified file, but still not yet an Id" && |
| 66 | svn_cmd propset svn:keywords Id kw.c && |
| 67 | poke kw.c && |
| 68 | svn_cmd commit -m "Propset Id" |
| 69 | ) |
| 70 | ' |
| 71 | |
| 72 | test_expect_success 'initialize git svn' 'git svn init "$svnrepo"' |
| 73 | test_expect_success 'fetch revisions from svn' 'git svn fetch' |
| 74 | |
| 75 | name='test svn:keywords ignoring' |
| 76 | test_expect_success "$name" \ |
| 77 | 'git checkout -b mybranch remotes/git-svn && |
| 78 | echo Hi again >>kw.c && |
| 79 | git commit -a -m "test keywords ignoring" && |
| 80 | git svn set-tree remotes/git-svn..mybranch && |
| 81 | git pull . remotes/git-svn' |
| 82 | |
| 83 | expect='/* $Id$ */' |
| 84 | got="$(sed -ne 2p kw.c)" |
| 85 | test_expect_success 'raw $Id$ found in kw.c' "test '$expect' = '$got'" |
| 86 | |
| 87 | test_expect_success "propset CR on crlf files" ' |
| 88 | ( |
| 89 | cd test_wc && |
| 90 | svn_cmd propset svn:eol-style CR empty && |
| 91 | svn_cmd propset svn:eol-style CR crlf && |
| 92 | svn_cmd propset svn:eol-style CR ne_crlf && |
| 93 | svn_cmd commit -m "propset CR on crlf files" |
| 94 | ) |
| 95 | ' |
| 96 | |
| 97 | test_expect_success 'fetch and pull latest from svn and checkout a new wc' \ |
| 98 | 'git svn fetch && |
| 99 | git pull . remotes/git-svn && |
| 100 | svn_cmd co "$svnrepo" new_wc' |
| 101 | |
| 102 | for i in crlf ne_crlf lf ne_lf cr ne_cr empty_cr empty_lf empty empty_crlf |
| 103 | do |
| 104 | test_expect_success "Comparing $i" "cmp $i new_wc/$i" |
| 105 | done |
| 106 | |
| 107 | |
| 108 | cd test_wc |
| 109 | printf '$Id$\rHello\rWorld\r' >cr |
| 110 | printf '$Id$\rHello\rWorld' >ne_cr |
| 111 | a_cr=$(printf '$Id$\r\nHello\r\nWorld\r\n' | git hash-object --stdin) |
| 112 | a_ne_cr=$(printf '$Id$\r\nHello\r\nWorld' | git hash-object --stdin) |
| 113 | test_expect_success 'Set CRLF on cr files' \ |
| 114 | 'svn_cmd propset svn:eol-style CRLF cr && |
| 115 | svn_cmd propset svn:eol-style CRLF ne_cr && |
| 116 | svn_cmd propset svn:keywords Id cr && |
| 117 | svn_cmd propset svn:keywords Id ne_cr && |
| 118 | svn_cmd commit -m "propset CRLF on cr files"' |
| 119 | cd .. |
| 120 | test_expect_success 'fetch and pull latest from svn' \ |
| 121 | 'git svn fetch && git pull . remotes/git-svn' |
| 122 | |
| 123 | b_cr="$(git hash-object cr)" |
| 124 | b_ne_cr="$(git hash-object ne_cr)" |
| 125 | |
| 126 | test_expect_success 'CRLF + $Id$' "test '$a_cr' = '$b_cr'" |
| 127 | test_expect_success 'CRLF + $Id$ (no newline)' "test '$a_ne_cr' = '$b_ne_cr'" |
| 128 | |
| 129 | cat >show-ignore.expect <<\EOF |
| 130 | |
| 131 | # / |
| 132 | /no-such-file* |
| 133 | |
| 134 | # /deeply/ |
| 135 | /deeply/no-such-file* |
| 136 | |
| 137 | # /deeply/nested/ |
| 138 | /deeply/nested/no-such-file* |
| 139 | |
| 140 | # /deeply/nested/directory/ |
| 141 | /deeply/nested/directory/no-such-file* |
| 142 | EOF |
| 143 | |
| 144 | test_expect_success 'test show-ignore' " |
| 145 | ( |
| 146 | cd test_wc && |
| 147 | mkdir -p deeply/nested/directory && |
| 148 | touch deeply/nested/directory/.keep && |
| 149 | svn_cmd add deeply && |
| 150 | svn_cmd up && |
| 151 | svn_cmd propset -R svn:ignore ' |
| 152 | no-such-file* |
| 153 | ' . && |
| 154 | svn_cmd commit -m 'propset svn:ignore' |
| 155 | ) && |
| 156 | git svn show-ignore >show-ignore.got && |
| 157 | cmp show-ignore.expect show-ignore.got |
| 158 | " |
| 159 | |
| 160 | cat >create-ignore.expect <<\EOF |
| 161 | /no-such-file* |
| 162 | EOF |
| 163 | |
| 164 | expectoid=$(git hash-object create-ignore.expect) |
| 165 | |
| 166 | cat >create-ignore-index.expect <<EOF |
| 167 | 100644 $expectoid 0 .gitignore |
| 168 | 100644 $expectoid 0 deeply/.gitignore |
| 169 | 100644 $expectoid 0 deeply/nested/.gitignore |
| 170 | 100644 $expectoid 0 deeply/nested/directory/.gitignore |
| 171 | EOF |
| 172 | |
| 173 | test_expect_success 'test create-ignore' " |
| 174 | git svn fetch && git pull . remotes/git-svn && |
| 175 | git svn create-ignore && |
| 176 | cmp ./.gitignore create-ignore.expect && |
| 177 | cmp ./deeply/.gitignore create-ignore.expect && |
| 178 | cmp ./deeply/nested/.gitignore create-ignore.expect && |
| 179 | cmp ./deeply/nested/directory/.gitignore create-ignore.expect && |
| 180 | git ls-files -s >ls_files_result && |
| 181 | grep gitignore ls_files_result | cmp - create-ignore-index.expect |
| 182 | " |
| 183 | |
| 184 | cat >prop.expect <<\EOF |
| 185 | |
| 186 | no-such-file* |
| 187 | |
| 188 | EOF |
| 189 | cat >prop2.expect <<\EOF |
| 190 | 8 |
| 191 | EOF |
| 192 | |
| 193 | # This test can be improved: since all the svn:ignore contain the same |
| 194 | # pattern, it can pass even though the propget did not execute on the |
| 195 | # right directory. |
| 196 | test_expect_success 'test propget' ' |
| 197 | test_propget () { |
| 198 | git svn propget $1 $2 >actual && |
| 199 | cmp $3 actual |
| 200 | } && |
| 201 | test_propget svn:ignore . prop.expect && |
| 202 | cd deeply && |
| 203 | test_propget svn:ignore . ../prop.expect && |
| 204 | test_propget svn:entry:committed-rev nested/directory/.keep \ |
| 205 | ../prop2.expect && |
| 206 | test_propget svn:ignore .. ../prop.expect && |
| 207 | test_propget svn:ignore nested/ ../prop.expect && |
| 208 | test_propget svn:ignore ./nested ../prop.expect && |
| 209 | test_propget svn:ignore .././deeply/nested ../prop.expect |
| 210 | ' |
| 211 | |
| 212 | cat >prop.expect <<\EOF |
| 213 | Properties on '.': |
| 214 | svn:entry:committed-date |
| 215 | svn:entry:committed-rev |
| 216 | svn:entry:last-author |
| 217 | svn:entry:uuid |
| 218 | svn:ignore |
| 219 | EOF |
| 220 | cat >prop2.expect <<\EOF |
| 221 | Properties on 'nested/directory/.keep': |
| 222 | svn:entry:committed-date |
| 223 | svn:entry:committed-rev |
| 224 | svn:entry:last-author |
| 225 | svn:entry:uuid |
| 226 | EOF |
| 227 | |
| 228 | test_expect_success 'test proplist' " |
| 229 | git svn proplist . >actual && |
| 230 | cmp prop.expect actual && |
| 231 | |
| 232 | git svn proplist nested/directory/.keep >actual && |
| 233 | cmp prop2.expect actual |
| 234 | " |
| 235 | |
| 236 | test_done |