You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2012/02/07 20:04:02 UTC

svn commit: r1241553 - in /subversion/trunk: subversion/bindings/swig/include/ subversion/bindings/swig/ruby/libsvn_swig_ruby/ subversion/bindings/swig/ruby/svn/ tools/examples/

Author: stsp
Date: Tue Feb  7 19:04:02 2012
New Revision: 1241553

URL: http://svn.apache.org/viewvc?rev=1241553&view=rev
Log:
Fix the ruby bindings for svn_auth_get_platform_specific_client_providers.

The bindings were present, but due to a missing argout typemap for
apr_array_header_t **providers, they threw a not implemented error. This
was fixed for perl in r1035745 and for python in r1241530, but was still
broken for ruby.

[in subversion/bindings/swig]

* include/svn_containers.swg
  (apr_array_header_t **providers):
  New SWIGRUBY typemap.

* ruby/libsvn_swig_ruby/swigutil_rb.c,
  ruby/libsvn_swig_ruby/swigutil_rb.h
  (svn_swig_rb_apr_array_to_array_auth_provider_object): Add function.

* ruby/svn/core.rb
  (add_platform_specific_client_providers, add_providers): Add
  functions.

[in tools/examples]

* info.rb
  Add a new example that shows how to do remote access instead of
  working on an existing working copy (like the existing examples do).
  This example also shows how to call
  svn_auth_get_platform_specific_client_providers.

Patch by: Matthijs Kooijman <ma...@stdin.nl>

Added:
    subversion/trunk/tools/examples/info.rb   (with props)
Modified:
    subversion/trunk/subversion/bindings/swig/include/svn_containers.swg
    subversion/trunk/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c
    subversion/trunk/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h
    subversion/trunk/subversion/bindings/swig/ruby/svn/core.rb

Modified: subversion/trunk/subversion/bindings/swig/include/svn_containers.swg
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/swig/include/svn_containers.swg?rev=1241553&r1=1241552&r2=1241553&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/swig/include/svn_containers.swg (original)
+++ subversion/trunk/subversion/bindings/swig/include/svn_containers.swg Tue Feb  7 19:04:02 2012
@@ -884,3 +884,9 @@
   }
 }
 #endif
+
+#ifdef SWIGRUBY
+%typemap(argout) apr_array_header_t **providers {
+  %append_output(svn_swig_rb_apr_array_to_array_auth_provider_object(*$1));
+}
+#endif

Modified: subversion/trunk/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c?rev=1241553&r1=1241552&r2=1241553&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c (original)
+++ subversion/trunk/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c Tue Feb  7 19:04:02 2012
@@ -1313,6 +1313,9 @@ DEFINE_APR_ARRAY_TO_ARRAY(VALUE, svn_swi
 DEFINE_APR_ARRAY_TO_ARRAY(VALUE, svn_swig_rb_apr_array_to_array_merge_range,
                           c2r_merge_range_dup, EMPTY_CPP_ARGUMENT,
                           svn_merge_range_t *, NULL)
+DEFINE_APR_ARRAY_TO_ARRAY(VALUE, svn_swig_rb_apr_array_to_array_auth_provider_object,
+                          c2r_swig_type, EMPTY_CPP_ARGUMENT,
+                          svn_auth_provider_object_t *, "svn_auth_provider_object_t*")
 
 static VALUE
 c2r_merge_range_array(void *value, void *ctx)

Modified: subversion/trunk/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h?rev=1241553&r1=1241552&r2=1241553&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h (original)
+++ subversion/trunk/subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.h Tue Feb  7 19:04:02 2012
@@ -154,6 +154,8 @@ SVN_RB_SWIG_SWIGUTIL_EXPORT
 VALUE svn_swig_rb_apr_array_to_array_external_item2(const apr_array_header_t *ary);
 SVN_RB_SWIG_SWIGUTIL_EXPORT
 VALUE svn_swig_rb_apr_array_to_array_merge_range(const apr_array_header_t *ary);
+SVN_RB_SWIG_SWIGUTIL_EXPORT
+VALUE svn_swig_rb_apr_array_to_array_auth_provider_object(const apr_array_header_t *ary);
 
 SVN_RB_SWIG_SWIGUTIL_EXPORT
 VALUE svn_swig_rb_prop_apr_array_to_hash_prop(const apr_array_header_t *ary);

Modified: subversion/trunk/subversion/bindings/swig/ruby/svn/core.rb
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/swig/ruby/svn/core.rb?rev=1241553&r1=1241552&r2=1241553&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/swig/ruby/svn/core.rb (original)
+++ subversion/trunk/subversion/bindings/swig/ruby/svn/core.rb Tue Feb  7 19:04:02 2012
@@ -279,6 +279,10 @@ module Svn
         add_prompt_provider("ssl_client_cert_pw", args, prompt, klass)
       end
 
+      def add_platform_specific_client_providers(config=nil)
+        add_providers(Core.auth_get_platform_specific_client_providers(config))
+      end
+
       private
       def add_prompt_provider(name, args, prompt, credential_class)
         real_prompt = Proc.new do |*prompt_args|
@@ -294,6 +298,10 @@ module Svn
       end
 
       def add_provider(provider)
+        add_providers([provider])
+      end
+
+      def add_providers(new_providers)
         if auth_baton
           providers = auth_baton.providers
           parameters = auth_baton.parameters
@@ -301,7 +309,7 @@ module Svn
           providers = []
           parameters = {}
         end
-        self.auth_baton = AuthBaton.new(providers + [provider], parameters)
+        self.auth_baton = AuthBaton.new(providers + new_providers, parameters)
       end
     end
 

Added: subversion/trunk/tools/examples/info.rb
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/examples/info.rb?rev=1241553&view=auto
==============================================================================
--- subversion/trunk/tools/examples/info.rb (added)
+++ subversion/trunk/tools/examples/info.rb Tue Feb  7 19:04:02 2012
@@ -0,0 +1,78 @@
+#!/usr/bin/env ruby
+#
+# info.rb : output some info about a subversion url
+#
+# Example based on a blogpost by Mark Deepwell
+# http://www.markdeepwell.com/2010/06/ruby-subversion-bindings/
+#
+######################################################################
+#    Licensed to the Apache Software Foundation (ASF) under one
+#    or more contributor license agreements.  See the NOTICE file
+#    distributed with this work for additional information
+#    regarding copyright ownership.  The ASF licenses this file
+#    to you under the Apache License, Version 2.0 (the
+#    "License"); you may not use this file except in compliance
+#    with the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing,
+#    software distributed under the License is distributed on an
+#    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#    KIND, either express or implied.  See the License for the
+#    specific language governing permissions and limitations
+#    under the License.
+######################################################################
+#
+
+require "svn/core"
+require "svn/client"
+require "svn/wc"
+require "svn/repos"
+
+# Prompt function mimicking svn's own prompt
+simple_prompt = Proc.new do
+  |result, realm, username, default, may_save, pool|
+
+  puts "Authentication realm: #{realm}"
+  if username != nil
+    result.username = username
+  else
+    print "Username: "
+    result.username = STDIN.gets.strip
+  end
+  print "Password for '#{result.username}': "
+  result.password = STDIN.gets.strip
+end
+
+
+if ARGV.length != 1
+  puts "Usage: info.rb URL[@REV]"
+else
+  ctx = Svn::Client::Context.new()
+  ctx.add_platform_specific_client_providers
+  ctx.add_simple_provider
+  ctx.add_simple_prompt_provider(2, simple_prompt)
+  ctx.add_username_provider
+  ctx.add_ssl_server_trust_file_provider
+  ctx.add_ssl_client_cert_file_provider
+  ctx.add_ssl_client_cert_pw_file_provider
+
+  repos_uri, revision = ARGV[0].split("@", 2)
+  if revision
+    revision = Integer(revision)
+  end
+
+  begin
+    ctx.info(repos_uri, revision) do |path, info|
+      puts("Url: #{info.url}")
+      puts("Last changed rev: #{info.last_changed_rev}")
+      puts("Last changed author: #{info.last_changed_author}")
+      puts("Last changed date: #{info.last_changed_date}")
+      puts("Kind: #{info.kind}")
+    end
+  rescue Svn::Error => e
+    # catch a generic svn error
+    raise "Failed to retrieve SVN info at revision " + revision.to_s
+  end
+end

Propchange: subversion/trunk/tools/examples/info.rb
------------------------------------------------------------------------------
    svn:eol-style = native