Basic Bazaar support
authorBruce Williams <bruce@codefluency.com>
Sun, 14 Mar 2010 09:03:21 +0000 (01:03 -0800)
committerBruce Williams <bruce@codefluency.com>
Sun, 14 Mar 2010 09:03:21 +0000 (01:03 -0800)
lib/puppet/provider/vcsrepo/bzr.rb [new file with mode: 0644]
spec/fixtures/bzr_version_info.txt [new file with mode: 0644]
spec/unit/puppet/provider/vcsrepo/bzr_spec.rb [new file with mode: 0644]

diff --git a/lib/puppet/provider/vcsrepo/bzr.rb b/lib/puppet/provider/vcsrepo/bzr.rb
new file mode 100644 (file)
index 0000000..a6e12cd
--- /dev/null
@@ -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
diff --git a/spec/fixtures/bzr_version_info.txt b/spec/fixtures/bzr_version_info.txt
new file mode 100644 (file)
index 0000000..88a56a1
--- /dev/null
@@ -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
diff --git a/spec/unit/puppet/provider/vcsrepo/bzr_spec.rb b/spec/unit/puppet/provider/vcsrepo/bzr_spec.rb
new file mode 100644 (file)
index 0000000..d39b858
--- /dev/null
@@ -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