You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by br...@apache.org on 2013/11/12 03:23:16 UTC
svn commit: r1540921 - in /subversion/trunk/subversion/bindings/javahl:
native/ src/org/apache/subversion/javahl/
src/org/apache/subversion/javahl/util/ tests/org/apache/subversion/javahl/
Author: brane
Date: Tue Nov 12 02:23:16 2013
New Revision: 1540921
URL: http://svn.apache.org/r1540921
Log:
Expose a utility to resolve relative extrnalls URLs in JavaHL.
[in subversion/bindings/javahl]
* src/org/apache/subversion/javahl/SVNUtil.java
(SVNUtil.resolveExternalsUrl): New static method.
* src/org/apache/subversion/javahl/util/PropLib.java
(PropLib.resolveExternalsUrl): New native method.
(PropLib.canonicalizeSvnProperty, PropLib.unparseExternals):
Fix references in docstrings.
* native/ExternalItem.hpp, native/ExternalItem.cpp
(ExternalItem::get_external_item): New public method.
* native/org_apache_subversion_javahl_util_PropLib.cpp
(Java_org_apache_subversion_javahl_util_PropLib_resolveExternalsUrl):
New; implementation of PropLib.resolveExternalsUrl.
* tests/org/apache/subversion/javahl/UtilTests.java
(UtilTests.testResolveExternalsUrl): New testcase.
Modified:
subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp
subversion/trunk/subversion/bindings/javahl/native/ExternalItem.hpp
subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java
Modified: subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp?rev=1540921&r1=1540920&r2=1540921&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp Tue Nov 12 02:23:16 2013
@@ -21,8 +21,9 @@
* @endcopyright
*/
+#include "jniwrapper/jni_stack.hpp"
+
#include "ExternalItem.hpp"
-#include "JNIUtil.h"
#include "Revision.h"
namespace JavaHL {
@@ -92,6 +93,22 @@ ExternalItem::ExternalItem(::Java::Env e
m_peg_revision(*peg_revision)
{}
+svn_wc_external_item2_t*
+ExternalItem::get_external_item(SVN::Pool& svnpool) const
+{
+ svn_wc_external_item2_t* item;
+ apr_pool_t* const pool = svnpool.getPool();
+ SVN_JAVAHL_CHECK(svn_wc_external_item2_create(&item, pool));
+
+ item->target_dir = apr_pstrdup(
+ pool, Java::String::Contents(m_target_dir).c_str());
+ item->url = apr_pstrdup(
+ pool, Java::String::Contents(m_url).c_str());
+ item->revision = m_revision;
+ item->peg_revision = m_peg_revision;
+ return item;
+}
+
} // namespace JavaHL
Modified: subversion/trunk/subversion/bindings/javahl/native/ExternalItem.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/ExternalItem.hpp?rev=1540921&r1=1540920&r2=1540921&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/ExternalItem.hpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/ExternalItem.hpp Tue Nov 12 02:23:16 2013
@@ -27,6 +27,9 @@
#include <string>
#include "svn_opt.h"
+#include "svn_wc.h"
+
+#include "Pool.h"
#include "jniwrapper/jni_object.hpp"
#include "jniwrapper/jni_string.hpp"
@@ -90,6 +93,12 @@ public:
return &m_peg_revision;
}
+ /**
+ * Returns an @c svn_wc_external_item2_t allocated from @a pool and
+ * filled in with this object's values.
+ */
+ svn_wc_external_item2_t* get_external_item(SVN::Pool& pool) const;
+
private:
static const char* const m_class_name;
Modified: subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp?rev=1540921&r1=1540920&r2=1540921&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.cpp Tue Nov 12 02:23:16 2013
@@ -42,6 +42,7 @@
#include "svn_time.h"
#include "svn_wc.h"
+#include "private/svn_wc_private.h"
#include "svn_private_config.h"
@@ -255,6 +256,7 @@ Java_org_apache_subversion_javahl_util_P
return NULL;
}
+
JNIEXPORT jbyteArray JNICALL
Java_org_apache_subversion_javahl_util_PropLib_unparseExternals(
JNIEnv* jenv, jobject jthis,
@@ -346,3 +348,34 @@ Java_org_apache_subversion_javahl_util_P
SVN_JAVAHL_JNI_CATCH;
return NULL;
}
+
+
+JNIEXPORT jstring JNICALL
+Java_org_apache_subversion_javahl_util_PropLib_resolveExternalsUrl(
+ JNIEnv* jenv, jobject jthis,
+ jobject jitem, jstring jrepos_root_url, jstring jparent_dir_url)
+{
+ SVN_JAVAHL_JNI_TRY(PropLib, unparseExternals)
+ {
+ const Java::Env env(jenv);
+
+ const Java::String repos_root_url(env, jrepos_root_url);
+ const Java::String parent_dir_url(env, jparent_dir_url);
+ const JavaHL::ExternalItem item(env, jitem);
+
+ // Using a "global" request pool since we don't keep a context
+ // with its own pool around for these functions.
+ SVN::Pool pool;
+
+ const char* resolved_url;
+ SVN_JAVAHL_CHECK(svn_wc__resolve_relative_external_url(
+ &resolved_url,
+ item.get_external_item(pool),
+ Java::String::Contents(repos_root_url).c_str(),
+ Java::String::Contents(parent_dir_url).c_str(),
+ pool.getPool(), pool.getPool()));
+ return Java::String(env, resolved_url).get();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+ return NULL;
+}
Modified: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java?rev=1540921&r1=1540920&r2=1540921&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java (original)
+++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNUtil.java Tue Nov 12 02:23:16 2013
@@ -376,4 +376,41 @@ public class SVNUtil
{
return new PropLib().unparseExternals(items, parentDirectory, true);
}
+
+ /**
+ * If the URL in <code>external</code> is relative, resolve it to
+ * an absolute URL, using <code>reposRootUrl</code> and
+ * <code>parentDirUrl</code> to provide contest.
+ *<p>
+ * Regardless if the URL is absolute or not, if there are no
+ * errors, the returned URL will be canonicalized.
+ *<p>
+ * The following relative URL formats are supported:
+ * <dl>
+ * <dt><code>../</code></dt>
+ * <dd>relative to the parent directory of the external</dd>
+ * <dt><code>^/</code></dt>
+ * <dd>relative to the repository root</dd>
+ * <dt><code>//</code></dt>
+ * <dd>relative to the scheme</dd>
+ * <dt><code>/</code></dt>
+ * <dd>relative to the server's hostname</dd>
+ *<p>
+ * The <code>../<code> and ^/ relative URLs may use <code>..<code>
+ * to remove path elements up to the server root.
+ *<p>
+ * The external URL should not be canonicalized before calling
+ * this function, as otherwise the scheme relative URL
+ * '<code>//host/some/path</code>' would have been canonicalized
+ * to '<code>/host/some/path</code>' and we would not be able to
+ * match on the leading '<code>//</code>'.
+ */
+ public static String resolveExternalsUrl(ExternalItem external,
+ String reposRootUrl,
+ String parentDirUrl)
+ throws ClientException
+ {
+ return new PropLib()
+ .resolveExternalsUrl(external, reposRootUrl, parentDirUrl);
+ }
}
Modified: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java?rev=1540921&r1=1540920&r2=1540921&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java (original)
+++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/util/PropLib.java Tue Nov 12 02:23:16 2013
@@ -48,7 +48,7 @@ public class PropLib
NativeResources.loadNativeLibrary();
}
- /** @see SVNUtil.canonicalizeSvnProperty */
+ /** @see SVNUtil#canonicalizeSvnProperty */
public byte[] canonicalizeNodeProperty(String name, byte[] value,
String path, NodeKind kind,
String mimeType,
@@ -75,9 +75,16 @@ public class PropLib
boolean canonicalizeUrl)
throws ClientException;
- /** @see SVNUtil.unparseExternals */
+ /** @see SVNUtil#unparseExternals */
public native byte[] unparseExternals(List<ExternalItem> items,
String parentDirectory,
boolean old_format)
throws SubversionException;
+
+
+ /** @see SVNUtil#resolveExternalsUrl */
+ public native String resolveExternalsUrl(ExternalItem external,
+ String reposRootUrl,
+ String parentDirUrl)
+ throws ClientException;
}
Modified: subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java?rev=1540921&r1=1540920&r2=1540921&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java (original)
+++ subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java Tue Nov 12 02:23:16 2013
@@ -359,4 +359,32 @@ public class UtilTests extends SVNTests
}
assertTrue(caught_exception);
}
+
+ public void testResolveExternalsUrl() throws Throwable
+ {
+ assertEquals("http://a/b/c",
+ SVNUtil.resolveExternalsUrl(
+ new ExternalItem("x", "http://a/b/c/", null, null),
+ "http://a", "http://a/b"));
+
+ assertEquals("http://a/b/c",
+ SVNUtil.resolveExternalsUrl(
+ new ExternalItem("x", "^/b/c", null, null),
+ "http://a", "http://a/b"));
+
+ assertEquals("http://a/b/c",
+ SVNUtil.resolveExternalsUrl(
+ new ExternalItem("x", "../b/c", null, null),
+ "http://a", "http://a/b"));
+
+ assertEquals("http://a/b/c",
+ SVNUtil.resolveExternalsUrl(
+ new ExternalItem("x", "/b/c", null, null),
+ "http://a", "http://a/b"));
+
+ assertEquals("http://a/b/c",
+ SVNUtil.resolveExternalsUrl(
+ new ExternalItem("x", "//a/b/c", null, null),
+ "http://a", "http://a/b"));
+ }
}