require 'repertoire/exceptions/repository_exists'
require 'repertoire/exceptions/checkout_failed'
require 'repertoire/exceptions/update_failed'
require 'repertoire/repository'
require 'repertoire/media'
require 'fileutils'
module Repertoire
#
# Checkout the repository at the specified _options_. If a _block_
# is given, it will be passed a newly created Repository object
# for the checked out repository.
#
# _options_ must contain the following key:
# :uri:: The URI of the repository to checkout.
#
# _options_ may also contain the additional keys:
# :path:: Path to checkout the repository to.
# :media:: The media type of the repository. Defaults to the
# value of Media.get_for_uri.
# :into:: Checkout the repository into the given directory.
# Cannot be used with :path.
#
def Repertoire.checkout(options={},&block)
unless options[:uri]
raise(ArgumentError,"the :uri option must be specified",caller)
end
uri = options[:uri].to_s
path = options[:path]
into = options[:into]
media = options[:media]
unless path
if into
into = File.expand_path(into)
unless File.directory?(into)
FileUtils.mkdir_p(into)
end
path = File.join(into,Repository.name(uri))
else
path = Repository.name(uri)
end
end
path = File.expand_path(path)
if File.exists?(path)
raise(RepositoryExists,"the repository #{path.dump} already exists",caller)
end
if media
handler = Media.get(media)
else
handler = Media.guess_from_uri(uri)
end
begin
handler.checkout(uri,path)
rescue CommandFailed
raise(CheckoutFailed,"failed to checkout the repository located at #{uri.dump}",caller)
end
return Repository.new(path,handler,&block)
end
#
# Update the repository with the specified _options_. If a _block_
# is given, it will be passed a newly created Repository object
# for the updated repository.
#
# _options_ must contain the following keys:
# :path:: The path of the repository to update.
#
# _options_ may also contain the additional keys:
# :uri:: The URI to update against.
# :media:: The type of the repository. Defaults to
# Media.guess_from_uri if :uri is given,
# otherwise Media.guess_from_path.
#
def Repertoire.update(options={},&block)
unless options[:path]
raise(ArgumentError,"the :path option must be specified",caller)
end
path = File.expand_path(options[:path])
uri = options[:uri]
media = options[:media]
if media
handler = Media.get(media)
elsif uri
handler = Media.guess_from_uri(uri)
else
handler = Media.guess_from_path(path)
end
begin
handler.update(path,uri)
rescue CommandFailed
raise(UpdateFailed,"failed to update the repository at #{path.dump}",caller)
end
return Repository.new(path,handler,&block)
end
#
# Delete the repository at the specified _path_. If a _block_ is
# given, it will be passed the _path_ before it is deleted.
#
def Repertoire.delete(path,&block)
path = File.expand_path(path)
block.call(path) if block
FileUtils.rm_r(path,:force => true, :secure => true)
return nil
end
end