Jun 26 2010

Ruby Subversion Bindings

Subversion has bindings for a variety of languages: Java, Perl, Python and Ruby. Of these I am most interested in the Ruby bindings as I'm building a Rails application. Unfortunately the documentation is completely lacking and bits of it are scattered throughout the web. This is an attempt to provide the code and how-to for the most common tasks.

Before we get to the code, validate you have the Ruby Subversion bindings installed correctly by running irb from a terminal:

irb(main):001:0> require 'svn/client'
=> true

Onto the source code. Start it off by including the required svn modules:

RUBY:
  1. require "svn/core"
  2. require "svn/client"
  3. require "svn/wc"
  4. require "svn/repos"

Then setup the context with your subversion credentials:

RUBY:
  1. ctx = Svn::Client::Context.new()
  2. ctx.add_simple_provider
  3. ctx.auth_baton[Svn::Core::AUTH_PARAM_DEFAULT_USERNAME] = 'username'
  4. ctx.auth_baton[Svn::Core::AUTH_PARAM_DEFAULT_PASSWORD] = 'password'

Now you can run any of the following commands on a remote subversion repository.

SVN Info

RUBY:
  1. repos_uri = 'http://svn.website.com/project/trunk'
  2. revision = 50
  3. begin
  4.   ctx.info(repos_uri, revision) do |path, info|
  5.     puts("Url: #{info.url}")
  6.     puts("Last changed rev: #{info.last_changed_rev}")
  7.     puts("Last changed author: #{info.last_changed_author}")
  8.     puts("Last changed date: #{info.last_changed_date}")
  9.     puts("Kind: #{info.kind}")
  10.   end
  11. rescue Svn::Error => e
  12.   # catch a generic svn error
  13.   raise "Failed to retrieve SVN info at revision " + revision.to_s
  14. end

SVN Checkout

RUBY:
  1. repos_uri = 'http://svn.website.com/project/trunk'
  2. output_dir '/home/billy/project_name'
  3. revision = 50
  4. begin
  5.   ctx.checkout(repos_uri, output_dir, revision.to_i, nil)
  6. rescue Svn::Error::CLIENT_UNRELATED_RESOURCES => e # revision doesn't exist
  7.   raise "No such revision " + revision.to_s + " at " + repos_uri
  8. end

SVN Log

RUBY:
  1. repos_uri = 'http://svn.website.com/project/trunk'
  2. ctx.log(repos_uri, 0, 'HEAD', 0, true, nil) do |changed_paths, rev, author, date, message|
  3.   puts("Revision: #{rev}")
  4.   puts("Author: #{author}")
  5.   puts("Date: #{date}")
  6.   puts("Message: #{message}")
  7.   puts("---------------------------")
  8. end

SVN List

RUBY:
  1. repos_uri = 'http://svn.website.com/project/trunk'
  2. ctx.list(repos_uri, "HEAD") do |path, dirent, lock, abs_path|
  3.   if !path.blank?
  4.     puts("Path: #{path}")
  5.   end
  6. end

That should get you started with the ruby bindings. If you want to know how to do anything else let me know in the comments.


Mar 15 2010

Bash Basics

Bash is a shell scripting language included on most Linux and Mac computers. It's useful for writing small scripts that don't require another software language to be installed and are immediately portable. Good places to use bash scripts are when you want to write a cronjob, backup some files, or run an update task. Here are the basics to get you started.

Start your script with She-Bang header:
#!/bin/bash

Variables are assigned by a key-value pairing:
FILENAME="~/docs/input"

You can print to the console by using echo:
echo $FILENAME

An IF statement:
if [ ! -s $FILENAME ] ; then
  touch $FILENAME
fi

The bang ! negates the result, and the -s parameter checks if a file exists.

Example of a function:
function getFile
{
  # function contents here
  # the hash symbol makes the rest of this line a comment
}

Call this function by using its name:
getFile

You can pass a variable to a function:
getFile "/home/user/docs/file.txt"

And use it within the function by reference to $1
function getFile
{
  echo $1
}