dtk-common 0.5.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +5 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +16 -0
  5. data/LICENSE +674 -0
  6. data/README.md +36 -0
  7. data/dtk-common.gemspec +23 -0
  8. data/lib/common_patch.rb +16 -0
  9. data/lib/dsl/directory_parser/git.rb +39 -0
  10. data/lib/dsl/directory_parser/linux.rb +21 -0
  11. data/lib/dsl/directory_parser.rb +77 -0
  12. data/lib/dsl/file_parser/file_types/assembly/v2/assembly.rb +53 -0
  13. data/lib/dsl/file_parser/file_types/component_module_refs/v1/component_module_refs.rb +57 -0
  14. data/lib/dsl/file_parser.rb +228 -0
  15. data/lib/dsl.rb +23 -0
  16. data/lib/dtk-common/version.rb +3 -0
  17. data/lib/dtk_common.rb +36 -0
  18. data/lib/dynamic_loader.rb +28 -0
  19. data/lib/git_repo/adapters/rugged/blob.rb +14 -0
  20. data/lib/git_repo/adapters/rugged/commit.rb +14 -0
  21. data/lib/git_repo/adapters/rugged/common.rb +34 -0
  22. data/lib/git_repo/adapters/rugged/tree.rb +40 -0
  23. data/lib/git_repo/adapters/rugged.rb +45 -0
  24. data/lib/git_repo.rb +93 -0
  25. data/lib/gitolite/configuration.rb +35 -0
  26. data/lib/gitolite/errors.rb +5 -0
  27. data/lib/gitolite/grit/adapter.rb +101 -0
  28. data/lib/gitolite/grit/file_access.rb +51 -0
  29. data/lib/gitolite/init.rb +16 -0
  30. data/lib/gitolite/manager.rb +158 -0
  31. data/lib/gitolite/repo.rb +171 -0
  32. data/lib/gitolite/user_group.rb +98 -0
  33. data/lib/gitolite/utils.rb +59 -0
  34. data/lib/grit_adapter/file_access/diff.rb +82 -0
  35. data/lib/grit_adapter/file_access/status.rb +25 -0
  36. data/lib/grit_adapter/file_access.rb +296 -0
  37. data/lib/grit_adapter/object_access.rb +39 -0
  38. data/lib/grit_adapter.rb +212 -0
  39. data/lib/module_version.rb +12 -0
  40. data/lib/require_first.rb +18 -0
  41. data/rich_tests/README.md +1 -0
  42. data/rich_tests/dsl_test1.rb +14 -0
  43. data/rich_tests/dsl_test2.rb +10 -0
  44. data/rich_tests/dsl_test3.rb +17 -0
  45. data/rich_tests/dsl_test4.rb +25 -0
  46. data/rich_tests/fixtures/dsl_test1/sm-dtk-bootstrap/global_module_refs.json +2 -0
  47. data/rich_tests/fixtures/dsl_test1/sm-dtk-dtk/global_module_refs.json +7 -0
  48. data/rich_tests/fixtures/dsl_test1/sm-dtk-test_dtk/global_module_refs.json +8 -0
  49. data/rich_tests/fixtures/dsl_test1/sm-dtk-test_postgres/global_module_refs.json +7 -0
  50. data/rich_tests/fixtures/dsl_test1/sm-dtk-test_service/global_module_refs.json +5 -0
  51. data/rich_tests/fixtures/dsl_test1/sm-dtk-testv1/global_module_refs.json +14 -0
  52. data/rich_tests/fixtures/dsl_test1/sm-rich-app/global_module_refs.json +5 -0
  53. data/rich_tests/fixtures/dsl_test1/sm-rich-hdp/global_module_refs.json +3 -0
  54. data/rich_tests/fixtures/dsl_test1/sm-rich-test_dtk/global_module_refs.json +5 -0
  55. data/rich_tests/fixtures/dsl_test2/sm-dtk-dtk/assemblies/message_bus/assembly.json +23 -0
  56. data/rich_tests/fixtures/dsl_test2/sm-dtk-dtk/assemblies/repo_manager/assembly.json +26 -0
  57. data/rich_tests/fixtures/dsl_test2/sm-dtk-dtk/assemblies/server-nginx/assembly.json +64 -0
  58. data/rich_tests/fixtures/dsl_test2/sm-dtk-dtk/assemblies/server-on-one-node/assembly.json +47 -0
  59. data/rich_tests/fixtures/dsl_test2/sm-dtk-dtk/assemblies/t4/assembly.json +20 -0
  60. data/rich_tests/fixtures/dsl_test2/sm-dtk-dtk/global_module_refs.json +7 -0
  61. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/HEAD +1 -0
  62. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/config +4 -0
  63. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/description +1 -0
  64. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/hooks/applypatch-msg.sample +15 -0
  65. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/hooks/commit-msg.sample +24 -0
  66. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/hooks/post-update.sample +8 -0
  67. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/hooks/pre-applypatch.sample +14 -0
  68. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/hooks/pre-commit.sample +50 -0
  69. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/hooks/pre-rebase.sample +169 -0
  70. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/hooks/prepare-commit-msg.sample +36 -0
  71. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/hooks/update.sample +128 -0
  72. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/info/exclude +6 -0
  73. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/0a/5b6255a87c9e56d91557398aee730a2b3de745 +0 -0
  74. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/15/e78d7675db51c3f9e2cf154a350d82b12abc72 +0 -0
  75. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/18/7c41cd47b9c295da0cee128c888c95cf2bba1c +0 -0
  76. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/2a/17fb5b22b8108790435eb215ffe9d06829b841 +0 -0
  77. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/2e/8c9f8472cb0e9e2421e8b5c86ad981b728cdcf +0 -0
  78. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/3b/4646ef81ef99c0c7aa62c0a97e774761c7de54 +0 -0
  79. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/5c/498a06b1ef830203e4e04c1043c9d846a18a98 +0 -0
  80. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/72/b3afc0c009e42faa235784f29f43e336bceebd +0 -0
  81. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/78/2987dc58fb1f3bea00452b8727957115b51d6f +0 -0
  82. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/9b/7c5e8096a3a871c76ad179bc29c33ac5390683 +0 -0
  83. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/a5/b61c6608349cd87f3d53a13abc2d2f51772082 +0 -0
  84. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/b4/1fb4f136d54fc9277ff16d58d9361a03a91b23 +0 -0
  85. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/be/81c8c44a92dde5139fdd302d75eec027032c8b +0 -0
  86. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/objects/c3/88fbdcfe33840280aa119df6d01a782fdbdd60 +1 -0
  87. data/rich_tests/fixtures/dsl_test4/sm-dtk-dtk.git/refs/heads/master +1 -0
  88. data/rich_tests/fixtures/rugged_test1/repo1.git/HEAD +1 -0
  89. data/rich_tests/fixtures/rugged_test1/repo1.git/config +4 -0
  90. data/rich_tests/fixtures/rugged_test1/repo1.git/description +1 -0
  91. data/rich_tests/fixtures/rugged_test1/repo1.git/hooks/applypatch-msg.sample +15 -0
  92. data/rich_tests/fixtures/rugged_test1/repo1.git/hooks/commit-msg.sample +24 -0
  93. data/rich_tests/fixtures/rugged_test1/repo1.git/hooks/post-update.sample +8 -0
  94. data/rich_tests/fixtures/rugged_test1/repo1.git/hooks/pre-applypatch.sample +14 -0
  95. data/rich_tests/fixtures/rugged_test1/repo1.git/hooks/pre-commit.sample +50 -0
  96. data/rich_tests/fixtures/rugged_test1/repo1.git/hooks/pre-rebase.sample +169 -0
  97. data/rich_tests/fixtures/rugged_test1/repo1.git/hooks/prepare-commit-msg.sample +36 -0
  98. data/rich_tests/fixtures/rugged_test1/repo1.git/hooks/update.sample +128 -0
  99. data/rich_tests/fixtures/rugged_test1/repo1.git/info/exclude +6 -0
  100. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/01/7d2a92efdefb513c266496c836112112c84b54 +0 -0
  101. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/0c/6675dac950c9f2038c899a0026c60bc71b1986 +0 -0
  102. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/12/7d8deca9a49974f887c594fc79804a2490c3c5 +0 -0
  103. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/21/c65148298b7366019013c31ddc9e6c62770277 +0 -0
  104. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/22/2c738a4abaebbd9ea3b6634fac902ae74479c4 +0 -0
  105. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/25/560ef0476ffda4abf20b660955aac645b6ee2f +0 -0
  106. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/4a/e421568785273757fe479236de426b80d1b658 +2 -0
  107. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/60/465cb06c0cde161eff264d4c2a0535fc1e8bb2 +0 -0
  108. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/63/7f0347d31dad180d6fc7f6720c187b05a8754c +0 -0
  109. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/6c/54ab6443f1a24669a99f2ce1b43863be2e9fda +0 -0
  110. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/82/c75b6fa64b746bd7f9cd7afe3c1e5bd53c430c +0 -0
  111. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/86/ec2616845245b9c9355f768a1727bcdfb643ac +0 -0
  112. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/93/ee8545d8f9681db9800cb11ec8aa72a8df8bd1 +0 -0
  113. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/bc/65ddb77fef699933dfe16b79c769f7a9cc0afd +0 -0
  114. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/d4/b1ee93110d823c5161f8cb954a6cf2e41345c1 +2 -0
  115. data/rich_tests/fixtures/rugged_test1/repo1.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4 +0 -0
  116. data/rich_tests/fixtures/rugged_test1/repo1.git/refs/heads/branch1 +1 -0
  117. data/rich_tests/fixtures/rugged_test1/repo1.git/refs/heads/master +1 -0
  118. data/rich_tests/rugged_test1.rb +16 -0
  119. data/test.rb +13 -0
  120. metadata +205 -0
@@ -0,0 +1,34 @@
1
+ module DtkCommon
2
+ class GitRepo::Adapter::Rugged
3
+ class Branch
4
+ attr_reader :rugged_repo,:branch
5
+ def initialize(rugged_repo,branch)
6
+ @rugged_repo = rugged_repo
7
+ @branch = branch
8
+ end
9
+ end
10
+
11
+ module CommonMixin
12
+ private
13
+ def branch()
14
+ @repo_branch.branch()
15
+ end
16
+ def rugged_repo()
17
+ @repo_branch.rugged_repo()
18
+ end
19
+
20
+ def lookup(sha)
21
+ rugged_repo().lookup(sha)
22
+ end
23
+ end
24
+
25
+ class Obj
26
+ include CommonMixin
27
+
28
+ def initialize(repo_branch)
29
+ @repo_branch = repo_branch
30
+ end
31
+ end
32
+ end
33
+ end
34
+
@@ -0,0 +1,40 @@
1
+ module DtkCommon
2
+ class GitRepo::Adapter::Rugged
3
+ class Tree < Obj
4
+ def initialize(repo_branch,rugged_tree)
5
+ super(repo_branch)
6
+ @rugged_tree = rugged_tree
7
+ end
8
+
9
+ def get_file_content(path)
10
+ if blob = get_blob(path)
11
+ blob.content
12
+ end
13
+ end
14
+
15
+ def list_files()
16
+ ret = Array.new
17
+ @rugged_tree.walk_blobs do |root,entry|
18
+ ret << "#{root}#{entry[:name]}"
19
+ end
20
+ ret
21
+ end
22
+
23
+ private
24
+ def get_blob(path)
25
+ ret = nil
26
+ dir = ""; file_part = path
27
+ if path =~ /(.+\/)([^\/]+$)/
28
+ dir = $1; file_part = $2
29
+ end
30
+ @rugged_tree.walk_blobs do |root,entry|
31
+ if root == dir and entry[:name] == file_part
32
+ return Blob.new(@repo_branch,entry)
33
+ end
34
+ end
35
+ ret
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,45 @@
1
+ require File.expand_path('../../git_repo.rb',File.dirname(__FILE__))
2
+ require 'rugged'
3
+ module DtkCommon
4
+ class GitRepo; class Adapter
5
+ class Rugged
6
+ require File.expand_path('rugged/common',File.dirname(__FILE__))
7
+ require File.expand_path('rugged/commit',File.dirname(__FILE__))
8
+ require File.expand_path('rugged/tree',File.dirname(__FILE__))
9
+ require File.expand_path('rugged/blob',File.dirname(__FILE__))
10
+ include CommonMixin
11
+
12
+ def initialize(repo_path,branch=nil)
13
+ if branch.nil?
14
+ raise Error.new("Not implemented yet creating Rugged adapter w/o a branch")
15
+ end
16
+ @repo_branch = Branch.new(::Rugged::Repository.new(repo_path),branch)
17
+ end
18
+
19
+ def get_file_content(path)
20
+ get_tree().get_file_content(path)
21
+ end
22
+
23
+ def list_files()
24
+ get_tree().list_files()
25
+ end
26
+
27
+ private
28
+ def get_tree()
29
+ get_commit().tree()
30
+ end
31
+
32
+ def get_commit()
33
+ if rugged_ref = rugged_repo().refs.find {|ref|ref.name == "refs/heads/#{branch}"}
34
+ Commit.new(@repo_branch,lookup(rugged_ref.target))
35
+ else
36
+ raise ErrorUsage.new("Branch (#{branch} not found in repo (#{pp_repo()})")
37
+ end
38
+ end
39
+
40
+ def pp_repo()
41
+ rugged_repo().path()
42
+ end
43
+ end
44
+ end; end
45
+ end
data/lib/git_repo.rb ADDED
@@ -0,0 +1,93 @@
1
+ require File.expand_path('common_patch',File.dirname(__FILE__))
2
+ require File.expand_path('dynamic_loader',File.dirname(__FILE__))
3
+ #TODO: this will eventually replace the grit_adapter classes
4
+ module DtkCommon
5
+ class GitRepo
6
+ class Adapter
7
+ end
8
+
9
+ def initialize(repo_path)
10
+ @repo_path = repo_path
11
+ @adapters = Hash.new
12
+ end
13
+
14
+ class Branch < self
15
+ def initialize(repo_path,branch='master')
16
+ super(repo_path)
17
+ @branch = branch
18
+ end
19
+ private
20
+ def adapter_initialize_args()
21
+ [@repo_path,@branch]
22
+ end
23
+ end
24
+
25
+ def method_missing(method_name,*args,&block)
26
+ if adapter_name = self.class.find_adapter_name(method_name)
27
+
28
+ adapter = (@adapters[adapter_name] ||= Hash.new)[branch_index()] ||= self.class.load_and_return_adapter_class(adapter_name).new(*adapter_initialize_args())
29
+ execution_wrapper do
30
+ adapter.send(method_name,*args,&block)
31
+ end
32
+ else
33
+ super
34
+ end
35
+ end
36
+
37
+ def respond_to?(method_name)
38
+ super(method_name) or self.class.find_adapter_name(method_name)
39
+ end
40
+
41
+ def self.implements_method?(method_name)
42
+ !!find_adapter_name(method_name)
43
+ end
44
+
45
+ private
46
+ def adapter_initialize_args()
47
+ [@repo_path]
48
+ end
49
+
50
+ def branch_index()
51
+ @branch||"---NONE"
52
+ end
53
+
54
+ def execution_wrapper(&block)
55
+ begin
56
+ yield
57
+ rescue => e
58
+ Log.error(([e.to_s]+e.backtrace).join("\n"))
59
+ error = (e.kind_of?(::DtkCommon::Error) ? e : ::DtkCommon::Error.new(e.to_s))
60
+ raise error
61
+ end
62
+ end
63
+
64
+ def self.load_and_return_adapter_class(adapter_name)
65
+ (@adapter_classes ||= Hash.new)[adapter_name] ||= DynmamicLoader.load_and_return_adapter_class(:git_repo,adapter_name,:base_class => Adapter)
66
+ end
67
+
68
+ def self.find_adapter_name(method_name)
69
+ @adapter_names ||= Hash.new
70
+ return @adapter_names[method_name] if @adapter_names.has_key?(method_name)
71
+ ret = Array(AdaptersForMethods[method_name]||[]).find do |adapter_name|
72
+ condition = AdapterConditions[adapter_name]
73
+ condition.nil? or condition.call()
74
+ end
75
+ @adapter_names[method_name] = ret
76
+ end
77
+
78
+ #for each hash value form is scalar or array of adapters to try in order
79
+ AdaptersForMethods = {
80
+ :get_file_content => :rugged,
81
+ :list_files => :rugged
82
+ }
83
+
84
+ AdapterConditions = {
85
+ # TODO: too restrictive; wil delete
86
+ # :rugged => proc{!::Gem::Specification::find_all_by_name('rugged',::Gem::Requirement.new(NailedRuggedVersion)).empty?}
87
+ }
88
+ end
89
+ end
90
+
91
+
92
+
93
+
@@ -0,0 +1,35 @@
1
+ module Gitolite
2
+ class Configuration
3
+
4
+ attr_reader :repositories_path, :user_group_path, :keydir_path, :home_dir
5
+
6
+ def initialize(
7
+ repo_path_ = 'conf/repo-configs',
8
+ user_group_path_ = 'conf/group-defs',
9
+ keydir_path_ = 'keydir',
10
+ home_dir_ = nil
11
+ )
12
+
13
+ @repositories_path = repo_path_
14
+ @user_group_path = user_group_path_
15
+ @keydir_path = keydir_path_
16
+ @home_dir = home_dir_
17
+ end
18
+
19
+ def user_key_path(username)
20
+ "#{@keydir_path}/#{username}.pub"
21
+ end
22
+
23
+ def user_group_path(group_name)
24
+ "#{@user_group_path}/#{group_name}.conf"
25
+ end
26
+
27
+ def repo_path(repo_name)
28
+ "#{@repositories_path}/#{repo_name}.conf"
29
+ end
30
+
31
+ def bare_repo_path(repo_name)
32
+ "#{@home_dir}/repositories/#{repo_name}.git"
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ module Gitolite
2
+ class Duplicate < StandardError; end
3
+ class NotFound < StandardError; end
4
+ class ParseError < StandardError; end
5
+ end
@@ -0,0 +1,101 @@
1
+ require 'grit'
2
+
3
+ module Gitolite
4
+ module Git
5
+ class Adapter
6
+
7
+ DEFAULT_BRANCH = 'master'
8
+
9
+ def initialize(repo_dir,branch='master')
10
+ @repo_dir = repo_dir
11
+ @branch = branch
12
+ @grit_repo = nil
13
+ begin
14
+ @grit_repo = ::Grit::Repo.new(repo_dir)
15
+ rescue ::Grit::NoSuchPathError
16
+ repo_name = repo_dir.split("/").last.gsub("\.git","")
17
+ #TODO: change to usage error
18
+ raise Error::NotFound, "Repo (#{repo_name}) - path '#{repo_dir}' does not exist"
19
+ rescue => e
20
+ raise e
21
+ end
22
+ end
23
+
24
+ def branches()
25
+ @grit_repo.branches.map{|h|h.name}
26
+ end
27
+
28
+ def ls_r(depth=nil,opts={})
29
+ tree_contents = tree.contents
30
+ ls_r_aux(depth,tree_contents,opts)
31
+ end
32
+
33
+ def path_exists?(path)
34
+ not (tree/path).nil?
35
+ end
36
+
37
+ def file_content(path)
38
+ tree_or_blob = tree/path
39
+ tree_or_blob && tree_or_blob.kind_of?(::Grit::Blob) && tree_or_blob.data
40
+ end
41
+
42
+ def push()
43
+ Git_command__push_mutex.synchronize do
44
+ git_command(:push,"origin", "#{@branch}:refs/heads/#{@branch}")
45
+ end
46
+ end
47
+
48
+ def push_to_mirror_repo(mirror_repo)
49
+ git_command(:push,"--mirror",mirror_repo)
50
+ end
51
+
52
+ Git_command__push_mutex = Mutex.new
53
+
54
+ def pull()
55
+ git_command(:pull,"origin",@branch)
56
+ end
57
+
58
+ private
59
+ def tree()
60
+ @grit_repo.tree(@branch)
61
+ end
62
+
63
+ def ls_r_aux(depth,tree_contents,opts={})
64
+ ret = Array.new
65
+ return ret if tree_contents.empty?
66
+ if depth == 1
67
+ ret = tree_contents.map do |tc|
68
+ if opts[:file_only]
69
+ tc.kind_of?(::Grit::Blob) && tc.name
70
+ elsif opts[:directory_only]
71
+ tc.kind_of?(::Grit::Tree) && tc.name
72
+ else
73
+ tc.name
74
+ end
75
+ end.compact
76
+ return ret
77
+ end
78
+
79
+ tree_contents.each do |tc|
80
+ if tc.kind_of?(::Grit::Blob)
81
+ unless opts[:directory_only]
82
+ ret << tc.name
83
+ end
84
+ else
85
+ dir_name = tc.name
86
+ ret += ls_r_aux(depth && depth-1,tc.contents).map{|r|"#{dir_name}/#{r}"}
87
+ end
88
+ end
89
+ ret
90
+ end
91
+
92
+ def git_command(cmd,*args)
93
+ @grit_repo.git.send(cmd, cmd_opts(),*args)
94
+ end
95
+ def cmd_opts()
96
+ {:raise => true, :timeout => 60}
97
+ end
98
+
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,51 @@
1
+ module Gitolite
2
+ module Git
3
+ class FileAccess < Adapter
4
+
5
+ def add_file(file_rel_path,content)
6
+ content ||= String.new
7
+ file_path = qualified_path(file_rel_path)
8
+ chdir_and_checkout do
9
+ File.open(file_path,"w"){|f|f << content}
10
+ git_command(:add,file_path)
11
+ end
12
+ end
13
+
14
+ def remove_file(file_rel_path)
15
+ file_path = qualified_path(file_rel_path)
16
+ chdir_and_checkout do
17
+ if File.file?(file_path)
18
+ git_command(:rm,file_path)
19
+ end
20
+ end
21
+ end
22
+
23
+ def commit(commit_msg)
24
+ #TODO is chdir_and_checkout needed
25
+ chdir_and_checkout do
26
+ @grit_repo.commit_index(commit_msg)
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def qualified_path(file_rel_path)
33
+ "#{@repo_dir}/#{file_rel_path}"
34
+ end
35
+
36
+ def chdir_and_checkout(branch=nil,&block)
37
+ branch ||= @branch
38
+ Dir.chdir(@repo_dir) do
39
+ current_head = @grit_repo.head.name
40
+ git_command(:checkout,branch) unless current_head == branch
41
+ return unless block
42
+ yield
43
+ unless current_head == branch
44
+ git_command(:checkout,current_head)
45
+ end
46
+ end
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,16 @@
1
+ # use to require all needed files needed for running dtk-common gitolite lib
2
+ require 'grit'; require 'erubis'
3
+
4
+ Grit.debug = true
5
+
6
+
7
+ require File.expand_path('manager.rb', File.dirname(__FILE__))
8
+ require File.expand_path('configuration.rb', File.dirname(__FILE__))
9
+ require File.expand_path('errors.rb', File.dirname(__FILE__))
10
+
11
+ require File.expand_path('grit/adapter.rb', File.dirname(__FILE__))
12
+ require File.expand_path('grit/file_access.rb', File.dirname(__FILE__))
13
+
14
+ require File.expand_path('utils.rb', File.dirname(__FILE__))
15
+ require File.expand_path('repo.rb', File.dirname(__FILE__))
16
+ require File.expand_path('user_group.rb', File.dirname(__FILE__))
@@ -0,0 +1,158 @@
1
+
2
+ require 'fileutils'
3
+
4
+ module Gitolite
5
+ class Manager
6
+
7
+ attr_accessor :repos, :user_groups, :configuration, :logger, :commit_messages
8
+ attr_reader :gitolite_path
9
+
10
+ def initialize(gitolite_path, override_configuration = nil)
11
+ @repos, @user_groups, @commit_messages = [], [], []
12
+ @gitolite_path = gitolite_path
13
+ @configuration = override_configuration || Configuration.new
14
+ @logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT)
15
+ end
16
+
17
+ def open_repo(repo_name)
18
+ repo_conf = Repo.new(repo_name, @configuration, @logger, @gitolite_path)
19
+ @repos << repo_conf
20
+ repo_conf
21
+ end
22
+
23
+ def delete_repo(repo_name)
24
+ file_path = @configuration.repo_path(repo_name)
25
+ remove_file(file_path, "Deleting repo (#{repo_name}) from gitolite.")
26
+
27
+ bare_repo_path = @configuration.bare_repo_path(repo_name)
28
+ if File.directory?(bare_repo_path)
29
+ FileUtils.rm_rf bare_repo_path
30
+ end
31
+ repo_name
32
+ end
33
+
34
+ def open_group(group_name)
35
+ group_conf = UserGroup.new(group_name, @logger, @gitolite_path)
36
+ @user_groups << group_conf
37
+ group_conf
38
+ end
39
+
40
+ def create_user(username, rsa_pub_key, opts={})
41
+ key_path = @configuration.user_key_path(username)
42
+
43
+ if users_public_keys().include?(key_path)
44
+ raise ::Gitolite::Duplicate, "Trying to create a user (#{username}) that exists already on gitolite server"
45
+ end
46
+
47
+ add_commit_file(key_path,rsa_pub_key, "Added RSA public key for user '#{username}'")
48
+
49
+ key_path
50
+ end
51
+
52
+ def delete_user(username)
53
+ key_path = @configuration.user_key_path(username)
54
+
55
+ unless users_public_keys().include?(key_path)
56
+ raise ::Gitolite::NotFound, "User (#{username}) not found on gitolite server"
57
+ end
58
+
59
+ remove_file(key_path, "Removing RSA public key for user '#{username}'")
60
+ username
61
+ end
62
+
63
+ def remove_user_group(group_name)
64
+ group_path = @configuration.user_group_path(group_name)
65
+
66
+ unless user_group_list.include?(group_path)
67
+ raise ::Gitolite::NotFound, "User group (#{group_name}) not found on gitolite server"
68
+ end
69
+
70
+ remove_file(key_path, "Removing user group (#{group_name})")
71
+ group_name
72
+ end
73
+
74
+ def delete_user_group(group_name)
75
+ path = @configuration.user_group_path(group_name)
76
+ remove_file(path, "Remove user group (#{group_name}) from gitolite.")
77
+ group_name
78
+ end
79
+
80
+ def list_repos()
81
+ repo_names = repo_names_list()
82
+ repo_names.map { |repo_name| { :repo_name => repo_name, :type => Repo.get_repo_type(repo_name) }}
83
+ end
84
+
85
+ def push()
86
+ changed_repos = @repos.select { |repo| repo.any_changes? }
87
+ changed_groups = @user_groups.select { |ug| ug.any_changes? }
88
+
89
+ unless (@commit_messages.empty? && changed_repos.empty? && changed_groups.empty?)
90
+ changed_repos.each { |repo| repo.commit_changes }
91
+ changed_groups.each { |ug| ug.commit_changes }
92
+
93
+ gitolite_admin_repo().push()
94
+ end
95
+ end
96
+
97
+ private
98
+
99
+ def gitolite_admin_repo()
100
+ @gitolite_admin ||= Git::FileAccess.new(@gitolite_path)
101
+ end
102
+
103
+ def users_public_keys()
104
+ base_path = @configuration.keydir_path
105
+ list_files_in_path(base_path)
106
+ end
107
+
108
+ def user_group_list()
109
+ base_path = @configuration.user_group_path
110
+ list_files_in_path(base_path)
111
+ end
112
+
113
+ def repo_names_list()
114
+ base_path = @configuration.repo_path
115
+ repo_file_list = list_files_in_path(base_path)
116
+ repo_file_list.collect { |r_file_name| extract_file_name(r_file_name, base_path, :conf) }
117
+ end
118
+
119
+ def add_commit_file(file, content, commit_msg)
120
+ gitolite_admin_repo().add_file(file, content)
121
+ gitolite_admin_repo().commit(commit_msg)
122
+ @commit_messages << commit_msg
123
+ end
124
+
125
+ def remove_file(file_path, commit_msg)
126
+ gitolite_admin_repo().remove_file(file_path)
127
+ gitolite_admin_repo().commit(commit_msg)
128
+ @commit_messages << commit_msg
129
+ end
130
+
131
+
132
+ class << self
133
+
134
+ def repo_name_from_file_name(file_name, repo_file_path)
135
+ if file_name =~ Regexp.new("^#{repo_file_path}/(.+)\.conf")
136
+ $1
137
+ else
138
+ raise Error.new("File name not properly formed for repo config file name (#{file_name})")
139
+ end
140
+ end
141
+ end
142
+
143
+ def extract_file_name(full_path_name, file_path, file_extension)
144
+ if file_name =~ Regexp.new("^#{full_path_name}/(.+)\.#{file_extension}")
145
+ $1
146
+ else
147
+ raise ::Gitolite::ParseError.new("File name not properly formed (#{full_path_name}), expected match based on '#{file_path}/*.#{file_extension}'")
148
+ end
149
+ end
150
+
151
+ def list_files_in_path(path)
152
+ paths = gitolite_admin_repo.ls_r(path.split("/").size + 1, :files_only => true)
153
+ match_regexp = Regexp.new("^#{path}")
154
+ paths.select{ |p| p =~ match_regexp }
155
+ end
156
+
157
+ end
158
+ end