Ran across this while writing a "populate new repo" script, that used svn cp to copy a set of svn-hooks in place (by definition from one repo to another.) What happens is that when a file in the source repo (called "foreign" here) has svn:executable set, the working dir in the destination (called "local" here) looks right - ls -l shows the +x bits, svn proplist -v shows the property, even .svn/props-base mentions it. The commit, on the other hand, doesn't push it to the repository. This means that the local checkout is now a "persistent lie" (in that trying to set it there and commit it does nothing, because it's "already" set.) A fresh checkout of the result shows the bits missing, though.
I'm doing copy from url to working dir because in practice, I need to do some variable substitution before pushing the file to the new repo; that substitution isn't in the script because without it, the bug still happens. I've only tested this on "svn, version 1.6.12 (r955767) - compiled Jun 5 2011, 14:55:20" which is 1.6.12dfsg-1ubuntu1.3 from Ubuntu 10.10 (maverick.) Also, while the test is between two locally built repos with file:// urls, I originally saw the problem going between https:// and svn+ssh:// which distracted me :-) So I'd appreciate if people who can conveniently do so would test this on newer versions. Thanks. #!/bin/sh -e ################################################ LOCAL_REPO_DIR=/tmp/svn-propcopy-repo-local FOREIGN_REPO_DIR=/tmp/svn-propcopy-repo-foreign PREP_FOREIGN_WORKDIR=/tmp/svn-propcopy-work-prep PERFORM_COPY_WORKDIR=/tmp/svn-propcopy-work-copy SHOW_FAILURE_WORKDIR=/tmp/svn-propcopy-work-show rm -rf $LOCAL_REPO_DIR rm -rf $FOREIGN_REPO_DIR rm -rf $PREP_FOREIGN_WORKDIR; mkdir -p $PREP_FOREIGN_WORKDIR rm -rf $PERFORM_COPY_WORKDIR; mkdir -p $PERFORM_COPY_WORKDIR rm -rf $SHOW_FAILURE_WORKDIR; mkdir -p $SHOW_FAILURE_WORKDIR ################################################ echo ==== create two repos: one local, ==== svnadmin create $LOCAL_REPO_DIR LOCAL_REPO=file:////$LOCAL_REPO_DIR svn mkdir -m 'trunk' $LOCAL_REPO/trunk svn mkdir -m 'branch' $LOCAL_REPO/branch echo ==== one '"foreign"' ==== svnadmin create $FOREIGN_REPO_DIR FOREIGN_REPO=file:////$FOREIGN_REPO_DIR svn mkdir -m 'trunk 2' $FOREIGN_REPO/trunk svn mkdir -m 'branch 2' $FOREIGN_REPO/branch ################################################ echo ==== Create an executable file in the foreign repo. ==== svn co $FOREIGN_REPO/trunk $PREP_FOREIGN_WORKDIR/trunk cat > $PREP_FOREIGN_WORKDIR/trunk/program <<EOF #!/bin/sh echo running 1 EOF svn add $PREP_FOREIGN_WORKDIR/trunk/program svn propset svn:executable '*' $PREP_FOREIGN_WORKDIR/trunk/program svn commit -m 'committed a file' $PREP_FOREIGN_WORKDIR/trunk ################################################ echo ==== Copy the executable from the foreign repo to the local one. ==== svn co $LOCAL_REPO/branch $PERFORM_COPY_WORKDIR/branch svn copy $FOREIGN_REPO/trunk/program $PERFORM_COPY_WORKDIR/branch/copied-program ls -l $PERFORM_COPY_WORKDIR/branch svn commit -m 'copied program' $PERFORM_COPY_WORKDIR/branch svn proplist -vR $PERFORM_COPY_WORKDIR/branch echo ==== Notice that copied-program still has +x set, and the property set... ==== ################################################ echo ==== Now check out the local tree and see that we''ve lost the props. ==== svn co $LOCAL_REPO/branch $SHOW_FAILURE_WORKDIR/branch ls -l $SHOW_FAILURE_WORKDIR/branch svn proplist -vR $SHOW_FAILURE_WORKDIR/branch svn --version -- _Mark_ <eic...@thok.org> <eic...@gmail.com>