Basic Mercurial support
This commit is contained in:
11
examples/hg/init.pp
Normal file
11
examples/hg/init.pp
Normal file
@@ -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
|
Puppet::Type.type(:vcsrepo).provide(:cvs, :parent => Puppet::Provider::Vcsrepo) do
|
||||||
desc "Supports CVS repositories/workspaces"
|
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
|
Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo) do
|
||||||
desc "Supports Git repositories"
|
desc "Supports Git repositories"
|
||||||
|
|||||||
59
lib/puppet/provider/vcsrepo/hg.rb
Normal file
59
lib/puppet/provider/vcsrepo/hg.rb
Normal file
@@ -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
|
Puppet::Type.type(:vcsrepo).provide(:svn, :parent => Puppet::Provider::Vcsrepo) do
|
||||||
desc "Supports Subversion repositories"
|
desc "Supports Subversion repositories"
|
||||||
|
|||||||
6
spec/fixtures/hg_parents.txt
vendored
Normal file
6
spec/fixtures/hg_parents.txt
vendored
Normal file
@@ -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
|
||||||
96
spec/unit/puppet/provider/vcsrepo/hg_spec.rb
Normal file
96
spec/unit/puppet/provider/vcsrepo/hg_spec.rb
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user