Hello, Julian! I've checked that the latest trunk version skips the directory in this case (much better than making it a file). So I'm not sure if it is possible to turn it into directory addition at all.
Anyway I've created a test for the case. I'm not 100% sure in the expected output/disk/status of the test but from the first glance it looks ok. The test fails because it expects a directory with a property to be created but it is skipped. -- Dmitry Pavlenko, TMate Software, http://subgit.com/ - git-svn bridge > Hello! > When I apply Git format patch that adds a directory with properties, a file > is added instead. > > Here I provide a reproducing script and also add a file for comparison. > > I think the origin of the problem in the fact that SVN patch doesn't keep > "node kind". But a patch in "svn diff --git" format does. Here's the example > of the patch. Notice > > a) "Property changes on: dir" and "Property changes on: file" lines; > b) "new file mode 10644" for file and no such line for directory; > > allowing to distinguish between files and directories. > > I don't know whether it's a known issue or not but I think it would be nice > to infer "node kind" from that information and also (if this is not already > done) by the following logic: if patch changes "dir" and "dir/someFile", > then "dir" is probably a directory. > > > Index: /tmp/wc/dir > =================================================================== > diff --git a/dir b/dir > --- a/dir (nonexistent) > +++ b/dir (working copy) > > Property changes on: dir > ___________________________________________________________________ > Added: propName > ## -0,0 +1 ## > +propValue > \ No newline at end of property > Index: /tmp/wc/file > =================================================================== > diff --git a/file b/file > new file mode 10644 > > Property changes on: file > ___________________________________________________________________ > Added: propName > ## -0,0 +1 ## > +propValue > \ No newline at end of property > > > > The reproducing script: > > > #!/bin/sh > > SVN=svn > > #1. Create an empty SVN repository. > > REPOSITORY_PATH="$PWD/svn.repo" > > svnadmin create "$REPOSITORY_PATH" > > # 2. Add a file with properties and a directory with properties to the > repository. > > WC_PATH="/tmp/wc" > REPOSITORY_URL="file://$REPOSITORY_PATH" > > $SVN co $REPOSITORY_URL $WC_PATH > > touch $WC_PATH/file > > $SVN add $WC_PATH/file > $SVN mkdir $WC_PATH/dir > > $SVN propset propName propValue $WC_PATH/file > $SVN propset propName propValue $WC_PATH/dir > > # 3. Create diff between repository HEAD and working copy: > > PATCH_FILE=/tmp/patch > > $SVN diff --git $REPOSITORY_URL $WC_PATH > $PATCH_FILE > > # 4. Cleanup the working copy > > $SVN revert $WC_PATH/file > $SVN revert $WC_PATH/dir > > rm $WC_PATH/file > rmdir $WC_PATH/dir > > # 5. Apply the patch back: > > $SVN patch $PATCH_FILE $WC_PATH > > # 6. Make sure that the file is file and that dir is directory > > FILE_TYPE=`stat -c "%F" $WC_PATH/file` > DIRECTORY_TYPE=`stat -c "%F" $WC_PATH/dir` > > if [ "$FILE_TYPE" != "regular empty file" ] ; then > echo "================" > echo "File is not file but $FILE_TYPE" > echo "================" > fi > > if [ "$DIRECTORY_TYPE" != "directory" ] ; then > echo "================" > echo "Dir is not directory but $DIRECTORY_TYPE" > echo "================" > fi
Index: subversion/tests/cmdline/patch_tests.py =================================================================== --- subversion/tests/cmdline/patch_tests.py (revision 1836275) +++ subversion/tests/cmdline/patch_tests.py (working copy) @@ -7913,6 +7913,56 @@ def patch_empty_prop(sbox): os.chdir(was_cwd) +def patch_git_empty_directory_with_prop(sbox): + "empty directory addition confused with file" + sbox.build(empty=True) + wc_dir = sbox.wc_dir + + # This patch is generated for empty directory addition with property by version 1.10 + git_patch = [ "Index: dir\n", + "===================================================================\n", + "diff --git a/dir b/dir\n", + "--- a/dir (nonexistent)\n", + "+++ b/dir (working copy)\n", + "\n", + "Property changes on: dir\n", + "___________________________________________________________________\n", + "Added: p\n", + "## -0,0 +1 ##\n", + "+v\n", + "\ No newline at end of property\n", + ] + value = 'v' + + patch_file_path = sbox.get_tempname('my.patch') + svntest.main.file_write(patch_file_path, ''.join(git_patch), 'wb') + + dir_path = sbox.path('dir') + + expected_output = wc.State(wc_dir, { + 'dir' : Item(status='A '), + }) + expected_disk = svntest.wc.State('', {}) + expected_disk.add({'dir': Item(props={'p' : value })}) + expected_status = svntest.wc.State(wc_dir, {}) + expected_status.add({'dir': Item(status='A ', wc_rev='0')}) + expected_skip = wc.State('', { }) + + svntest.actions.run_and_verify_patch(wc_dir, patch_file_path, + expected_output, + expected_disk, + expected_status, + expected_skip, + None, # expected err + True, # check-props + False, # dry-run + ) + + svntest.actions.check_prop('p', dir_path, [value.encode()]) + + if not os.path.isdir(dir_path): + raise svntest.Failure + ######################################################################## #Run the tests @@ -7998,6 +8048,7 @@ test_list = [ None, patch_merge, patch_mergeinfo_in_regular_prop_format, patch_empty_prop, + patch_git_empty_directory_with_prop, ] if __name__ == '__main__':