The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/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/ext/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

gnome_keyring_prompt = Proc.new do
  |keyring_name|

  print "Password for '#{keyring_name}' GNOME keyring: "
  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

  # Allow asking for the gnome keyring password, in case the keyring is
  # locked.
  if Svn::Ext::Core.respond_to?(:svn_auth_set_gnome_keyring_unlock_prompt_func)
    Svn::Ext::Core::svn_auth_set_gnome_keyring_unlock_prompt_func(ctx.auth_baton, gnome_keyring_prompt)
  end

  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