Basic Bazaar support
This commit is contained in:
		
							
								
								
									
										63
									
								
								lib/puppet/provider/vcsrepo/bzr.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								lib/puppet/provider/vcsrepo/bzr.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					require File.join(File.dirname(__FILE__), '..', 'vcsrepo')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Puppet::Type.type(:vcsrepo).provide(:bzr, :parent => Puppet::Provider::Vcsrepo) do
 | 
				
			||||||
 | 
					  desc "Supports Bazaar repositories"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  commands   :bzr => 'bzr'
 | 
				
			||||||
 | 
					  defaultfor :bzr => :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), '.bzr'))
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def destroy
 | 
				
			||||||
 | 
					    FileUtils.rm_rf(@resource.value(:path))
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  def revision
 | 
				
			||||||
 | 
					    at_path do
 | 
				
			||||||
 | 
					      current_revid = bzr('version-info')[/^revision-id:\s+(\S+)/, 1]
 | 
				
			||||||
 | 
					      desired = @resource.value(:revision)
 | 
				
			||||||
 | 
					      begin
 | 
				
			||||||
 | 
					        desired_revid = bzr('revision-info', desired).strip.split(/\s+/).last
 | 
				
			||||||
 | 
					      rescue Puppet::ExecutionFailure
 | 
				
			||||||
 | 
					        # Possible revid available during update (but definitely not current)
 | 
				
			||||||
 | 
					        desired_revid = nil
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					      if current_revid == desired_revid
 | 
				
			||||||
 | 
					        desired
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        current_revid
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def revision=(desired)
 | 
				
			||||||
 | 
					    bzr('update', '-r', desired, @resource.value(:path))
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def create_repository(path)
 | 
				
			||||||
 | 
					    bzr('init', path)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def clone_repository(revision)
 | 
				
			||||||
 | 
					    args = ['branch']
 | 
				
			||||||
 | 
					    if revision
 | 
				
			||||||
 | 
					      args.push('-r', revision)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    args.push(@resource.value(:source),
 | 
				
			||||||
 | 
					              @resource.value(:path))
 | 
				
			||||||
 | 
					    bzr(*args)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										5
									
								
								spec/fixtures/bzr_version_info.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								spec/fixtures/bzr_version_info.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					revision-id: menesis@pov.lt-20100309191856-4wmfqzc803fj300x
 | 
				
			||||||
 | 
					date: 2010-03-09 21:18:56 +0200
 | 
				
			||||||
 | 
					build-date: 2010-03-14 00:42:43 -0800
 | 
				
			||||||
 | 
					revno: 2634
 | 
				
			||||||
 | 
					branch-nick: mytest
 | 
				
			||||||
							
								
								
									
										136
									
								
								spec/unit/puppet/provider/vcsrepo/bzr_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								spec/unit/puppet/provider/vcsrepo/bzr_spec.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,136 @@
 | 
				
			|||||||
 | 
					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(:bzr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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/bzr/repo'
 | 
				
			||||||
 | 
					        @resource.expects(:value).with(:source).returns(@source).at_least_once
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					      context "and when a revision is given" do
 | 
				
			||||||
 | 
					        before do
 | 
				
			||||||
 | 
					          @revision = 'somerev'
 | 
				
			||||||
 | 
					          @resource.expects(:value).with(:revision).returns(@revision).at_least_once
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					        it "should execute 'bzr clone -r' with the revision" do
 | 
				
			||||||
 | 
					          @provider.expects(:bzr).with('branch', '-r', @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 'bzr clone' without a revision" do
 | 
				
			||||||
 | 
					          @provider.expects(:bzr).with('branch', @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 'bzr init'" do
 | 
				
			||||||
 | 
					        @provider.expects(:bzr).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, '.bzr'))
 | 
				
			||||||
 | 
					      @provider.exists?
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe "when checking the revision property" do
 | 
				
			||||||
 | 
					    before do
 | 
				
			||||||
 | 
					      @resource.expects(:value).with(:path).returns(@path).at_least_once
 | 
				
			||||||
 | 
					      Dir.expects(:chdir).with(@path).yields
 | 
				
			||||||
 | 
					      @provider.expects(:bzr).with('version-info').returns(fixture(:bzr_version_info))
 | 
				
			||||||
 | 
					      @current_revid = 'menesis@pov.lt-20100309191856-4wmfqzc803fj300x'
 | 
				
			||||||
 | 
					      @current_revno = '2634'
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    context "when given a non-revid as the resource revision" do
 | 
				
			||||||
 | 
					      context "when its revid is not different than the current revid" do
 | 
				
			||||||
 | 
					        before do
 | 
				
			||||||
 | 
					          @revision = @current_revno
 | 
				
			||||||
 | 
					          @resource.expects(:value).with(:revision).returns(@revision).at_least_once
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					        it "should return the ref" do
 | 
				
			||||||
 | 
					          @provider.expects(:bzr).with('revision-info', @revision).returns("#{@current_revno} #{@current_revid}\n")
 | 
				
			||||||
 | 
					          @provider.revision.should == @revision
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					      context "when its revid is different than the current revid" do
 | 
				
			||||||
 | 
					        before do
 | 
				
			||||||
 | 
					          @revision = '2636'
 | 
				
			||||||
 | 
					          @resource.expects(:value).with(:revision).returns(@revision).at_least_once
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					        it "should return the current revid" do
 | 
				
			||||||
 | 
					          @provider.expects(:bzr).with('revision-info', @revision).returns("#{@revision} menesis@pov.lt-20100309191856-4wmfqzc803fj300y\n")
 | 
				
			||||||
 | 
					          @provider.revision.should == @current_revid
 | 
				
			||||||
 | 
					        end          
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    context "when given a revid as the resource revision" do
 | 
				
			||||||
 | 
					      context "when it is the same as the current revid" do
 | 
				
			||||||
 | 
					        before do
 | 
				
			||||||
 | 
					          @revision = @current_revid
 | 
				
			||||||
 | 
					          @resource.expects(:value).with(:revision).returns(@revision).at_least_once
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					        it "should return it" do
 | 
				
			||||||
 | 
					          @provider.expects(:bzr).with('revision-info', @revision).returns("#{@current_revno} #{@current_revid}\n")
 | 
				
			||||||
 | 
					          @provider.revision.should == @revision
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					      context "when it is not the same as the current revid" do
 | 
				
			||||||
 | 
					        before do
 | 
				
			||||||
 | 
					          @revision = 'menesis@pov.lt-20100309191856-4wmfqzc803fj300y'
 | 
				
			||||||
 | 
					          @resource.expects(:value).with(:revision).returns(@revision).at_least_once
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					        it "should return the current revid" do
 | 
				
			||||||
 | 
					          @provider.expects(:bzr).with('revision-info', @revision).returns("2636 #{@revision}\n")
 | 
				
			||||||
 | 
					          @provider.revision.should == @current_revid
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  describe "when setting the revision property" do
 | 
				
			||||||
 | 
					    before do
 | 
				
			||||||
 | 
					      @resource.expects(:value).with(:path).returns(@path).at_least_once
 | 
				
			||||||
 | 
					      @revision = 'somerev'
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					    it "should use 'bzr update -r' with the revision" do
 | 
				
			||||||
 | 
					      @provider.expects('bzr').with('update', '-r', @revision, @path)
 | 
				
			||||||
 | 
					      @provider.revision = @revision
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
		Reference in New Issue
	
	Block a user