Basic Mercurial support
This commit is contained in:
parent
9d1e7c7284
commit
15ddecef0e
|
@ -0,0 +1,11 @@
|
|||
vcsrepo { "/tmp/vcstest-hg-init":
|
||||
ensure => present,
|
||||
provider => hg
|
||||
}
|
||||
|
||||
vcsrepo { "/tmp/vcstest-hg-clone":
|
||||
ensure => present,
|
||||
provider => hg,
|
||||
source => "http://hg.basho.com/riak/",
|
||||
revision => '34e6012c783a'
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
require 'puppet/provider/vcsrepo'
|
||||
require File.join(File.dirname(__FILE__), '..', 'vcsrepo')
|
||||
|
||||
Puppet::Type.type(:vcsrepo).provide(:cvs, :parent => Puppet::Provider::Vcsrepo) do
|
||||
desc "Supports CVS repositories/workspaces"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
require 'puppet/provider/vcsrepo'
|
||||
require File.join(File.dirname(__FILE__), '..', 'vcsrepo')
|
||||
|
||||
Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo) do
|
||||
desc "Supports Git repositories"
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
require File.join(File.dirname(__FILE__), '..', 'vcsrepo')
|
||||
|
||||
Puppet::Type.type(:vcsrepo).provide(:hg, :parent => Puppet::Provider::Vcsrepo) do
|
||||
desc "Supports Mercurial repositories"
|
||||
|
||||
commands :hg => 'hg'
|
||||
defaultfor :hg => :exists
|
||||
|
||||
def create
|
||||
if !@resource.value(:source)
|
||||
create_repository(@resource.value(:path))
|
||||
else
|
||||
clone_repository(@resource.value(:revision))
|
||||
end
|
||||
end
|
||||
|
||||
def exists?
|
||||
File.directory?(File.join(@resource.value(:path), '.hg'))
|
||||
end
|
||||
|
||||
def destroy
|
||||
FileUtils.rm_rf(@resource.value(:path))
|
||||
end
|
||||
|
||||
def revision
|
||||
at_path do
|
||||
hg('parents')[/^changeset:\s+(?:-?\d+):(\S+)/m, 1]
|
||||
end
|
||||
end
|
||||
|
||||
def revision=(desired)
|
||||
at_path do
|
||||
hg('pull')
|
||||
begin
|
||||
hg('merge')
|
||||
rescue Puppet::ExecutionFailure
|
||||
# If there's nothing to merge, just skip
|
||||
end
|
||||
hg('update', '--clean', '-r', desired)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def create_repository(path)
|
||||
hg('init', path)
|
||||
end
|
||||
|
||||
def clone_repository(revision)
|
||||
args = ['clone']
|
||||
if revision
|
||||
args.push('-u', revision)
|
||||
end
|
||||
args.push(@resource.value(:source),
|
||||
@resource.value(:path))
|
||||
hg(*args)
|
||||
end
|
||||
|
||||
end
|
|
@ -1,4 +1,4 @@
|
|||
require 'puppet/provider/vcsrepo'
|
||||
require File.join(File.dirname(__FILE__), '..', 'vcsrepo')
|
||||
|
||||
Puppet::Type.type(:vcsrepo).provide(:svn, :parent => Puppet::Provider::Vcsrepo) do
|
||||
desc "Supports Subversion repositories"
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
changeset: 3:34e6012c783a
|
||||
parent: 2:21ea4598c962
|
||||
parent: 1:9d0ff0028458
|
||||
user: Test User <test.user@example.com>
|
||||
date: Fri Aug 07 13:13:02 2009 -0400
|
||||
summary: merge
|
|
@ -0,0 +1,96 @@
|
|||
require 'pathname'; Pathname.new(__FILE__).realpath.ascend { |x| begin; require (x + 'spec_helper.rb'); break; rescue LoadError; end }
|
||||
|
||||
provider_class = Puppet::Type.type(:vcsrepo).provider(:hg)
|
||||
|
||||
describe provider_class do
|
||||
|
||||
before :each do
|
||||
@resource = stub("resource")
|
||||
@provider = provider_class.new(@resource)
|
||||
@path = '/tmp/vcsrepo'
|
||||
end
|
||||
|
||||
describe 'when creating' do
|
||||
before do
|
||||
@resource.expects(:value).with(:path).returns(@path).at_least_once
|
||||
end
|
||||
context "when a source is given" do
|
||||
before do
|
||||
@source = 'http://example.com/hg/repo'
|
||||
@resource.expects(:value).with(:source).returns(@source).at_least_once
|
||||
end
|
||||
context "and when a revision is given" do
|
||||
before do
|
||||
@revision = '6aa99e9b3ac2'
|
||||
@resource.expects(:value).with(:revision).returns(@revision).at_least_once
|
||||
end
|
||||
it "should execute 'hg clone -u' with the revision" do
|
||||
@provider.expects(:hg).with('clone', '-u', @revision, @source, @path)
|
||||
@provider.create
|
||||
end
|
||||
end
|
||||
context "and when a revision is not given" do
|
||||
before do
|
||||
@resource.expects(:value).with(:revision).returns(nil).at_least_once
|
||||
end
|
||||
it "should just execute 'hg clone' without a revision" do
|
||||
@provider.expects(:hg).with('clone', @source, @path)
|
||||
@provider.create
|
||||
end
|
||||
end
|
||||
end
|
||||
context "when a source is not given" do
|
||||
before do
|
||||
@resource.expects(:value).with(:source).returns(nil).at_least_once
|
||||
end
|
||||
it "should execute 'hg init'" do
|
||||
@provider.expects(:hg).with('init', @path)
|
||||
@provider.create
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'when destroying' do
|
||||
it "it should remove the directory" do
|
||||
@resource.expects(:value).with(:path).returns(@path).at_least_once
|
||||
FileUtils.expects(:rm_rf).with(@path)
|
||||
@provider.destroy
|
||||
end
|
||||
end
|
||||
|
||||
describe "when checking existence" do
|
||||
before do
|
||||
@resource.expects(:value).with(:path).returns(@path)
|
||||
end
|
||||
it "should check for the directory" do
|
||||
File.expects(:directory?).with(File.join(@path, '.hg'))
|
||||
@provider.exists?
|
||||
end
|
||||
end
|
||||
|
||||
describe "when checking the revision property" do
|
||||
before do
|
||||
@resource.expects(:value).with(:path).returns(@path)
|
||||
end
|
||||
it "should use 'hg tip'" do
|
||||
@provider.expects('hg').with('parents').returns(fixture(:hg_parents))
|
||||
Dir.expects(:chdir).with(@path).yields
|
||||
@provider.revision.should == '34e6012c783a'
|
||||
end
|
||||
end
|
||||
|
||||
describe "when setting the revision property" do
|
||||
before do
|
||||
@resource.expects(:value).with(:path).returns(@path).at_least_once
|
||||
@revision = '6aa99e9b3ab1'
|
||||
end
|
||||
it "should use 'hg update ---clean -r'" do
|
||||
Dir.expects(:chdir).with(@path).yields
|
||||
@provider.expects('hg').with('pull')
|
||||
@provider.expects('hg').with('merge')
|
||||
@provider.expects('hg').with('update', '--clean', '-r', @revision)
|
||||
@provider.revision = @revision
|
||||
end
|
||||
end
|
||||
|
||||
end
|
Loading…
Reference in New Issue