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 f141909

Browse files
committed
Fix .gitignore handling in root directory
1 parent 0833cc2 commit f141909

File tree

3 files changed

+250
-1
lines changed

3 files changed

+250
-1
lines changed

‎src/svn.cpp

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

10981098
// Add gitignore-File
1099-
QString gitIgnorePath = path + ".gitignore";
1099+
QString gitIgnorePath = path == "/" ? ".gitignore" : path + ".gitignore";
11001100
if (content) {
11011101
QIODevice *io = txn->addFile(gitIgnorePath, 33188, strlen(content));
11021102
if (!CommandLineParser::instance()->contains("dry-run")) {
11031103
io->write(content);
11041104
io->putChar('\n');
11051105
}
11061106
} else {
1107+
// no empty placeholder .gitignore for repository root
1108+
// this should be handled previously already, just a
1109+
// security measure here.
1110+
if (path == "/") {
1111+
return EXIT_FAILURE;
1112+
}
11071113
QIODevice *io = txn->addFile(gitIgnorePath, 33188, 0);
11081114
if (!CommandLineParser::instance()->contains("dry-run")) {
11091115
io->putChar('\n');
@@ -1141,6 +1147,11 @@ int SvnRevision::checkParentNotEmpty(apr_pool_t *pool, const char *key, QString
11411147
index = cleanPath.lastIndexOf(slash);
11421148
QString parentPath = cleanPath.left(index);
11431149

1150+
// we are in the root directory, do not add a .gitignore here
1151+
if (index == -1) {
1152+
return EXIT_FAILURE;
1153+
}
1154+
11441155
// Add gitignore-File
11451156
QString gitIgnorePath = parentPath + "/.gitignore";
11461157
QIODevice *io = txn->addFile(gitIgnorePath, 33188, 0);

‎test/empty-dirs.bats

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,189 @@ load 'common'
213213

214214
assert [ "$(grep -c '^M .* dir-a/file-a$' git-repo.fi)" -eq 1 ]
215215
}
216+
217+
@test 'deleting last file from a directory should add empty .gitignore with empty-dirs-parameter' {
218+
svn mkdir dir-a
219+
touch dir-a/file-a
220+
svn add dir-a/file-a
221+
svn commit -m 'add dir-a/file-a'
222+
svn rm dir-a/file-a
223+
svn commit -m 'delete dir-a/file-a'
224+
225+
cd "$TEST_TEMP_DIR"
226+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
227+
create repository git-repo
228+
end repository
229+
230+
match /
231+
repository git-repo
232+
branch master
233+
end match
234+
")
235+
236+
refute git -C git-repo show master:.gitignore
237+
assert git -C git-repo show master:dir-a/.gitignore
238+
assert_equal "$(git -C git-repo show master:dir-a/.gitignore)" ''
239+
}
240+
241+
@test 'deleting last file from a directory should add empty .gitignore with empty-dirs-parameter (nested)' {
242+
svn mkdir project-a
243+
cd project-a
244+
svn mkdir dir-a
245+
touch dir-a/file-a
246+
svn add dir-a/file-a
247+
svn commit -m 'add dir-a/file-a'
248+
svn rm dir-a/file-a
249+
svn commit -m 'delete dir-a/file-a'
250+
251+
cd "$TEST_TEMP_DIR"
252+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
253+
create repository git-repo
254+
end repository
255+
256+
match /project-a/
257+
repository git-repo
258+
branch master
259+
end match
260+
")
261+
262+
refute git -C git-repo show master:.gitignore
263+
assert git -C git-repo show master:dir-a/.gitignore
264+
assert_equal "$(git -C git-repo show master:dir-a/.gitignore)" ''
265+
}
266+
267+
@test 'deleting last file from root should not add empty .gitignore with empty-dirs-parameter' {
268+
touch file-a
269+
svn add file-a
270+
svn commit -m 'add file-a'
271+
svn rm file-a
272+
svn commit -m 'delete file-a'
273+
274+
cd "$TEST_TEMP_DIR"
275+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
276+
create repository git-repo
277+
end repository
278+
279+
match /
280+
repository git-repo
281+
branch master
282+
end match
283+
")
284+
285+
refute git -C git-repo show master:.gitignore
286+
refute git -C git-repo show master:file-a/.gitignore
287+
}
288+
289+
@test 'deleting last file from root should not add empty .gitignore with empty-dirs-parameter (nested)' {
290+
svn mkdir project-a
291+
cd project-a
292+
touch file-a
293+
svn add file-a
294+
svn commit -m 'add file-a'
295+
svn rm file-a
296+
svn commit -m 'delete file-a'
297+
298+
cd "$TEST_TEMP_DIR"
299+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
300+
create repository git-repo
301+
end repository
302+
303+
match /project-a/
304+
repository git-repo
305+
branch master
306+
end match
307+
")
308+
309+
refute git -C git-repo show master:.gitignore
310+
refute git -C git-repo show master:file-a/.gitignore
311+
}
312+
313+
@test 'deleting last directory from a directory should add empty .gitignore with empty-dirs-parameter' {
314+
svn mkdir --parents dir-a/subdir-a
315+
svn commit -m 'add dir-a/subdir-a'
316+
svn rm dir-a/subdir-a
317+
svn commit -m 'delete dir-a/subdir-a'
318+
319+
cd "$TEST_TEMP_DIR"
320+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
321+
create repository git-repo
322+
end repository
323+
324+
match /
325+
repository git-repo
326+
branch master
327+
end match
328+
")
329+
330+
refute git -C git-repo show master:.gitignore
331+
assert git -C git-repo show master:dir-a/.gitignore
332+
assert_equal "$(git -C git-repo show master:dir-a/.gitignore)" ''
333+
}
334+
335+
@test 'deleting last directory from a directory should add empty .gitignore with empty-dirs-parameter (nested)' {
336+
svn mkdir project-a
337+
cd project-a
338+
svn mkdir --parents dir-a/subdir-a
339+
svn commit -m 'add dir-a/subdir-a'
340+
svn rm dir-a/subdir-a
341+
svn commit -m 'delete dir-a/subdir-a'
342+
343+
cd "$TEST_TEMP_DIR"
344+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
345+
create repository git-repo
346+
end repository
347+
348+
match /project-a/
349+
repository git-repo
350+
branch master
351+
end match
352+
")
353+
354+
refute git -C git-repo show master:.gitignore
355+
assert git -C git-repo show master:dir-a/.gitignore
356+
assert_equal "$(git -C git-repo show master:dir-a/.gitignore)" ''
357+
}
358+
359+
@test 'deleting last directory from root should not add empty .gitignore with empty-dirs-parameter' {
360+
svn mkdir dir-a
361+
svn commit -m 'add dir-a'
362+
svn rm dir-a
363+
svn commit -m 'delete dir-a'
364+
365+
cd "$TEST_TEMP_DIR"
366+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
367+
create repository git-repo
368+
end repository
369+
370+
match /
371+
repository git-repo
372+
branch master
373+
end match
374+
")
375+
376+
refute git -C git-repo show master:.gitignore
377+
refute git -C git-repo show master:dir-a/.gitignore
378+
}
379+
380+
@test 'deleting last directory from root should not add empty .gitignore with empty-dirs-parameter (nested)' {
381+
svn mkdir project-a
382+
cd project-a
383+
svn mkdir dir-a
384+
svn commit -m 'add dir-a'
385+
svn rm dir-a
386+
svn commit -m 'delete dir-a'
387+
388+
cd "$TEST_TEMP_DIR"
389+
svn2git "$SVN_REPO" --empty-dirs --rules <(echo "
390+
create repository git-repo
391+
end repository
392+
393+
match /project-a/
394+
repository git-repo
395+
branch master
396+
end match
397+
")
398+
399+
refute git -C git-repo show master:.gitignore
400+
refute git -C git-repo show master:dir-a/.gitignore
401+
}

‎test/svn-ignore.bats

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,3 +221,55 @@ load 'common'
221221
assert_equal "$(git -C git-repo show master:dir-a/.gitignore)" '/ignore-a'
222222
assert git -C git-repo show master:dir-a/file-a
223223
}
224+
225+
@test 'svn-ignore translation should be done properly on the root directory' {
226+
svn propset svn:ignore $'ignore-a\nignore-b' .
227+
svn commit -m 'ignore ignore-a and ignore-b on root'
228+
svn propset svn:global-ignores 'ignore-c' .
229+
svn commit -m 'ignore ignore-c on root and descendents'
230+
231+
cd "$TEST_TEMP_DIR"
232+
svn2git "$SVN_REPO" --svn-ignore --rules <(echo "
233+
create repository git-repo
234+
end repository
235+
236+
match /
237+
repository git-repo
238+
branch master
239+
end match
240+
")
241+
242+
assert_equal "$(git -C git-repo show master:.gitignore)" "$(cat <<-EOF
243+
/ignore-a
244+
/ignore-b
245+
ignore-c
246+
EOF
247+
)"
248+
}
249+
250+
@test 'svn-ignore translation should be done properly on the root directory (nested)' {
251+
svn mkdir project-a
252+
cd project-a
253+
svn propset svn:ignore $'ignore-a\nignore-b' .
254+
svn commit -m 'ignore ignore-a and ignore-b on root'
255+
svn propset svn:global-ignores 'ignore-c' .
256+
svn commit -m 'ignore ignore-c on root and descendents'
257+
258+
cd "$TEST_TEMP_DIR"
259+
svn2git "$SVN_REPO" --svn-ignore --rules <(echo "
260+
create repository git-repo
261+
end repository
262+
263+
match /project-a/
264+
repository git-repo
265+
branch master
266+
end match
267+
")
268+
269+
assert_equal "$(git -C git-repo show master:.gitignore)" "$(cat <<-EOF
270+
/ignore-a
271+
/ignore-b
272+
ignore-c
273+
EOF
274+
)"
275+
}

0 commit comments

Comments
(0)

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