Add the ability to specify a git remote
Rather than fill the git provider with hard-coded references to origin, it would be better to abstract out which remote the resource is fetching from. But since this is only relevant to decentralized version-control systems, a multiple_remotes feature was added for the parameter to depend on. So far this is only implemented for git remotes, but it could be implemented for other VCSs as well.
This commit is contained in:
parent
462b1d69bb
commit
dce22cfd2d
|
@ -6,7 +6,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
|
|||
##TODO modify the commands below so that the su - is included
|
||||
optional_commands :git => 'git'
|
||||
defaultfor :git => :exists
|
||||
has_features :bare_repositories, :reference_tracking, :ssh_identity
|
||||
has_features :bare_repositories, :reference_tracking, :ssh_identity, :multiple_remotes
|
||||
|
||||
def create
|
||||
if !@resource.value(:source)
|
||||
|
@ -40,11 +40,11 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
|
|||
def latest
|
||||
branch = on_branch?
|
||||
if branch == 'master'
|
||||
return get_revision('origin/HEAD')
|
||||
return get_revision("#{@resource.value(:remote)}/HEAD")
|
||||
elsif branch == '(no branch)'
|
||||
return get_revision('HEAD')
|
||||
else
|
||||
return get_revision('origin/%s' % branch)
|
||||
return get_revision("#{@resource.value(:remote)}/%s" % branch)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -73,7 +73,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
|
|||
# authoritative.
|
||||
# might be worthwhile to have an allow_local_changes param to decide
|
||||
# whether to reset or pull when we're ensuring latest.
|
||||
at_path { git_with_identity('reset', '--hard', "origin/#{desired}") }
|
||||
at_path { git_with_identity('reset', '--hard', "#{@resource.value(:remote)}/#{desired}") }
|
||||
end
|
||||
if @resource.value(:ensure) != :bare
|
||||
update_submodules
|
||||
|
@ -95,7 +95,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
|
|||
|
||||
def update_references
|
||||
at_path do
|
||||
git_with_identity('fetch', '--tags', 'origin')
|
||||
git_with_identity('fetch', '--tags', @resource.value(:remote))
|
||||
update_owner_and_excludes
|
||||
end
|
||||
end
|
||||
|
@ -190,7 +190,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
|
|||
|
||||
def checkout(revision = @resource.value(:revision))
|
||||
if !local_branch_revision? && remote_branch_revision?
|
||||
at_path { git_with_identity('checkout', '-b', revision, '--track', "origin/#{revision}") }
|
||||
at_path { git_with_identity('checkout', '-b', revision, '--track', "#{@resource.value(:remote)}/#{revision}") }
|
||||
else
|
||||
at_path { git_with_identity('checkout', '--force', revision) }
|
||||
end
|
||||
|
@ -212,9 +212,9 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
|
|||
end
|
||||
|
||||
def remote_branch_revision?(revision = @resource.value(:revision))
|
||||
# git < 1.6 returns 'origin/#{revision}'
|
||||
# git 1.6+ returns 'remotes/origin/#{revision}'
|
||||
branch = at_path { branches.grep /(remotes\/)?origin\/#{revision}/ }
|
||||
# git < 1.6 returns '#{@resource.value(:remote)}/#{revision}'
|
||||
# git 1.6+ returns 'remotes/#{@resource.value(:remote)}/#{revision}'
|
||||
branch = at_path { branches.grep /(remotes\/)?#{@resource.value(:remote)}\/#{revision}/ }
|
||||
if branch.length > 0
|
||||
return branch
|
||||
end
|
||||
|
@ -249,15 +249,15 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
|
|||
create
|
||||
end
|
||||
at_path do
|
||||
git_with_identity('fetch', 'origin')
|
||||
git_with_identity('fetch', '--tags', 'origin')
|
||||
git_with_identity('fetch', @resource.value(:remote))
|
||||
git_with_identity('fetch', '--tags', @resource.value(:remote))
|
||||
end
|
||||
current = at_path { git_with_identity('rev-parse', rev).strip }
|
||||
if @resource.value(:revision)
|
||||
if local_branch_revision?
|
||||
canonical = at_path { git_with_identity('rev-parse', @resource.value(:revision)).strip }
|
||||
elsif remote_branch_revision?
|
||||
canonical = at_path { git_with_identity('rev-parse', 'origin/' + @resource.value(:revision)).strip }
|
||||
canonical = at_path { git_with_identity('rev-parse', "#{@resource.value(:remote)}/" + @resource.value(:revision)).strip }
|
||||
end
|
||||
current = @resource.value(:revision) if current == canonical
|
||||
end
|
||||
|
|
|
@ -25,6 +25,9 @@ Puppet::Type.newtype(:vcsrepo) do
|
|||
feature :modules,
|
||||
"The repository contains modules that can be chosen of"
|
||||
|
||||
feature :multiple_remotes,
|
||||
"The repository tracks multiple remote repositories"
|
||||
|
||||
ensurable do
|
||||
attr_accessor :latest
|
||||
|
||||
|
@ -89,7 +92,7 @@ Puppet::Type.newtype(:vcsrepo) do
|
|||
|
||||
end
|
||||
|
||||
newparam(:path) do
|
||||
newparam :path do
|
||||
desc "Absolute path to repository"
|
||||
isnamevar
|
||||
validate do |value|
|
||||
|
@ -100,32 +103,32 @@ Puppet::Type.newtype(:vcsrepo) do
|
|||
end
|
||||
end
|
||||
|
||||
newparam(:source) do
|
||||
newparam :source do
|
||||
desc "The source URI for the repository"
|
||||
end
|
||||
|
||||
newparam(:fstype, :required_features => [:filesystem_types]) do
|
||||
newparam :fstype, :required_features => [:filesystem_types] do
|
||||
desc "Filesystem type"
|
||||
end
|
||||
|
||||
newproperty(:revision) do
|
||||
newproperty :revision do
|
||||
desc "The revision of the repository"
|
||||
newvalue(/^\S+$/)
|
||||
end
|
||||
|
||||
newparam(:owner) do
|
||||
newparam :owner do
|
||||
desc "The user/uid that owns the repository files"
|
||||
end
|
||||
|
||||
newparam(:group) do
|
||||
newparam :group do
|
||||
desc "The group/gid that owns the repository files"
|
||||
end
|
||||
|
||||
newparam(:excludes) do
|
||||
newparam :excludes do
|
||||
desc "Files to be excluded from the repository"
|
||||
end
|
||||
|
||||
newparam(:force) do
|
||||
newparam :force do
|
||||
desc "Force repository creation, destroying any files on the path in the process."
|
||||
newvalues(:true, :false)
|
||||
defaultto false
|
||||
|
@ -155,4 +158,10 @@ Puppet::Type.newtype(:vcsrepo) do
|
|||
newparam :module, :required_features => [:modules] do
|
||||
desc "The repository module to manage"
|
||||
end
|
||||
|
||||
newparam :remote, :required_features => [:multiple_remotes] do
|
||||
desc "The remote repository to track"
|
||||
defaultto "origin"
|
||||
end
|
||||
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue