Modified: subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRepos.java URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRepos.java?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRepos.java (original) +++ subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRepos.java Sun Jun 14 20:58:10 2015 @@ -34,138 +34,138 @@ import org.apache.subversion.javahl.type public interface ISVNRepos { - /** - * interface to receive the messages - */ - public static interface MessageReceiver - { - /** - * receive one message line - * @param message one line of message - */ - public void receiveMessageLine(String message); - } - - /** - * release the native peer (should not depend on finalize) - */ - public abstract void dispose(); - - /** - * Filesystem in a Berkeley DB - */ - public static final String BDB = "bdb"; - /** - * Filesystem in the filesystem - */ - public static final String FSFS = "fsfs"; - - /** - * @return Version information about the underlying native libraries. - */ - public abstract Version getVersion(); - - /** - * create a subversion repository. - * @param path the path where the repository will been - * created. - * @param disableFsyncCommit disable to fsync at the commit (BDB). - * @param keepLog keep the log files (BDB). - * @param configPath optional path for user configuration files. - * @param fstype the type of the filesystem (BDB or FSFS) - * @throws ClientException throw in case of problem - */ - public abstract void create(File path, boolean disableFsyncCommit, - boolean keepLog, File configPath, String fstype) - throws ClientException; - - /** - * deltify the revisions in the repository - * @param path the path to the repository - * @param start start revision - * @param end end revision - * @throws ClientException throw in case of problem - */ - public abstract void deltify(File path, Revision start, Revision end) - throws ClientException; - - /** - * dump the data in a repository - * @param path the path to the repository - * @param dataOut the data will be outputed here - * @param start the first revision to be dumped - * @param end the last revision to be dumped - * @param incremental the dump will be incremantal - * @param useDeltas the dump will contain deltas between nodes + /** + * interface to receive the messages + */ + public static interface MessageReceiver + { + /** + * receive one message line + * @param message one line of message + */ + public void receiveMessageLine(String message); + } + + /** + * release the native peer (should not depend on finalize) + */ + public abstract void dispose(); + + /** + * Filesystem in a Berkeley DB + */ + public static final String BDB = "bdb"; + /** + * Filesystem in the filesystem + */ + public static final String FSFS = "fsfs"; + + /** + * @return Version information about the underlying native libraries. + */ + public abstract Version getVersion(); + + /** + * create a subversion repository. + * @param path the path where the repository will been + * created. + * @param disableFsyncCommit disable to fsync at the commit (BDB). + * @param keepLog keep the log files (BDB). + * @param configPath optional path for user configuration files. + * @param fstype the type of the filesystem (BDB or FSFS) + * @throws ClientException throw in case of problem + */ + public abstract void create(File path, boolean disableFsyncCommit, + boolean keepLog, File configPath, String fstype) + throws ClientException; + + /** + * deltify the revisions in the repository + * @param path the path to the repository + * @param start start revision + * @param end end revision + * @throws ClientException throw in case of problem + */ + public abstract void deltify(File path, Revision start, Revision end) + throws ClientException; + + /** + * dump the data in a repository + * @param path the path to the repository + * @param dataOut the data will be outputed here + * @param start the first revision to be dumped + * @param end the last revision to be dumped + * @param incremental the dump will be incremantal + * @param useDeltas the dump will contain deltas between nodes * @param callback the callback to receive notifications - * @throws ClientException throw in case of problem - */ - public abstract void dump(File path, OutputStream dataOut, + * @throws ClientException throw in case of problem + */ + public abstract void dump(File path, OutputStream dataOut, Revision start, Revision end, boolean incremental, boolean useDeltas, ReposNotifyCallback callback) - throws ClientException; + throws ClientException; - /** - * make a hot copy of the repository - * @param path the path to the source repository - * @param targetPath the path to the target repository - * @param cleanLogs clean the unused log files in the source - * repository + /** + * make a hot copy of the repository + * @param path the path to the source repository + * @param targetPath the path to the target repository + * @param cleanLogs clean the unused log files in the source + * repository * @param callback the callback to receive notifications - * @throws ClientException throw in case of problem + * @throws ClientException throw in case of problem * @since 1.9 - */ - public abstract void hotcopy(File path, File targetPath, + */ + public abstract void hotcopy(File path, File targetPath, boolean cleanLogs, boolean incremental, ReposNotifyCallback callback) throws ClientException; - public abstract void hotcopy(File path, File targetPath, - boolean cleanLogs, boolean incremental) + public abstract void hotcopy(File path, File targetPath, + boolean cleanLogs, boolean incremental) throws ClientException; - public abstract void hotcopy(File path, File targetPath, - boolean cleanLogs) throws ClientException; + public abstract void hotcopy(File path, File targetPath, + boolean cleanLogs) throws ClientException; - /** - * list all logfiles (BDB) in use or not) - * @param path the path to the repository - * @param receiver interface to receive the logfile names - * @throws ClientException throw in case of problem - */ - public abstract void listDBLogs(File path, MessageReceiver receiver) - throws ClientException; - - /** - * list unused logfiles - * @param path the path to the repository - * @param receiver interface to receive the logfile names - * @throws ClientException throw in case of problem - */ - public abstract void listUnusedDBLogs(File path, MessageReceiver receiver) - throws ClientException; - - - /** - * load the data of a dump into a repository - * @param path the path to the repository - * @param dataInput the data input source + /** + * list all logfiles (BDB) in use or not) + * @param path the path to the repository + * @param receiver interface to receive the logfile names + * @throws ClientException throw in case of problem + */ + public abstract void listDBLogs(File path, MessageReceiver receiver) + throws ClientException; + + /** + * list unused logfiles + * @param path the path to the repository + * @param receiver interface to receive the logfile names + * @throws ClientException throw in case of problem + */ + public abstract void listUnusedDBLogs(File path, MessageReceiver receiver) + throws ClientException; + + + /** + * load the data of a dump into a repository + * @param path the path to the repository + * @param dataInput the data input source * @param start the first revision to load * @param end the last revision to load - * @param ignoreUUID ignore any UUID found in the input stream - * @param forceUUID set the repository UUID to any found in the - * stream - * @param usePreCommitHook use the pre-commit hook when processing commits - * @param usePostCommitHook use the post-commit hook when processing commits + * @param ignoreUUID ignore any UUID found in the input stream + * @param forceUUID set the repository UUID to any found in the + * stream + * @param usePreCommitHook use the pre-commit hook when processing commits + * @param usePostCommitHook use the post-commit hook when processing commits * @param validateProps validate "svn:" revision and node properties * @param ignoreDates ignore revision datestamps in the dump stream - * @param relativePath the directory in the repository, where the data - * in put optional. - * @param callback the target for processing messages - * @throws ClientException throw in case of problem + * @param relativePath the directory in the repository, where the data + * in put optional. + * @param callback the target for processing messages + * @throws ClientException throw in case of problem * @since 1.9 - */ - public abstract void load(File path, InputStream dataInput, + */ + public abstract void load(File path, InputStream dataInput, Revision start, Revision end, boolean ignoreUUID, boolean forceUUID, boolean usePreCommitHook, @@ -176,27 +176,27 @@ public interface ISVNRepos { ReposNotifyCallback callback) throws ClientException; - /** - * Load the data of a dump into a repository. Sets + /** + * Load the data of a dump into a repository. Sets * <code>validateProps</code> and <code>ignoreDates</code> to * <code>false</code>. * - * @param path the path to the repository - * @param dataInput the data input source + * @param path the path to the repository + * @param dataInput the data input source * @param start the first revision to load * @param end the last revision to load - * @param ignoreUUID ignore any UUID found in the input stream - * @param forceUUID set the repository UUID to any found in the - * stream - * @param usePreCommitHook use the pre-commit hook when processing commits - * @param usePostCommitHook use the post-commit hook when processing commits - * @param relativePath the directory in the repository, where the data - * in put optional. - * @param callback the target for processing messages - * @throws ClientException throw in case of problem + * @param ignoreUUID ignore any UUID found in the input stream + * @param forceUUID set the repository UUID to any found in the + * stream + * @param usePreCommitHook use the pre-commit hook when processing commits + * @param usePostCommitHook use the post-commit hook when processing commits + * @param relativePath the directory in the repository, where the data + * in put optional. + * @param callback the target for processing messages + * @throws ClientException throw in case of problem * @since 1.8 - */ - public abstract void load(File path, InputStream dataInput, + */ + public abstract void load(File path, InputStream dataInput, Revision start, Revision end, boolean ignoreUUID, boolean forceUUID, boolean usePreCommitHook, @@ -205,163 +205,163 @@ public interface ISVNRepos { ReposNotifyCallback callback) throws ClientException; - /** - * load the data of a dump into a repository - * @param path the path to the repository - * @param dataInput the data input source - * @param ignoreUUID ignore any UUID found in the input stream - * @param forceUUID set the repository UUID to any found in the - * stream - * @param usePreCommitHook use the pre-commit hook when processing commits - * @param usePostCommitHook use the post-commit hook when processing commits - * @param relativePath the directory in the repository, where the data - * in put optional. - * @param callback the target for processing messages - * @throws ClientException throw in case of problem + /** + * load the data of a dump into a repository + * @param path the path to the repository + * @param dataInput the data input source + * @param ignoreUUID ignore any UUID found in the input stream + * @param forceUUID set the repository UUID to any found in the + * stream + * @param usePreCommitHook use the pre-commit hook when processing commits + * @param usePostCommitHook use the post-commit hook when processing commits + * @param relativePath the directory in the repository, where the data + * in put optional. + * @param callback the target for processing messages + * @throws ClientException throw in case of problem * @note behaves like the 1.8 vesion with the revision * parameters set to Revision.START and Revision.HEAD. - */ - public abstract void load(File path, InputStream dataInput, - boolean ignoreUUID, boolean forceUUID, boolean usePreCommitHook, + */ + public abstract void load(File path, InputStream dataInput, + boolean ignoreUUID, boolean forceUUID, boolean usePreCommitHook, boolean usePostCommitHook, String relativePath, ReposNotifyCallback callback) throws ClientException; - /** - * list all open transactions in a repository - * @param path the path to the repository - * @param receiver receives one transaction name per call - * @throws ClientException throw in case of problem - */ - public abstract void lstxns(File path, MessageReceiver receiver) - throws ClientException; - - /** - * recover the filesystem backend of a repository - * @param path the path to the repository + /** + * list all open transactions in a repository + * @param path the path to the repository + * @param receiver receives one transaction name per call + * @throws ClientException throw in case of problem + */ + public abstract void lstxns(File path, MessageReceiver receiver) + throws ClientException; + + /** + * recover the filesystem backend of a repository + * @param path the path to the repository * @return youngest revision - * @throws ClientException throw in case of problem - */ - public abstract long recover(File path, ReposNotifyCallback callback) - throws ClientException; - - /** - * Take an exclusive lock on each of the listed repositories - * to prevent commits; then, while holding all the locks, call - * the action.invoke(). - * - * The repositories may or may not be readable by Subversion - * while frozen, depending on implementation details of the - * repository's filesystem backend. - * - * Repositories are locked in the listed order. - * @param action describes the action to perform - * @param paths the set of repository paths - * @throws ClientException + * @throws ClientException throw in case of problem + */ + public abstract long recover(File path, ReposNotifyCallback callback) + throws ClientException; + + /** + * Take an exclusive lock on each of the listed repositories + * to prevent commits; then, while holding all the locks, call + * the action.invoke(). + * + * The repositories may or may not be readable by Subversion + * while frozen, depending on implementation details of the + * repository's filesystem backend. + * + * Repositories are locked in the listed order. + * @param action describes the action to perform + * @param paths the set of repository paths + * @throws ClientException * @since 1.8 - */ - public abstract void freeze(ReposFreezeAction action, - File... paths) - throws ClientException; - - /** - * remove open transaction in a repository - * @param path the path to the repository - * @param transactions the transactions to be removed - * @throws ClientException throw in case of problem - */ - public abstract void rmtxns(File path, String[] transactions) - throws ClientException; - - /** - * Change the value of the revision property <code>propName</code> - * to <code>propValue</code>. By default, does not run - * pre-/post-revprop-change hook scripts. - * - * @param path The path to the repository. - * @param rev The revision for which to change a property value. - * @param propName The name of the property to change. - * @param propValue The new value to set for the property. - * @param usePreRevPropChangeHook Whether to run the - * <i>pre-revprop-change</i> hook script. - * @param usePostRevPropChangeHook Whether to run the - * <i>post-revprop-change</i> hook script. - * @throws SubversionException If a problem occurs. - */ - public abstract void setRevProp(File path, Revision rev, String propName, - String propValue, boolean usePreRevPropChangeHook, - boolean usePostRevPropChangeHook) throws SubversionException; - - /** - * Verify the repository at <code>path</code> between revisions - * <code>start</code> and <code>end</code>. - * - * @param path the path to the repository - * @param start the first revision - * @param end the last revision + */ + public abstract void freeze(ReposFreezeAction action, + File... paths) + throws ClientException; + + /** + * remove open transaction in a repository + * @param path the path to the repository + * @param transactions the transactions to be removed + * @throws ClientException throw in case of problem + */ + public abstract void rmtxns(File path, String[] transactions) + throws ClientException; + + /** + * Change the value of the revision property <code>propName</code> + * to <code>propValue</code>. By default, does not run + * pre-/post-revprop-change hook scripts. + * + * @param path The path to the repository. + * @param rev The revision for which to change a property value. + * @param propName The name of the property to change. + * @param propValue The new value to set for the property. + * @param usePreRevPropChangeHook Whether to run the + * <i>pre-revprop-change</i> hook script. + * @param usePostRevPropChangeHook Whether to run the + * <i>post-revprop-change</i> hook script. + * @throws SubversionException If a problem occurs. + */ + public abstract void setRevProp(File path, Revision rev, String propName, + String propValue, boolean usePreRevPropChangeHook, + boolean usePostRevPropChangeHook) throws SubversionException; + + /** + * Verify the repository at <code>path</code> between revisions + * <code>start</code> and <code>end</code>. + * + * @param path the path to the repository + * @param start the first revision + * @param end the last revision * @param keepGoing continue verification even if a revision is bad * @param checkNormalization report directory entry and mergeinfo name collisions * caused by denormalized Unicode representations * @param metadataOnly check only metadata, not file contents * @param callback the callback to receive notifications - * @throws ClientException If an error occurred. + * @throws ClientException If an error occurred. * @since 1.9 - */ - public abstract void verify(File path, Revision start, Revision end, + */ + public abstract void verify(File path, Revision start, Revision end, boolean keepGoing, boolean checkNormalization, boolean metadataOnly, ReposNotifyCallback callback) throws ClientException; - /** - * Verify the repository at <code>path</code> between revisions - * <code>start</code> and <code>end</code>. - * - * @param path the path to the repository - * @param start the first revision - * @param end the last revision + /** + * Verify the repository at <code>path</code> between revisions + * <code>start</code> and <code>end</code>. + * + * @param path the path to the repository + * @param start the first revision + * @param end the last revision * @param callback the callback to receive notifications - * @throws ClientException If an error occurred. - */ - public abstract void verify(File path, Revision start, Revision end, + * @throws ClientException If an error occurred. + */ + public abstract void verify(File path, Revision start, Revision end, ReposNotifyCallback callback) throws ClientException; - /** - * list all locks in the repository - * @param path the path to the repository + /** + * list all locks in the repository + * @param path the path to the repository * @param depth the depth to recurse - * @throws ClientException throw in case of problem - */ - public abstract Set<Lock> lslocks(File path, Depth depth) + * @throws ClientException throw in case of problem + */ + public abstract Set<Lock> lslocks(File path, Depth depth) throws ClientException; - /** - * remove multiple locks from the repository - * @param path the path to the repository - * @param locks the name of the locked items - * @throws ClientException throw in case of problem - */ - public abstract void rmlocks(File path, String[] locks) - throws ClientException; + /** + * remove multiple locks from the repository + * @param path the path to the repository + * @param locks the name of the locked items + * @throws ClientException throw in case of problem + */ + public abstract void rmlocks(File path, String[] locks) + throws ClientException; /** * upgrade the repository format * @param path the path to the repository * @param callback for notification - * @throws ClientException throw in case of problem + * @throws ClientException throw in case of problem */ public abstract void upgrade(File path, ReposNotifyCallback callback) - throws ClientException; + throws ClientException; /** * pack the repository * @param path the path to the repository * @param callback for notification - * @throws ClientException throw in case of problem + * @throws ClientException throw in case of problem */ public abstract void pack(File path, ReposNotifyCallback callback) - throws ClientException; + throws ClientException; /** * cancel the active operation
Modified: subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java (original) +++ subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java Sun Jun 14 20:58:10 2015 @@ -142,10 +142,10 @@ public class NativeResources private static final void init() { version = new Version(); - if (!version.isAtLeast(1, 9, 0)) + if (!version.isAtLeast(1, 10, 0)) { throw new LinkageError("Native library version must be at least " + - "1.9.0, but is only " + version); + "1.10.0, but is only " + version); } runtimeVersion = new RuntimeVersion(); Modified: subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java (original) +++ subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java Sun Jun 14 20:58:10 2015 @@ -240,11 +240,24 @@ public class SVNClient implements ISVNCl public native void copy(List<CopySource> sources, String destPath, boolean copyAsChild, boolean makeParents, - boolean ignoreExternals, + boolean ignoreExternals, boolean metadataOnly, + boolean pinExternals, + Map<String, List<ExternalItem>> externalsToPin, Map<String, String> revpropTable, CommitMessageCallback handler, CommitCallback callback) throws ClientException; + public void copy(List<CopySource> sources, String destPath, + boolean copyAsChild, boolean makeParents, + boolean ignoreExternals, + Map<String, String> revpropTable, + CommitMessageCallback handler, CommitCallback callback) + throws ClientException + { + copy(sources, destPath, copyAsChild, makeParents, ignoreExternals, + false, false, null, revpropTable, handler, callback); + } + public native void move(Set<String> srcPaths, String destPath, boolean force, boolean moveAsChild, boolean makeParents, boolean metadataOnly, @@ -281,7 +294,7 @@ public class SVNClient implements ISVNCl public void cleanup(String path) throws ClientException { - cleanup(path, false, true, true, true, false); + cleanup(path, true, true, true, true, false); } public native void resolve(String path, Depth depth, Modified: subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java (original) +++ subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java Sun Jun 14 20:58:10 2015 @@ -33,6 +33,7 @@ import java.util.GregorianCalendar; import java.util.Locale; import java.util.SimpleTimeZone; import java.io.InputStream; +import java.io.IOException; import java.nio.charset.Charset; /** @@ -78,6 +79,14 @@ class StatusEditor implements ISVNEditor long replacesRevision) { //DEBUG:System.err.println(" [J] StatusEditor.addFile"); + if (contents != null) { + try { + contents.close(); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + checkState(); receiver.addedFile(relativePath); } @@ -120,6 +129,14 @@ class StatusEditor implements ISVNEditor Map<String, byte[]> properties) { //DEBUG:System.err.println(" [J] StatusEditor.alterFile"); + if (contents != null) { + try { + contents.close(); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + checkState(); receiver.modifiedFile(relativePath, (checksum != null && contents != null), Modified: subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/VersionExtended.java URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/VersionExtended.java?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/VersionExtended.java (original) +++ subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/apache/subversion/javahl/types/VersionExtended.java Sun Jun 14 20:58:10 2015 @@ -41,6 +41,21 @@ public class VersionExtended } /** + * Release the native peer. This method must be called to release + * the native resources held by this object. + * <p> + * Once this method is called, all object references obtained from + * the iterators returned by {@link #getLinkedLibs()} and + * {@link #getLoadedLibs()} become invalid and should no longer be used. + */ + public native void dispose(); + + /** + * release the native peer (should use dispose instead) + */ + public native void finalize(); + + /** * @return The date when the libsvn_subr library was compiled, in * the format defined by the C standard macro #__DATE__. */ Modified: subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java (original) +++ subversion/branches/fsx-1.10/subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java Sun Jun 14 20:58:10 2015 @@ -2418,18 +2418,18 @@ public class SVNClient implements SVNCli { try { - final List<org.apache.subversion.javahl.types.Info> infos = - new ArrayList<org.apache.subversion.javahl.types.Info>(); - aSVNClient.info2(path, - org.apache.subversion.javahl.types.Revision.HEAD, - org.apache.subversion.javahl.types.Revision.HEAD, - org.apache.subversion.javahl.types.Depth.empty, - null, new org.apache.subversion.javahl.callback.InfoCallback() - { - public void singleInfo(org.apache.subversion.javahl.types.Info info) { - infos.add(info); - } - }); + final List<org.apache.subversion.javahl.types.Info> infos = + new ArrayList<org.apache.subversion.javahl.types.Info>(); + aSVNClient.info2(path, + org.apache.subversion.javahl.types.Revision.HEAD, + org.apache.subversion.javahl.types.Revision.HEAD, + org.apache.subversion.javahl.types.Depth.empty, + null, new org.apache.subversion.javahl.callback.InfoCallback() + { + public void singleInfo(org.apache.subversion.javahl.types.Info info) { + infos.add(info); + } + }); return new Info(infos.get(0)); } catch (org.apache.subversion.javahl.ClientException ex) Modified: subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java (original) +++ subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java Sun Jun 14 20:58:10 2015 @@ -139,9 +139,10 @@ public class BasicTests extends SVNTests */ public void testVersionExtendedQuiet() throws Throwable { + VersionExtended vx = null; try { - VersionExtended vx = client.getVersionExtended(false); + vx = client.getVersionExtended(false); String result = vx.getBuildDate(); if (result == null || result.trim().length() == 0) throw new Exception("Build date empty"); @@ -160,6 +161,11 @@ public class BasicTests extends SVNTests fail("VersionExtended should always be available unless the " + "native libraries failed to initialize: " + e); } + finally + { + if (vx != null) + vx.dispose(); + } } /** @@ -168,9 +174,10 @@ public class BasicTests extends SVNTests */ public void testVersionExtendedVerbose() throws Throwable { + VersionExtended vx = null; try { - VersionExtended vx = client.getVersionExtended(true); + vx = client.getVersionExtended(true); String result = vx.getRuntimeHost(); if (result == null || result.trim().length() == 0) throw new Exception("Runtime host empty"); @@ -216,6 +223,11 @@ public class BasicTests extends SVNTests fail("VersionExtended should always be available unless the " + "native libraries failed to initialize: " + e); } + finally + { + if (vx != null) + vx.dispose(); + } } /** @@ -269,7 +281,7 @@ public class BasicTests extends SVNTests } catch(JNIError e) { - return; // Test passes! + return; // Test passes! } fail("A JNIError should have been thrown here."); } @@ -1060,7 +1072,7 @@ public class BasicTests extends SVNTests } client.copy(sources, new File(thisTest.getWorkingCopy(), "A/B/F").getPath(), - true, false, false, null, null, null); + true, false, false, false, false, null, null, null, null); // Commit the changes, and check the state of the WC. checkCommitRevision(thisTest, @@ -1077,7 +1089,7 @@ public class BasicTests extends SVNTests "A/B").getPath(), Revision.WORKING, Revision.WORKING)); client.copy(wcSource, thisTest.getUrl() + "/parent/A/B", - true, true, false, null, + true, true, false, false, false, null, null, new ConstMsg("Copy WC to URL"), null); // update the WC to get new folder and confirm the copy @@ -1085,6 +1097,221 @@ public class BasicTests extends SVNTests update(thisTest), 3); } + + // Set up externals references in the working copy for the + // pin-externals tests. + private void setupPinExternalsTest(OneTest thisTest) throws Throwable + { + byte[] extref = ("^/A/D/H ADHext\n" + + "^/A/D/H ADHext2\n" + + "^/A/D/H@1 peggedADHext\n" + + "-r1 ^/A/D/H revvedADHext\n").getBytes(); + Set<String> paths = new HashSet<String>(); + paths.add(thisTest.getWCPath() + "/A/B"); + + // Add an externals reference to the working copy. + client.propertySetLocal(paths, "svn:externals", extref, + Depth.empty, null, false); + + // Commit the externals definition + client.commit(thisTest.getWCPathSet(), Depth.infinity, + false, false, null, null, + new ConstMsg("Set svn:externals"), null); + + // Update the working copy to bring in the external subtree. + client.update(thisTest.getWCPathSet(), Revision.HEAD, + Depth.unknown, false, false, false, false); + } + + /** + * Test WC-to-WC copy with implicit pinned externals + * @throws Throwable + */ + public void testCopyPinExternals_wc2wc() throws Throwable + { + // build the test setup + OneTest thisTest = new OneTest(); + setupPinExternalsTest(thisTest); + + List<CopySource> sources = new ArrayList<CopySource>(1); + sources.add(new CopySource(thisTest.getWCPath() + "/A/B", null, null)); + String target = thisTest.getWCPath() + "/A/Bcopy"; + client.copy(sources, target, true, false, false, false, + true, // pinExternals + null, // externalsToPin + null, null, null); + + // Verification + String expected = ("^/A/D/H@2 ADHext\n" + + "^/A/D/H@2 ADHext2\n" + + "^/A/D/H@1 peggedADHext\n" + + "-r1 ^/A/D/H@2 revvedADHext\n"); + String actual = + new String(client.propertyGet(target, "svn:externals", null, null)); + + assertEquals(expected, actual); + } + + /** + * Test WC-to-REPO copy with implicit pinned externals + * @throws Throwable + */ + public void testCopyPinExternals_wc2repo() throws Throwable + { + // build the test setup + OneTest thisTest = new OneTest(); + setupPinExternalsTest(thisTest); + + List<CopySource> sources = new ArrayList<CopySource>(1); + sources.add(new CopySource(thisTest.getWCPath() + "/A/B", null, null)); + String target = thisTest.getUrl() + "/A/Bcopy"; + client.copy(sources, target, true, false, false, false, + true, // pinExternals + null, // externalsToPin + null, new ConstMsg("Copy WC to REPO"), null); + + // Verification + String expected = ("^/A/D/H@2 ADHext\n" + + "^/A/D/H@2 ADHext2\n" + + "^/A/D/H@1 peggedADHext\n" + + "-r1 ^/A/D/H@2 revvedADHext\n"); + String actual = + new String(client.propertyGet(target, "svn:externals", null, null)); + + assertEquals(expected, actual); + } + + /** + * Test REPO-to-WC copy with implicit pinned externals + * @throws Throwable + */ + public void testCopyPinExternals_repo2wc() throws Throwable + { + // build the test setup + OneTest thisTest = new OneTest(); + setupPinExternalsTest(thisTest); + + List<CopySource> sources = new ArrayList<CopySource>(1); + sources.add(new CopySource(thisTest.getUrl() + "/A/B", null, null)); + String target = thisTest.getWCPath() + "/A/Bcopy"; + client.copy(sources, target, true, false, false, false, + true, // pinExternals + null, // externalsToPin + null, null, null); + + // Verification + String expected = ("^/A/D/H@2 ADHext\n" + + "^/A/D/H@2 ADHext2\n" + + "^/A/D/H@1 peggedADHext\n" + + "-r1 ^/A/D/H@2 revvedADHext\n"); + String actual = + new String(client.propertyGet(target, "svn:externals", null, null)); + + assertEquals(expected, actual); + } + + /** + * Test REPO-to-REPO copy with implicit pinned externals + * @throws Throwable + */ + public void testCopyPinExternals_repo2repo() throws Throwable + { + // build the test setup + OneTest thisTest = new OneTest(); + setupPinExternalsTest(thisTest); + + List<CopySource> sources = new ArrayList<CopySource>(1); + sources.add(new CopySource(thisTest.getUrl() + "/A/B", null, null)); + String target = thisTest.getUrl() + "/A/Bcopy"; + client.copy(sources, target, true, false, false, false, + true, // pinExternals + null, // externalsToPin + null, new ConstMsg("Copy WC to REPO"), null); + + // Verification + String expected = ("^/A/D/H@2 ADHext\n" + + "^/A/D/H@2 ADHext2\n" + + "^/A/D/H@1 peggedADHext\n" + + "-r1 ^/A/D/H@2 revvedADHext\n"); + String actual = + new String(client.propertyGet(target, "svn:externals", null, null)); + + assertEquals(expected, actual); + } + + /** + * Test REPO-to-REPO copy with eplicit pinned externals + * @throws Throwable + */ + public void testCopyPinExternals_repo2repo_explicit() throws Throwable + { + // build the test setup + OneTest thisTest = new OneTest(); + setupPinExternalsTest(thisTest); + + String sourceUrl = thisTest.getUrl() + "/A/B"; + Map<String, List<ExternalItem>> externalsToPin = + new HashMap<String, List<ExternalItem>>(); + List<ExternalItem> items = new ArrayList<ExternalItem>(1); + items.add(new ExternalItem("ADHext", "^/A/D/H", null, null)); + externalsToPin.put(sourceUrl, items); + + List<CopySource> sources = new ArrayList<CopySource>(1); + sources.add(new CopySource(sourceUrl, null, null)); + String target = thisTest.getUrl() + "/A/Bcopy"; + client.copy(sources, target, true, false, false, false, + true, // pinExternals + externalsToPin, + null, new ConstMsg("Copy WC to REPO"), null); + + // Verification + String expected = ("^/A/D/H@2 ADHext\n" + + "^/A/D/H ADHext2\n" + + "^/A/D/H@1 peggedADHext\n" + + "-r1 ^/A/D/H revvedADHext\n"); + String actual = + new String(client.propertyGet(target, "svn:externals", null, null)); + + assertEquals(expected, actual); + } + + /** + * Test REPO-to-REPO copy with explicit pinned externals that + * don't correspond to actual externals + * @throws Throwable + */ + public void testCopyPinExternals_repo2repo_corkscrew() throws Throwable + { + // build the test setup + OneTest thisTest = new OneTest(); + setupPinExternalsTest(thisTest); + + String sourceUrl = thisTest.getUrl() + "/A/B"; + Map<String, List<ExternalItem>> externalsToPin = + new HashMap<String, List<ExternalItem>>(); + List<ExternalItem> items = new ArrayList<ExternalItem>(1); + items.add(new ExternalItem("ADHext", "^/A/D/H", null, null)); + externalsToPin.put(sourceUrl + "/A", items); + + List<CopySource> sources = new ArrayList<CopySource>(1); + sources.add(new CopySource(sourceUrl, null, null)); + String target = thisTest.getUrl() + "/A/Bcopy"; + client.copy(sources, target, true, false, false, false, + true, // pinExternals + externalsToPin, + null, new ConstMsg("Copy WC to REPO"), null); + + // Verification + String expected = ("^/A/D/H ADHext\n" + + "^/A/D/H ADHext2\n" + + "^/A/D/H@1 peggedADHext\n" + + "-r1 ^/A/D/H revvedADHext\n"); + String actual = + new String(client.propertyGet(target, "svn:externals", null, null)); + + assertEquals(expected, actual); + } + /** * Test the {@link SVNClientInterface.move()} API. * @since 1.5 @@ -3003,7 +3230,7 @@ public class BasicTests extends SVNTests srcs.add(new CopySource(thisTest.getUrl() + "/A", Revision.HEAD, Revision.HEAD)); client.copy(srcs, thisTest.getUrl() + "/branches/A", - true, false, false, null, + true, false, false, false, false, null, null, new ConstMsg("create A branch"), null); // update the WC (to r3) so that it has the branches folder @@ -3046,7 +3273,7 @@ public class BasicTests extends SVNTests // Do nothing, right now. return false; } - }); + }); } /** Modified: subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java (original) +++ subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java Sun Jun 14 20:58:10 2015 @@ -95,6 +95,7 @@ public class RunTests suite.addTestSuite(UtilTests.class); suite.addTestSuite(SVNRemoteTests.class); suite.addTestSuite(SVNReposTests.class); + suite.addTestSuite(ExceptionTests.class); } else { Modified: subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java (original) +++ subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java Sun Jun 14 20:58:10 2015 @@ -53,15 +53,35 @@ import java.security.NoSuchAlgorithmExce */ public class SVNRemoteTests extends SVNTests { + /** + * Base name of all our tests. + */ + public final static String testName = "remote_test"; + protected OneTest thisTest; public SVNRemoteTests() { + init(); } public SVNRemoteTests(String name) { super(name); + init(); + } + + /** + * Initialize the testBaseName and the testCounter, if this is the + * first test of this class. + */ + private void init() + { + if (!testName.equals(testBaseName)) + { + testCounter = 0; + testBaseName = testName; + } } protected void setUp() throws Exception @@ -937,6 +957,7 @@ public class SVNRemoteTests extends SVNT 0, false, false, false, null, receiver); assertEquals(1, receiver.logs.size()); + assertTrue(receiver.logs.get(0).revprops.size() > 0); receiver.logs.clear(); session.reparent(getTestRepoUrl() + "/A"); @@ -945,6 +966,7 @@ public class SVNRemoteTests extends SVNT 0, 0, false, false, false, null, receiver); assertEquals(2, receiver.logs.size()); + assertTrue(receiver.logs.get(0).revprops.size() > 0); } public void testGetLogMissing() throws Exception Modified: subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNReposTests.java URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNReposTests.java?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNReposTests.java (original) +++ subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNReposTests.java Sun Jun 14 20:58:10 2015 @@ -40,13 +40,33 @@ import java.util.Map; */ public class SVNReposTests extends SVNTests { + /** + * Base name of all our tests. + */ + public final static String testName = "repos_test"; + public SVNReposTests() { + init(); } public SVNReposTests(String name) { super(name); + init(); + } + + /** + * Initialize the testBaseName and the testCounter, if this is the + * first test of this class. + */ + private void init() + { + if (!testName.equals(testBaseName)) + { + testCounter = 0; + testBaseName = testName; + } } /** Modified: subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java (original) +++ subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNTests.java Sun Jun 14 20:58:10 2015 @@ -80,6 +80,17 @@ class SVNTests extends TestCase protected static int testCounter; /** + * Set to true if tests should clean up after themselves. + */ + protected boolean cleanupAfterTests = false; + + /** + * this list contains the names of all repository and working copy + * directories created by one test case. + */ + protected static List<File> testDirs; + + /** * the file in which the sample repository has been dumped. */ protected File greekDump; @@ -173,6 +184,10 @@ class SVNTests extends TestCase private void init() { + String cleanupProp = System.getProperty("test.cleanup"); + if (cleanupProp != null) + cleanupAfterTests = (0 < cleanupProp.trim().length()); + String disableCredStore = System.getProperty("test.disablecredstore"); if (disableCredStore != null) { @@ -510,6 +525,16 @@ class SVNTests extends TestCase client.dispose(); // remove the temporary directory removeDirOrFile(localTmp); + + // optionally remove the test directories + List<File> td = testDirs; + testDirs = null; + if (cleanupAfterTests && td != null) + { + for(File f: td) + removeDirOrFile(f); + } + super.tearDown(); } @@ -788,6 +813,13 @@ class SVNTests extends TestCase return wc; } + private void trackDir(File dir) + { + if (testDirs == null) + testDirs = new ArrayList<File>(); + testDirs.add(dir); + } + /** * Create the repository for the beginning of the test. * Assumes that {@link #testName} has been set. @@ -804,6 +836,7 @@ class SVNTests extends TestCase // build a clean repository directory File repos = new File(repositories, this.testName); removeDirOrFile(repos); + trackDir(repos); // create and load the repository from the default repository dump admin.create(repos, true, false, conf, fsType); if (loadGreek) @@ -829,6 +862,7 @@ class SVNTests extends TestCase URI uri = makeReposUrl(repos); workingCopy = new File(workingCopies, this.testName); removeDirOrFile(workingCopy); + trackDir(workingCopy); // checkout the repository client.checkout(uri.toString(), workingCopy.getAbsolutePath(), null, null, Depth.infinity, false, false); Modified: subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/SVNAdminTests.java URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/SVNAdminTests.java?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/SVNAdminTests.java (original) +++ subversion/branches/fsx-1.10/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/SVNAdminTests.java Sun Jun 14 20:58:10 2015 @@ -35,13 +35,33 @@ import org.tigris.subversion.javahl.Subv */ public class SVNAdminTests extends SVNTests { + /** + * Base name of all our tests. + */ + public final static String testName = "admin_test"; + public SVNAdminTests() { + init(); } public SVNAdminTests(String name) { super(name); + init(); + } + + /** + * Initialize the testBaseName and the testCounter, if this is the + * first test of this class. + */ + private void init() + { + if (!testName.equals(testBaseName)) + { + testCounter = 0; + testBaseName = testName; + } } /** Modified: subversion/branches/fsx-1.10/subversion/bindings/swig/INSTALL URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/swig/INSTALL?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/swig/INSTALL (original) +++ subversion/branches/fsx-1.10/subversion/bindings/swig/INSTALL Sun Jun 14 20:58:10 2015 @@ -65,7 +65,7 @@ BUILDING SWIG BINDINGS FOR SVN ON UNIX Step 1: Install a suitable version of SWIG (which is - currently SWIG version 1.3.24 or later). + currently SWIG version 1.3.24 or later, but not SWIG 3.0.0 or newer). * Perhaps your distribution packages a suitable version - if it does install it, and skip to the last bullet point in this section. Modified: subversion/branches/fsx-1.10/subversion/bindings/swig/core.i URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/swig/core.i?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/swig/core.i (original) +++ subversion/branches/fsx-1.10/subversion/bindings/swig/core.i Sun Jun 14 20:58:10 2015 @@ -532,8 +532,10 @@ $1 = NULL; } else if (SvPOK($input)) { - if (_global_pool == NULL) + if (_global_pool == NULL) { _global_pool = svn_swig_pl_make_pool((SV *)NULL); + SPAGAIN; + } $1 = apr_pstrdup(_global_pool, SvPV_nolen($input)); } else { Modified: subversion/branches/fsx-1.10/subversion/bindings/swig/include/apr.swg URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/swig/include/apr.swg?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/swig/include/apr.swg (original) +++ subversion/branches/fsx-1.10/subversion/bindings/swig/include/apr.swg Sun Jun 14 20:58:10 2015 @@ -31,23 +31,21 @@ */ #ifdef SWIGPERL %typemap(out) long long { - char temp[256]; + char temp[30]; sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t) $1); - ST(argvi) = sv_newmortal(); - sv_setpv((SV*)ST(argvi++), temp); + %append_output(sv_2mortal(newSVpv(temp, 0))); } %typemap(out) unsigned long long { - char temp[256]; + char temp[30]; sprintf(temp, "%" APR_UINT64_T_FMT, (apr_uint64_t) $1); - ST(argvi) = sv_newmortal(); - sv_setpv((SV*)ST(argvi++), temp); + %append_output(sv_2mortal(newSVpv(temp, 0))); } %typemap(in, numinputs=0) long long *OUTPUT (apr_int64_t temp) "$1 = &temp;"; %typemap(argout) long long *OUTPUT { - char temp[256]; + char temp[30]; sprintf(temp, "%" APR_INT64_T_FMT, (apr_int64_t)*($1)); %append_output(sv_2mortal(newSVpv(temp, 0))); } @@ -55,7 +53,7 @@ %typemap(in, numinputs=0) unsigned long long *OUTPUT (apr_uint64_t temp) "$1 = &temp;"; %typemap(argout) unsigned long long *OUTPUT { - char temp[256]; + char temp[30]; sprintf(temp, "%" APR_UINT64_T_FMT, (apr_uint64_t)*($1)); %append_output(sv_2mortal(newSVpv(temp, 0))); } Modified: subversion/branches/fsx-1.10/subversion/bindings/swig/include/svn_containers.swg URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/swig/include/svn_containers.swg?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/swig/include/svn_containers.swg (original) +++ subversion/branches/fsx-1.10/subversion/bindings/swig/include/svn_containers.swg Sun Jun 14 20:58:10 2015 @@ -269,8 +269,10 @@ %typemap(in) apr_hash_t *PROPHASH (apr_pool_t *_global_pool = NULL) { - if (_global_pool == NULL) + if (_global_pool == NULL) { _global_pool = svn_swig_pl_make_pool((SV *)NULL); + SPAGAIN; + } $1 = svn_swig_pl_hash_to_prophash($input, _global_pool); } %typemap(out) apr_hash_t *PROPHASH @@ -426,6 +428,25 @@ { $1 = svn_swig_py_path_revs_hash_from_dict($input, _global_pool); } +%typemap(in) apr_hash_t *unlock_targets +{ + $1 = svn_swig_py_stringhash_from_dict($input, _global_pool); +} +%typemap(in) apr_hash_t *lock_targets + (apr_pool_t *_global_pool, PyObject *_global_pool = NULL) +{ + if (_global_pool == NULL) + { + if (svn_swig_py_get_parent_pool(args, $descriptor(apr_pool_t *), + &_global_py_pool, &_global_pool)) + SWIG_fail; + } + $1 = svn_swig_py_struct_ptr_hash_from_dict($input, + $descriptor(svn_fs_lock_target_t *), _global_pool); + if (PyErr_Occurred()) { + SWIG_fail; + } +} #endif #ifdef SWIGPERL Modified: subversion/branches/fsx-1.10/subversion/bindings/swig/include/svn_string.swg URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/swig/include/svn_string.swg?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/swig/include/svn_string.swg (original) +++ subversion/branches/fsx-1.10/subversion/bindings/swig/include/svn_string.swg Sun Jun 14 20:58:10 2015 @@ -90,6 +90,7 @@ typedef struct svn_string_t svn_string_t %typemap(in) svn_stringbuf_t * { apr_size_t len; char *buf; + apr_pool_t *pool; if (!SvOK($input)) { $1 = NULL; @@ -97,8 +98,9 @@ typedef struct svn_string_t svn_string_t buf = SvPV($input, len); /* Another case of ugly pool handling, this should use the current default pool, or make a new one if it doesn't exist yet */ - $1 = svn_stringbuf_ncreate(buf,len, - svn_swig_pl_make_pool ((SV *)NULL)); + pool = svn_swig_pl_make_pool ((SV *)NULL); + SPAGAIN; + $1 = svn_stringbuf_ncreate(buf,len, pool); } else { croak("Not a string"); } Modified: subversion/branches/fsx-1.10/subversion/bindings/swig/include/svn_types.swg URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/swig/include/svn_types.swg?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/swig/include/svn_types.swg (original) +++ subversion/branches/fsx-1.10/subversion/bindings/swig/include/svn_types.swg Sun Jun 14 20:58:10 2015 @@ -423,9 +423,11 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE se if (SvOK(exception_handler)) { SV *callback_result; + PUTBACK; svn_swig_pl_callback_thunk (CALL_SV, exception_handler, &callback_result, "S", $1, $1_descriptor); + SPAGAIN; } else { $result = SWIG_NewPointerObj($1, $1_descriptor, 0); argvi++; @@ -548,6 +550,7 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE se %typemap(in) apr_pool_t *pool ""; %typemap(default) apr_pool_t *pool(apr_pool_t *_global_pool) { _global_pool = $1 = svn_swig_pl_make_pool (ST(items-1)); + SPAGAIN; } #endif #ifdef SWIGRUBY @@ -935,15 +938,24 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE se #ifdef SWIGPERL %typemap(in) svn_stream_t * { svn_swig_pl_make_stream (&$1, $input); + SPAGAIN; } %typemap(out) svn_stream_t * { - $result = svn_swig_pl_from_stream ($1); + SV* tmp; + PUTBACK; + tmp = svn_swig_pl_from_stream ($1); + SPAGAIN; + $result = tmp; argvi++; } %typemap(argout) svn_stream_t ** { - %append_output(svn_swig_pl_from_stream(*$1)); + SV *tmp; + PUTBACK; + tmp = svn_swig_pl_from_stream(*$1); + SPAGAIN; + %append_output(tmp); } #endif @@ -1116,11 +1128,11 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE se } %typemap(argout) unsigned char *result_digest { - /* FIXME: This code is clearly buggy. The return value of sv_newmortal() - is immediately overwritten by the return value - of svn_swig_pl_from_md5(). */ - ST(argvi) = sv_newmortal(); - ST(argvi++) = svn_swig_pl_from_md5($1); + SV *tmp; + PUTBACK; + tmp = svn_swig_pl_from_md5($1); + SPAGAIN; + %append_output(tmp); } #endif @@ -1174,8 +1186,10 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE se %typemap(in) svn_opt_revision_t * (svn_opt_revision_t rev, apr_pool_t *_global_pool = NULL) { - if (_global_pool == NULL) + if (_global_pool == NULL) { _global_pool = svn_swig_pl_make_pool((SV *)NULL); + SPAGAIN; + } $1 = svn_swig_pl_set_revision(&rev, $input, TRUE, _global_pool); } #endif Modified: subversion/branches/fsx-1.10/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c (original) +++ subversion/branches/fsx-1.10/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c Sun Jun 14 20:58:10 2015 @@ -130,11 +130,11 @@ static void *convert_pl_revision_range(S /* this will assign to range */ SWIG_ConvertPtr(value, (void **)&range, _SWIG_TYPE("svn_opt_revision_range_t *"), 0); return range; - } + } - if (SvROK(value) + if (SvROK(value) && SvTYPE(SvRV(value)) == SVt_PVAV - && av_len((AV *)SvRV(value)) == 1) { + && av_len((AV *)SvRV(value)) == 1) { /* value is a two-element ARRAY */ AV* array = (AV *)SvRV(value); svn_opt_revision_t temp_start, temp_end; @@ -143,17 +143,17 @@ static void *convert_pl_revision_range(S /* Note: Due to how svn_swig_pl_set_revision works, * either the passed in svn_opt_revision_t is modified - * (and the original pointer returned) or a different pointer + * (and the original pointer returned) or a different pointer * is returned. svn_swig_pl_set_revision may return NULL * only if croak_on_error is FALSE. */ - start = svn_swig_pl_set_revision(&temp_start, - *av_fetch(array, 0, 0), + start = svn_swig_pl_set_revision(&temp_start, + *av_fetch(array, 0, 0), croak_on_error, pool); if (start == NULL) return NULL; - end = svn_swig_pl_set_revision(&temp_end, - *av_fetch(array, 1, 0), + end = svn_swig_pl_set_revision(&temp_end, + *av_fetch(array, 1, 0), croak_on_error, pool); if (end == NULL) return NULL; @@ -163,7 +163,7 @@ static void *convert_pl_revision_range(S range->start = *start; range->end = *end; return range; - } + } if (croak_on_error) croak("unknown revision range: " @@ -283,7 +283,7 @@ apr_array_header_t *svn_swig_pl_objs_to_ } /* Convert a single revision range or an array of revisions ranges - * Note: We can't simply use svn_swig_pl_to_array() as is, since + * Note: We can't simply use svn_swig_pl_to_array() as is, since * it immediatley checks whether source is an array reference and then * proceeds to treat this as the "array of ..." case. But a revision range * may be specified as a (two-element) array. Hence we first try to @@ -297,7 +297,7 @@ apr_array_header_t *svn_swig_pl_array_to svn_opt_revision_range_t *range; if ((range = convert_pl_revision_range(source, &croak_on_error, pool))) { - apr_array_header_t *temp = apr_array_make(pool, 1, + apr_array_header_t *temp = apr_array_make(pool, 1, sizeof(svn_opt_revision_range_t *)); temp->nelts = 1; APR_ARRAY_IDX(temp, 0, svn_opt_revision_range_t *) = range; @@ -306,7 +306,7 @@ apr_array_header_t *svn_swig_pl_array_to if (SvROK(source) && SvTYPE(SvRV(source)) == SVt_PVAV) { croak_on_error = TRUE; - return svn_swig_pl_to_array(source, convert_pl_revision_range, + return svn_swig_pl_to_array(source, convert_pl_revision_range, &croak_on_error, pool); } @@ -314,7 +314,7 @@ apr_array_header_t *svn_swig_pl_array_to /* This return is actually unreachable because of the croak above, * however, Visual Studio's compiler doesn't like if all paths don't have - * a return and errors out otherwise. */ + * a return and errors out otherwise. */ return NULL; } @@ -430,8 +430,8 @@ SV *svn_swig_pl_revnums_to_list(const ap } /* perl -> c svn_opt_revision_t conversion */ -svn_opt_revision_t *svn_swig_pl_set_revision(svn_opt_revision_t *rev, - SV *source, +svn_opt_revision_t *svn_swig_pl_set_revision(svn_opt_revision_t *rev, + SV *source, svn_boolean_t croak_on_error, apr_pool_t *pool) { @@ -471,7 +471,7 @@ svn_opt_revision_t *svn_swig_pl_set_revi maybe_croak(("unknown opt_revision_t string \"%s\": " "missing closing brace for \"{DATE}\"", input)); *end = '\0'; - err = svn_parse_date (&matched, &tm, + err = svn_parse_date (&matched, &tm, input + 1, apr_time_now(), pool); if (err) { svn_error_clear (err); @@ -520,6 +520,7 @@ svn_opt_revision_t *svn_swig_pl_set_revi put returned value in result if result is not NULL */ +/* NOTE: calls back into Perl (directly) */ svn_error_t *svn_swig_pl_callback_thunk(perl_func_invoker_t caller_func, void *func, SV **result, @@ -670,6 +671,7 @@ static item_baton * make_baton(apr_pool_ return newb; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * close_baton(void *baton, const char *method, apr_pool_t *pool) { item_baton *ib = baton; @@ -690,6 +692,7 @@ static svn_error_t * close_baton(void *b return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_set_target_revision(void *edit_baton, svn_revnum_t target_revision, apr_pool_t *pool) @@ -703,6 +706,7 @@ static svn_error_t * thunk_set_target_re return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_open_root(void *edit_baton, svn_revnum_t base_revision, apr_pool_t *dir_pool, @@ -720,6 +724,7 @@ static svn_error_t * thunk_open_root(voi return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_delete_entry(const char *path, svn_revnum_t revision, void *parent_baton, @@ -734,6 +739,7 @@ static svn_error_t * thunk_delete_entry( return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_add_directory(const char *path, void *parent_baton, const char *copyfrom_path, @@ -753,6 +759,7 @@ static svn_error_t * thunk_add_directory return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_open_directory(const char *path, void *parent_baton, svn_revnum_t base_revision, @@ -772,6 +779,7 @@ static svn_error_t * thunk_open_director return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_change_dir_prop(void *dir_baton, const char *name, const svn_string_t *value, @@ -787,12 +795,14 @@ static svn_error_t * thunk_change_dir_pr return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling close_baton) */ static svn_error_t * thunk_close_directory(void *dir_baton, apr_pool_t *pool) { return close_baton(dir_baton, "close_directory", pool); } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_absent_directory(const char *path, void *parent_baton, apr_pool_t *pool) @@ -807,6 +817,7 @@ static svn_error_t * thunk_absent_direct return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_add_file(const char *path, void *parent_baton, const char *copyfrom_path, @@ -827,6 +838,7 @@ static svn_error_t * thunk_add_file(cons return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_open_file(const char *path, void *parent_baton, svn_revnum_t base_revision, @@ -845,6 +857,7 @@ static svn_error_t * thunk_open_file(con return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_window_handler(svn_txdelta_window_t *window, void *baton) { @@ -865,6 +878,7 @@ static svn_error_t * thunk_window_handle return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_apply_textdelta(void *file_baton, const char *base_checksum, @@ -909,6 +923,7 @@ thunk_apply_textdelta(void *file_baton, return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_change_file_prop(void *file_baton, const char *name, const svn_string_t *value, @@ -924,6 +939,7 @@ static svn_error_t * thunk_change_file_p return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_close_file(void *file_baton, const char *text_checksum, apr_pool_t *pool) @@ -940,6 +956,7 @@ static svn_error_t * thunk_close_file(vo return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_absent_file(const char *path, void *parent_baton, apr_pool_t *pool) @@ -954,12 +971,14 @@ static svn_error_t * thunk_absent_file(c return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling close_baton) */ static svn_error_t * thunk_close_edit(void *edit_baton, apr_pool_t *pool) { return close_baton(edit_baton, "close_edit", pool); } +/* NOTE: calls back into Perl (by calling close_baton) */ static svn_error_t * thunk_abort_edit(void *edit_baton, apr_pool_t *pool) { @@ -967,18 +986,6 @@ static svn_error_t * thunk_abort_edit(vo } -void -svn_swig_pl_wrap_window_handler(svn_txdelta_window_handler_t *handler, - void **h_baton, - SV *callback, - apr_pool_t *pool) -{ - *handler = thunk_window_handler; - *h_baton = callback; - SvREFCNT_inc(callback); - svn_swig_pl_hold_ref_in_pool(pool, callback); -} - void svn_swig_pl_make_editor(svn_delta_editor_t **editor, void **edit_baton, SV *perl_editor, @@ -1008,6 +1015,7 @@ void svn_swig_pl_make_editor(svn_delta_e svn_swig_pl_hold_ref_in_pool(pool, perl_editor); } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_thunk_log_receiver(void *baton, apr_hash_t *changed_paths, svn_revnum_t rev, @@ -1032,6 +1040,7 @@ svn_error_t *svn_swig_pl_thunk_log_recei return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_thunk_log_entry_receiver(void *baton, svn_log_entry_t *log_entry, apr_pool_t *pool) @@ -1043,13 +1052,14 @@ svn_error_t *svn_swig_pl_thunk_log_entry svn_swig_pl_callback_thunk(CALL_SV, receiver, NULL, - "SS", + "SS", log_entry, _SWIG_TYPE("svn_log_entry_t *"), pool, POOLINFO); return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t * svn_swig_pl_thunk_client_diff_summarize_func( const svn_client_diff_summarize_t *diff, void *baton, @@ -1069,6 +1079,7 @@ svn_error_t * svn_swig_pl_thunk_client_d return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_thunk_history_func(void *baton, const char *path, svn_revnum_t revision, @@ -1086,6 +1097,7 @@ svn_error_t *svn_swig_pl_thunk_history_f return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_thunk_authz_func(svn_boolean_t *allowed, svn_fs_root_t *root, const char *path, @@ -1108,6 +1120,7 @@ svn_error_t *svn_swig_pl_thunk_authz_fun return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_thunk_commit_callback(svn_revnum_t new_revision, const char *date, const char *author, @@ -1122,6 +1135,7 @@ svn_error_t *svn_swig_pl_thunk_commit_ca return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_thunk_commit_callback2(const svn_commit_info_t *commit_info, void *baton, apr_pool_t *pool) @@ -1140,6 +1154,7 @@ svn_error_t *svn_swig_pl_thunk_commit_ca /* Wrap RA */ +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t * thunk_open_tmp_file(apr_file_t **fp, void *callback_baton, apr_pool_t *pool) @@ -1158,11 +1173,12 @@ static svn_error_t * thunk_open_tmp_file return SVN_NO_ERROR; } -svn_error_t *thunk_get_wc_prop(void *baton, - const char *relpath, - const char *name, - const svn_string_t **value, - apr_pool_t *pool) +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ +static svn_error_t *thunk_get_wc_prop(void *baton, + const char *relpath, + const char *name, + const svn_string_t **value, + apr_pool_t *pool) { SV *result; char *data; @@ -1215,6 +1231,7 @@ svn_error_t *svn_swig_pl_make_callbacks( return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_thunk_gnome_keyring_unlock_prompt(char **keyring_password, const char *keyring_name, void *baton, @@ -1243,6 +1260,7 @@ svn_error_t *svn_swig_pl_thunk_gnome_key return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_thunk_simple_prompt(svn_auth_cred_simple_t **cred, void *baton, const char *realm, @@ -1264,6 +1282,7 @@ svn_error_t *svn_swig_pl_thunk_simple_pr return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_thunk_username_prompt(svn_auth_cred_username_t **cred, void *baton, const char *realm, @@ -1284,6 +1303,7 @@ svn_error_t *svn_swig_pl_thunk_username_ return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_thunk_ssl_server_trust_prompt( svn_auth_cred_ssl_server_trust_t **cred, void *baton, @@ -1318,6 +1338,7 @@ svn_error_t *svn_swig_pl_thunk_ssl_serve return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_thunk_ssl_client_cert_prompt( svn_auth_cred_ssl_client_cert_t **cred, void *baton, @@ -1339,6 +1360,7 @@ svn_error_t *svn_swig_pl_thunk_ssl_clien return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_thunk_ssl_client_cert_pw_prompt( svn_auth_cred_ssl_client_cert_pw_t **cred, void *baton, @@ -1361,6 +1383,7 @@ svn_error_t *svn_swig_pl_thunk_ssl_clien } /* Thunked version of svn_wc_notify_func_t callback type */ +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ void svn_swig_pl_notify_func(void * baton, const char *path, svn_wc_notify_action_t action, @@ -1382,6 +1405,7 @@ void svn_swig_pl_notify_func(void * bato } /* Thunked version of svn_client_get_commit_log3_t callback type. */ +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_get_commit_log_func(const char **log_msg, const char **tmp_file, const apr_array_header_t * @@ -1444,6 +1468,7 @@ svn_error_t *svn_swig_pl_get_commit_log_ } /* Thunked version of svn_client_info_t callback type. */ +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_info_receiver(void *baton, const char *path, const svn_info_t *info, @@ -1475,6 +1500,7 @@ svn_error_t *svn_swig_pl_info_receiver(v /* Thunked version of svn_wc_cancel_func_t callback type. */ +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_cancel_func(void *cancel_baton) { SV *result; svn_error_t *ret_val; @@ -1504,6 +1530,7 @@ svn_error_t *svn_swig_pl_cancel_func(voi } /* Thunked version of svn_wc_status_func_t callback type. */ +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ void svn_swig_pl_status_func(void *baton, const char *path, svn_wc_status_t *status) @@ -1520,6 +1547,7 @@ void svn_swig_pl_status_func(void *baton } /* Thunked version of svn_wc_status_func2_t callback type. */ +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ void svn_swig_pl_status_func2(void *baton, const char *path, svn_wc_status2_t *status) @@ -1536,6 +1564,7 @@ void svn_swig_pl_status_func2(void *bato } /* Thunked version of svn_wc_status_func3_t callback type. */ +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_status_func3(void *baton, const char *path, svn_wc_status2_t *status, @@ -1568,6 +1597,7 @@ svn_error_t *svn_swig_pl_status_func3(vo /* Thunked version of svn_client_blame_receiver_t callback type. */ +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_blame_func(void *baton, apr_int64_t line_no, svn_revnum_t revision, @@ -1596,6 +1626,7 @@ svn_error_t *svn_swig_pl_blame_func(void } /* Thunked config enumerator */ +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_boolean_t svn_swig_pl_thunk_config_enumerator(const char *name, const char *value, void *baton) { SV *result; @@ -1639,6 +1670,7 @@ void svn_swig_pl_set_current_pool(apr_po set_current_pool_cb(pool); } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ apr_pool_t *svn_swig_pl_make_pool(SV *obj) { apr_pool_t *pool; @@ -1667,6 +1699,7 @@ typedef struct io_baton_t { IO *io; } io_baton_t; +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t *io_handle_read(void *baton, char *buffer, apr_size_t *len) @@ -1690,6 +1723,7 @@ static svn_error_t *io_handle_read(void return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t *io_handle_write(void *baton, const char *data, apr_size_t *len) @@ -1710,6 +1744,7 @@ static svn_error_t *io_handle_write(void return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ static svn_error_t *io_handle_close(void *baton) { io_baton_t *io = baton; @@ -1733,6 +1768,7 @@ static apr_status_t io_handle_cleanup(vo return APR_SUCCESS; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_make_stream(svn_stream_t **stream, SV *obj) { IO *io; @@ -1778,6 +1814,7 @@ svn_error_t *svn_swig_pl_make_stream(svn return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ svn_error_t *svn_swig_pl_ra_lock_callback( void *baton, const char *path, @@ -1797,6 +1834,7 @@ svn_error_t *svn_swig_pl_ra_lock_callbac return SVN_NO_ERROR; } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ SV *svn_swig_pl_from_stream(svn_stream_t *stream) { SV *ret; @@ -1848,6 +1886,7 @@ void svn_swig_pl_hold_ref_in_pool(apr_po apr_pool_cleanup_register(pool, sv, cleanup_refcnt, apr_pool_cleanup_null); } +/* NOTE: calls back into Perl (by calling svn_swig_pl_callback_thunk) */ SV *svn_swig_pl_from_md5(unsigned char *digest) { SV *ret;
