Index: Makefile.in
===================================================================
--- Makefile.in	(.../trunk/Makefile.in)	(revision 13505)
+++ Makefile.in	(.../branches/ruby/Makefile.in)	(revision 13526)
@@ -67,12 +67,14 @@
 swig_py_libdir = @libdir@
 swig_java_libdir = @libdir@
 swig_pl_libdir = @libdir@
+swig_rb_libdir = @libdir@
 
 ### these possibly need further discussion
 swig_pydir = @libdir@/svn-python/libsvn
 swig_pydir_extra = @libdir@/svn-python/svn
 swig_javadir = @libdir@/svn-java
 swig_pldir = @libdir@/svn-perl
+swig_rbdir = $(SWIG_RB_SITE_ARCH_DIR)/svn/ext
 
 javahl_javadir = @libdir@/svn-javahl
 javahl_javahdir = @libdir@/svn-javahl/include
@@ -129,6 +131,11 @@
 SWIG_JAVA_COMPILE = @SWIG_JAVA_COMPILE@
 SWIG_JAVA_LINK = @SWIG_JAVA_LINK@
 SWIG_PL_INCLUDES = @SWIG_PL_INCLUDES@
+SWIG_RB_INCLUDES = @SWIG_RB_INCLUDES@ -I$(SWIG_SRC_DIR)/ruby/libsvn_swig_ruby
+SWIG_RB_COMPILE = @SWIG_RB_COMPILE@
+SWIG_RB_LINK = @SWIG_RB_LINK@
+SWIG_RB_SITE_LIB_DIR = @SWIG_RB_SITE_LIB_DIR@
+SWIG_RB_SITE_ARCH_DIR = @SWIG_RB_SITE_ARCH_DIR@
 LSWIGPL = @LSWIGPL@
 LSWIGPY = @LSWIGPY@
 
@@ -157,6 +164,7 @@
 COMPILE_SWIG_PY = $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) $(CPPFLAGS) -DSWIGPYTHON $(CFLAGS) $(SWIG_PY_INCLUDES) $(INCLUDES) -o $@ -c
 COMPILE_SWIG_JAVA = $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) $(CPPFLAGS) $(CFLAGS) $(SWIG_JAVA_INCLUDES) $(INCLUDES) -o $@ -c
 COMPILE_SWIG_PL = $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) $(CPPFLAGS) $(CFLAGS) $(SWIG_PL_INCLUDES) $(INCLUDES) -o $@ -c
+COMPILE_SWIG_RB = $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) $(CPPFLAGS) $(CFLAGS) $(SWIG_RB_INCLUDES) $(INCLUDES) -o $@ -c
 
 # special compilation for files destined for javahl (i.e. C++)
 COMPILE_JAVAHL_CXX = $(LIBTOOL) $(LTCXXFLAGS) --mode=compile $(COMPILE_CXX) $(JAVAHL_INCLUDES) -o $@ -c
@@ -174,15 +182,18 @@
 # these commands run SWIG to generate wrapper source files (*.c)
 ### should we protect against swig not being available?
 RUN_SWIG_PY = $(SWIG) $(SWIG_NORUNTIME_FLAG) -python $(SWIG_INCLUDES) $(SWIG_PY_INCLUDES) -o $@
+RUN_SWIG_RB = $(SWIG) -ruby $(SWIG_INCLUDES) $(SWIG_RB_INCLUDES) -o $@
 RUN_SWIG_JAVA = cd ${SWIG_BUILD_DIR}/java/org/tigris/subversion/swig && $(SWIG) $(SWIG_NORUNTIME_FLAG) -java -package 'org.tigris.subversion.swig' $(SWIG_INCLUDES) -o ${abs_builddir}/$@
 
 # Compilation of SWIG-generated C source code
 COMPILE_PY_WRAPPER = $(LIBTOOL) $(LTFLAGS) --mode=compile $(SWIG_PY_COMPILE) $(CPPFLAGS) $(SWIG_INCLUDES) $(SWIG_PY_INCLUDES) -prefer-pic -c -o $@
 COMPILE_JAVA_WRAPPER = $(LIBTOOL) $(LTFLAGS) --mode=compile $(SWIG_JAVA_COMPILE) -DSWIGJAVA $(SWIG_INCLUDES) $(SWIG_JAVA_INCLUDES) -prefer-pic -c -o $@
+COMPILE_RB_WRAPPER = $(LIBTOOL) $(LTFLAGS) --mode=compile $(SWIG_RB_COMPILE) $(CPPFLAGS) $(SWIG_INCLUDES) $(SWIG_RB_INCLUDES) -prefer-pic -c -o $@
 
 # these commands link the wrapper objects into an extension library/module
 LINK_PY_WRAPPER = $(LIBTOOL) $(LTFLAGS) --mode=link $(SWIG_PY_LINK) $(SWIG_LDFLAGS) -rpath $(swig_pydir) -avoid-version -module
 LINK_JAVA_WRAPPER = $(LIBTOOL) $(LTFLAGS) --mode=link $(SWIG_JAVA_LINK) $(SWIG_LDFLAGS) -rpath $(swig_javadir) -avoid-version -module
+LINK_RB_WRAPPER = $(LIBTOOL) $(LTFLAGS) --mode=link $(SWIG_RB_LINK) $(SWIG_LDFLAGS) -rpath $(swig_rbdir) -avoid-version -module
 
 LINK_JAVAHL_CXX = $(LIBTOOL) $(LTCXXFLAGS) --mode=link $(CXX) $(LT_LDFLAGS) $(CFLAGS) $(LDFLAGS) $(LT_CXX_LIBADD) -rpath $(libdir)
 
@@ -205,6 +216,8 @@
 INSTALL_SWIG_JAVA = $(INSTALL_LIB)
 INSTALL_SWIG_JAVA_LIB = $(INSTALL_LIB)
 INSTALL_SWIG_PL_LIB = $(INSTALL_LIB)
+INSTALL_SWIG_RB = $(INSTALL_LIB)
+INSTALL_SWIG_RB_LIB = $(INSTALL_LIB)
 
 INSTALL_JAVAHL_LIB = $(INSTALL_LIB)
 
@@ -220,6 +233,7 @@
 # bindings.
 SWIG_PL_DIR = $(abs_builddir)/subversion/bindings/swig/perl
 SWIG_JAVA_DIR = $(abs_builddir)/subversion/bindings/swig/java
+SWIG_RB_DIR = $(abs_builddir)/subversion/bindings/swig/ruby
 
 ### Enhance using Makefile generator to support JAR installation.
 INSTALL_EXTRA_SWIG_JAVA=\
@@ -233,6 +247,9 @@
 
 INSTALL_EXTRA_JAVAHL_LIB=@INSTALL_EXTRA_JAVAHL_LIB@
 
+INSTALL_EXTRA_SWIG_RB=\
+  $(INSTALL_DATA) $(abs_srcdir)/subversion/bindings/swig/ruby/svn/*.rb $(DESTDIR)$(SWIG_RB_SITE_LIB_DIR)
+
 APXS = @APXS@ 
 
 PYTHON = @PYTHON@
@@ -252,6 +269,8 @@
 swig_java_java_CLASSPATH=$(SWIG_JAVA_DIR)/build:$(JAVA_CLASSPATH)
 swig_java_tests_CLASSPATH=$(SWIG_JAVA_DIR)/build:$(JAVA_CLASSPATH)
 
+RUBY = @RUBY@
+
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 
@@ -597,3 +616,13 @@
 
 clean-swig-pl: $(SWIG_PL_DIR)/native/Makefile
 	cd $(SWIG_PL_DIR)/native; $(MAKE) clean
+
+check-swig-rb: swig-rb
+	cd $(SWIG_RB_DIR); $(RUBY) test/run-test.rb
+
+clean-swig-rb:
+	for d in $(SWIG_RB_DIR) $(SWIG_RB_DIR)/libsvn_swig_ruby; \
+	do \
+	  cd $$d; \
+	  rm -rf svn_*.c _*.c core.c *.lo *.la *.o .libs; \
+	done
Index: build.conf
===================================================================
--- build.conf	(.../trunk/build.conf)	(revision 13505)
+++ build.conf	(.../branches/ruby/build.conf)	(revision 13527)
@@ -59,11 +59,12 @@
 
 bdb-test-scripts =
 
-swig-languages = python java perl
+swig-languages = python java perl ruby
 swig-dirs = 
         subversion/bindings/swig/python
         subversion/bindings/swig/java/org/tigris/subversion/swig
         subversion/bindings/swig/perl
+        subversion/bindings/swig/ruby
 
 # ----------------------------------------------------------------------------
 #
@@ -276,7 +277,8 @@
 type = swig
 path = subversion/bindings/swig
 sources = svn_client.i
-libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl libsvn_client libsvn_subr apr
+libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl libsvn_swig_ruby
+       libsvn_client libsvn_subr apr
 nonlibs = swig_core
 description = Subversion client library bindings
 
@@ -284,7 +286,8 @@
 type = swig
 path = subversion/bindings/swig
 sources = svn_delta.i
-libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl libsvn_delta libsvn_subr
+libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl libsvn_swig_ruby
+       libsvn_delta libsvn_subr
 nonlibs = swig_core
 description = Subversion delta library bindings
 
@@ -292,7 +295,8 @@
 type = swig
 path = subversion/bindings/swig
 sources = svn_fs.i
-libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl libsvn_fs libsvn_subr
+libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl libsvn_swig_ruby
+       libsvn_fs libsvn_subr
 nonlibs = swig_core
 description = Subversion FS library bindings
 
@@ -300,7 +304,8 @@
 type = swig
 path = subversion/bindings/swig
 sources = svn_ra.i
-libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl libsvn_ra libsvn_subr
+libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl libsvn_swig_ruby
+       libsvn_ra libsvn_subr
 nonlibs = swig_core
 description = Subversion RA library bindings
 
@@ -308,7 +313,8 @@
 type = swig
 path = subversion/bindings/swig
 sources = svn_repos.i
-libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl libsvn_repos libsvn_subr
+libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl libsvn_swig_ruby
+       libsvn_repos libsvn_subr
 nonlibs = swig_core
 description = Subversion repository library bindings
 
@@ -316,7 +322,8 @@
 type = swig
 path = subversion/bindings/swig
 sources = svn_wc.i
-libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl libsvn_wc libsvn_subr
+libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl libsvn_swig_ruby
+       libsvn_wc libsvn_subr
 nonlibs = swig_core
 description = Subversion WC library bindings
 
@@ -324,7 +331,7 @@
 type = swig
 path = subversion/bindings/swig
 sources = core.i
-libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl
+libs = libsvn_swig_py libsvn_swig_java libsvn_swig_perl libsvn_swig_ruby
        libsvn_delta libsvn_diff libsvn_subr apr
 description = Subversion core library bindings
 include-runtime = yes
@@ -406,6 +413,19 @@
 compile-cmd = $(COMPILE_SWIG_PL)
 msvc-static = yes
 
+# SWIG utility library for Ruby modules
+[libsvn_swig_ruby]
+type = swig_lib
+lang = ruby
+path = subversion/bindings/swig/ruby/libsvn_swig_ruby
+sources = swigutil_rb.c
+libs = libsvn_subr libsvn_delta aprutil apriconv apr
+nonlibs = swig_core
+install = swig-rb-lib
+# need special build rule to include
+compile-cmd = $(COMPILE_SWIG_RB)
+msvc-static = yes
+
 # ----------------------------------------------------------------------------
 #
 # JavaHL targets
@@ -870,6 +890,12 @@
 libs = swig_client swig_delta swig_fs swig_ra swig_repos swig_wc swig_core
 lang = perl
 
+[__SWIG_RUBY__]
+type = swig_project
+path = build/win32
+libs = swig_client swig_delta swig_fs swig_ra swig_repos swig_wc swig_core
+lang = ruby
+
 [__JAVAHL__]
 type = project
 path = build/win32
Index: configure.in
===================================================================
--- configure.in	(.../trunk/configure.in)	(revision 13505)
+++ configure.in	(.../branches/ruby/configure.in)	(revision 13527)
@@ -554,6 +554,19 @@
 
 AC_PATH_PROG(PERL, perl, none)
 
+AC_PATH_PROG(RUBY, ruby, none)
+if test "$RUBY" != "none"; then
+  if "$RUBY" -r mkmf -e 'exit(have_func("rb_hash_foreach") ? 0 : 1)'; then
+    :
+  else
+    RUBY="none"
+    AC_MSG_WARN([The detected Ruby is too old for Subversion to use])
+    AC_MSG_WARN([A Ruby which has rb_hash_foreach is required to use the])
+    AC_MSG_WARN([Subversion Ruby bindings])
+    AC_MSG_WARN([Upgrade to the official 1.8.2 release, or later])
+  fi
+fi
+
 SVN_CHECK_SWIG
 
 dnl try to find the "makeinfo" program
Index: swig.m4
===================================================================
--- swig.m4	(.../trunk/build/ac-macros/swig.m4)	(revision 13505)
+++ swig.m4	(.../branches/ruby/build/ac-macros/swig.m4)	(revision 13527)
@@ -58,7 +58,7 @@
   bindings=$1
 
   if test "$bindings" = "all"; then
-    bindings="perl,python,java"
+    bindings="perl,python,java,ruby"
   fi
 
   for binding in `echo "$bindings" | sed -e "s/,/ /g"`; do
@@ -241,6 +241,57 @@
       fi
     fi
 
+    if test "$RUBY" != "none" -a \
+        "$SWIG_SUITABLE" = "yes" -a \
+        "$SWIG_VERSION" -ge "103024" -a \
+        "$svn_swig_bindings_enable_ruby" = "yes"; then
+
+      AC_MSG_NOTICE([Configuring Ruby SWIG binding])
+      SWIG_CLEAN_RULES="$SWIG_CLEAN_RULES clean-swig-rb" 
+
+      AC_CACHE_CHECK([for Ruby include path], [svn_cv_ruby_includes],[
+        svn_cv_ruby_includes="-I. -I`$RUBY -rrbconfig -e 'print Config::CONFIG.fetch(%q(archdir))'`"
+      ])
+      SWIG_RB_INCLUDES="\$(SWIG_INCLUDES) $svn_cv_ruby_includes"
+
+      AC_CACHE_CHECK([how to compile Ruby extensions], [svn_cv_ruby_compile],[
+        # XXX: This apparent temporary kludge needs to be resolved
+        # I assume we *should* be using CFLAGS from Ruby
+        svn_cv_ruby_compile="`$RUBY -rrbconfig -e 'print Config::CONFIG.fetch(%q(CC))'` -g \$(SWIG_RB_INCLUDES)"
+        # svn_cv_ruby_compile="`$RUBY -rrbconfig -e 'print Config::CONFIG.fetch(%q(CC)), %q( ), Config::CONFIG.fetch(%q(CFLAGS))'` \$(SWIG_RB_INCLUDES)"
+      ])
+      SWIG_RB_COMPILE="$svn_cv_ruby_compile"
+
+      AC_CACHE_CHECK([how to link Ruby extensions], [svn_cv_ruby_link],[
+        svn_cv_ruby_link="`$RUBY -rrbconfig -e 'print Config::CONFIG.fetch(%q(LDSHARED)).sub(/^\w+/, Config::CONFIG.fetch(%q(CC)) + %q( -shrext .) + Config::CONFIG.fetch(%q(DLEXT)))'`"
+      ])
+      SWIG_RB_LINK="$svn_cv_ruby_link"
+
+      AC_CACHE_VAL([svn_cv_ruby_sitedir],[
+        svn_cv_ruby_sitedir="`$RUBY -rrbconfig -e 'print Config::CONFIG.fetch(%q(sitedir))'`"
+      ])
+      AC_ARG_WITH([ruby-sitedir],
+		  AC_HELP_STRING([--with-ruby-sitedir=SITEDIR],
+                                 [install Ruby bindings in SITEDIR
+                                  (default is same as ruby's one)]),
+		  [svn_ruby_installdir="$withval"],
+		  [svn_ruby_installdir="$svn_cv_ruby_sitedir"])
+
+      AC_MSG_CHECKING([where to install Ruby scripts])
+      AC_CACHE_VAL([svn_cv_ruby_sitedir_libsuffix],[
+        svn_cv_ruby_sitedir_libsuffix="`$RUBY -rrbconfig -e 'print Config::CONFIG.fetch(%q(sitelibdir)).sub(/^#{Config::CONFIG.fetch(%q(sitedir))}/, %q())'`"
+      ])
+      SWIG_RB_SITE_LIB_DIR="${svn_ruby_installdir}${svn_cv_ruby_sitedir_libsuffix}"
+      AC_MSG_RESULT([$SWIG_RB_SITE_LIB_DIR])
+
+      AC_MSG_CHECKING([where to install Ruby extensions])
+      AC_CACHE_VAL([svn_cv_ruby_sitedir_archsuffix],[
+        svn_cv_ruby_sitedir_archsuffix="`$RUBY -rrbconfig -e 'print Config::CONFIG.fetch(%q(sitearchdir)).sub(/^#{Config::CONFIG.fetch(%q(sitedir))}/, %q())'`"
+      ])
+      SWIG_RB_SITE_ARCH_DIR="${svn_ruby_installdir}${svn_cv_ruby_sitedir_archsuffix}"
+      AC_MSG_RESULT([$SWIG_RB_SITE_ARCH_DIR])
+    fi
+
   fi
   AC_SUBST(SWIG_CLEAN_RULES)
   AC_SUBST(SWIG_NORUNTIME_FLAG)
@@ -252,6 +303,11 @@
   AC_SUBST(SWIG_JAVA_COMPILE)
   AC_SUBST(SWIG_JAVA_LINK)
   AC_SUBST(SWIG_PL_INCLUDES)
+  AC_SUBST(SWIG_RB_LINK)
+  AC_SUBST(SWIG_RB_INCLUDES)
+  AC_SUBST(SWIG_RB_COMPILE)
+  AC_SUBST(SWIG_RB_SITE_LIB_DIR)
+  AC_SUBST(SWIG_RB_SITE_ARCH_DIR)
   AC_SUBST(SWIG_LIBSWIG_DIR)
   AC_SUBST(LSWIGPL)
   AC_SUBST(LSWIGPY)
Index: gen_base.py
===================================================================
--- gen_base.py	(.../trunk/build/generator/gen_base.py)	(revision 13505)
+++ gen_base.py	(.../branches/ruby/build/generator/gen_base.py)	(revision 13527)
@@ -499,18 +499,21 @@
     cname = iname[:-2] + '.c'
     oname = iname[:-2] + self.gen_obj._extension_map['lib', 'object']
 
-    ### we should really extract the %module line
-    libname = iname[:4] != 'svn_' and ('_' + iname[:-2]) or iname[3:-2]
-    libfile = libname + self.gen_obj._extension_map['lib', 'target']
+    # Extract SWIG module name from .i file name
+    module_name = iname[:4] != 'svn_' and iname[:-2] or iname[4:-2]
 
-    self.name = self.lang + libname
-    self.path = build_path_join(self.path, self.lang)
-    if self.lang == "perl":
-      self.filename = build_path_join(self.path, libfile[0]
-                                      + string.capitalize(libfile[1:]))
+    lib_extension = self.gen_obj._extension_map['lib', 'target']
+    if self.lang == "ruby":
+      lib_filename = module_name + lib_extension
+    elif self.lang == "perl":
+      lib_filename = '_' + string.capitalize(module_name) + lib_extension
     else:
-      self.filename = build_path_join(self.path, libfile)
+      lib_filename = '_' + module_name + lib_extension
 
+    self.name = self.lang + '_' + module_name
+    self.path = build_path_join(self.path, self.lang)
+    self.filename = build_path_join(self.path, lib_filename)
+
     ifile = SWIGSource(ipath)
     cfile = SWIGObject(build_path_join(self.path, cname), self.lang)
     ofile = SWIGObject(build_path_join(self.path, oname), self.lang)


