Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit af3b909

Browse files
committed
Fix .gitignore handling in root directory
1 parent 34c2d55 commit af3b909

File tree

3 files changed

+251
-1
lines changed

3 files changed

+251
-1
lines changed

‎src/svn.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1077,14 +1077,20 @@ int SvnRevision::addGitIgnore(apr_pool_t *pool, const char *key, QString path,
10771077
}
10781078

10791079
// Add gitignore-File
1080-
QString gitIgnorePath = path + ".gitignore";
1080+
QString gitIgnorePath = path == "/" ? ".gitignore" : path + ".gitignore";
10811081
if (content) {
10821082
QIODevice *io = txn->addFile(gitIgnorePath, 33188, strlen(content));
10831083
if (!CommandLineParser::instance()->contains("dry-run")) {
10841084
io->write(content);
10851085
io->putChar('\n');
10861086
}
10871087
} else {
1088+
// no empty placeholder .gitignore for repository root
1089+
// this should be handled previously already, just a
1090+
// security measure here.
1091+
if (path == "/") {
1092+
return EXIT_FAILURE;
1093+
}
10881094
QIODevice *io = txn->addFile(gitIgnorePath, 33188, 0);
10891095
if (!CommandLineParser::instance()->contains("dry-run")) {
10901096
io->putChar('\n');
@@ -1122,6 +1128,11 @@ int SvnRevision::checkParentNotEmpty(apr_pool_t *pool, const char *key, QString
11221128
index = cleanPath.lastIndexOf(slash);
11231129
QString parentPath = cleanPath.left(index);
11241130

1131+
// we are in the root directory, do not add a .gitignore here
1132+
if (index == -1) {
1133+
return EXIT_FAILURE;
1134+
}
1135+
11251136
// Add gitignore-File
11261137
QString gitIgnorePath = parentPath + "/.gitignore";
11271138
QIODevice *io = txn->addFile(gitIgnorePath, 33188, 0);

‎test/empty-dirs.bats

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
load 'common'
2+
3+
@test 'deleting last file from a directory should add empty .gitignore with empty-dirs-parameter' {
4+
svn mkdir dir-a
5+
touch dir-a/file-a
6+
svn add dir-a/file-a
7+
svn commit -m 'add dir-a/file-a'
8+
svn rm dir-a/file-a
9+
svn commit -m 'delete dir-a/file-a'
10+
11+
cd "$TEST_TEMP_DIR"
12+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
13+
create repository git-repo
14+
end repository
15+
16+
match /
17+
repository git-repo
18+
branch master
19+
end match
20+
")
21+
22+
refute git -C git-repo show master:.gitignore
23+
assert git -C git-repo show master:dir-a/.gitignore
24+
assert_equal "$(git -C git-repo show master:dir-a/.gitignore)" ''
25+
}
26+
27+
@test 'deleting last file from a directory should add empty .gitignore with empty-dirs-parameter (nested)' {
28+
svn mkdir project-a
29+
cd project-a
30+
svn mkdir dir-a
31+
touch dir-a/file-a
32+
svn add dir-a/file-a
33+
svn commit -m 'add dir-a/file-a'
34+
svn rm dir-a/file-a
35+
svn commit -m 'delete dir-a/file-a'
36+
37+
cd "$TEST_TEMP_DIR"
38+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
39+
create repository git-repo
40+
end repository
41+
42+
match /project-a/
43+
repository git-repo
44+
branch master
45+
end match
46+
")
47+
48+
refute git -C git-repo show master:.gitignore
49+
assert git -C git-repo show master:dir-a/.gitignore
50+
assert_equal "$(git -C git-repo show master:dir-a/.gitignore)" ''
51+
}
52+
53+
@test 'deleting last file from root should not add empty .gitignore with empty-dirs-parameter' {
54+
touch file-a
55+
svn add file-a
56+
svn commit -m 'add file-a'
57+
svn rm file-a
58+
svn commit -m 'delete file-a'
59+
60+
cd "$TEST_TEMP_DIR"
61+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
62+
create repository git-repo
63+
end repository
64+
65+
match /
66+
repository git-repo
67+
branch master
68+
end match
69+
")
70+
71+
refute git -C git-repo show master:.gitignore
72+
refute git -C git-repo show master:file-a/.gitignore
73+
}
74+
75+
@test 'deleting last file from root should not add empty .gitignore with empty-dirs-parameter (nested)' {
76+
svn mkdir project-a
77+
cd project-a
78+
touch file-a
79+
svn add file-a
80+
svn commit -m 'add file-a'
81+
svn rm file-a
82+
svn commit -m 'delete file-a'
83+
84+
cd "$TEST_TEMP_DIR"
85+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
86+
create repository git-repo
87+
end repository
88+
89+
match /project-a/
90+
repository git-repo
91+
branch master
92+
end match
93+
")
94+
95+
refute git -C git-repo show master:.gitignore
96+
refute git -C git-repo show master:file-a/.gitignore
97+
}
98+
99+
@test 'deleting last directory from a directory should add empty .gitignore with empty-dirs-parameter' {
100+
svn mkdir --parents dir-a/subdir-a
101+
svn commit -m 'add dir-a/subdir-a'
102+
svn rm dir-a/subdir-a
103+
svn commit -m 'delete dir-a/subdir-a'
104+
105+
cd "$TEST_TEMP_DIR"
106+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
107+
create repository git-repo
108+
end repository
109+
110+
match /
111+
repository git-repo
112+
branch master
113+
end match
114+
")
115+
116+
refute git -C git-repo show master:.gitignore
117+
assert git -C git-repo show master:dir-a/.gitignore
118+
assert_equal "$(git -C git-repo show master:dir-a/.gitignore)" ''
119+
}
120+
121+
@test 'deleting last directory from a directory should add empty .gitignore with empty-dirs-parameter (nested)' {
122+
svn mkdir project-a
123+
cd project-a
124+
svn mkdir --parents dir-a/subdir-a
125+
svn commit -m 'add dir-a/subdir-a'
126+
svn rm dir-a/subdir-a
127+
svn commit -m 'delete dir-a/subdir-a'
128+
129+
cd "$TEST_TEMP_DIR"
130+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
131+
create repository git-repo
132+
end repository
133+
134+
match /project-a/
135+
repository git-repo
136+
branch master
137+
end match
138+
")
139+
140+
refute git -C git-repo show master:.gitignore
141+
assert git -C git-repo show master:dir-a/.gitignore
142+
assert_equal "$(git -C git-repo show master:dir-a/.gitignore)" ''
143+
}
144+
145+
@test 'deleting last directory from root should not add empty .gitignore with empty-dirs-parameter' {
146+
svn mkdir dir-a
147+
svn commit -m 'add dir-a'
148+
svn rm dir-a
149+
svn commit -m 'delete dir-a'
150+
151+
cd "$TEST_TEMP_DIR"
152+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
153+
create repository git-repo
154+
end repository
155+
156+
match /
157+
repository git-repo
158+
branch master
159+
end match
160+
")
161+
162+
refute git -C git-repo show master:.gitignore
163+
refute git -C git-repo show master:dir-a/.gitignore
164+
}
165+
166+
@test 'deleting last directory from root should not add empty .gitignore with empty-dirs-parameter (nested)' {
167+
svn mkdir project-a
168+
cd project-a
169+
svn mkdir dir-a
170+
svn commit -m 'add dir-a'
171+
svn rm dir-a
172+
svn commit -m 'delete dir-a'
173+
174+
cd "$TEST_TEMP_DIR"
175+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
176+
create repository git-repo
177+
end repository
178+
179+
match /project-a/
180+
repository git-repo
181+
branch master
182+
end match
183+
")
184+
185+
refute git -C git-repo show master:.gitignore
186+
refute git -C git-repo show master:dir-a/.gitignore
187+
}

‎test/svn-ignore.bats

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,55 @@ load 'common'
129129
EOF
130130
)"
131131
}
132+
133+
@test 'svn-ignore translation should be done properly on the root directory' {
134+
svn propset svn:ignore $'ignore-a\nignore-b' .
135+
svn commit -m 'ignore ignore-a and ignore-b on root'
136+
svn propset svn:global-ignores 'ignore-c' .
137+
svn commit -m 'ignore ignore-c on root and descendents'
138+
139+
cd "$TEST_TEMP_DIR"
140+
svn2git "$SVN_REPO" --svn-ignore --rules <(echo "
141+
create repository git-repo
142+
end repository
143+
144+
match /
145+
repository git-repo
146+
branch master
147+
end match
148+
")
149+
150+
assert_equal "$(git -C git-repo show master:.gitignore)" "$(cat <<-EOF
151+
/ignore-a
152+
/ignore-b
153+
ignore-c
154+
EOF
155+
)"
156+
}
157+
158+
@test 'svn-ignore translation should be done properly on the root directory (nested)' {
159+
svn mkdir project-a
160+
cd project-a
161+
svn propset svn:ignore $'ignore-a\nignore-b' .
162+
svn commit -m 'ignore ignore-a and ignore-b on root'
163+
svn propset svn:global-ignores 'ignore-c' .
164+
svn commit -m 'ignore ignore-c on root and descendents'
165+
166+
cd "$TEST_TEMP_DIR"
167+
svn2git "$SVN_REPO" --svn-ignore --rules <(echo "
168+
create repository git-repo
169+
end repository
170+
171+
match /project-a/
172+
repository git-repo
173+
branch master
174+
end match
175+
")
176+
177+
assert_equal "$(git -C git-repo show master:.gitignore)" "$(cat <<-EOF
178+
/ignore-a
179+
/ignore-b
180+
ignore-c
181+
EOF
182+
)"
183+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /