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__':