gitgolem 0.1.1
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.
- data/.document +5 -0
- data/.yardopts +2 -0
- data/Gemfile +15 -0
- data/LICENSE.txt +20 -0
- data/README.md +190 -0
- data/Rakefile +49 -0
- data/TODO +24 -0
- data/bin/golem +3 -0
- data/bin/golem-shell +4 -0
- data/lib/gitgolem.rb +1 -0
- data/lib/golem.rb +21 -0
- data/lib/golem/access.rb +45 -0
- data/lib/golem/command.rb +107 -0
- data/lib/golem/command/auth.rb +27 -0
- data/lib/golem/command/clear_repositories.rb +16 -0
- data/lib/golem/command/create_repository.rb +20 -0
- data/lib/golem/command/delete_repository.rb +14 -0
- data/lib/golem/command/environment.rb +11 -0
- data/lib/golem/command/save_config.rb +11 -0
- data/lib/golem/command/setup_db.rb +11 -0
- data/lib/golem/command/update_hooks.rb +14 -0
- data/lib/golem/command/update_keys_file.rb +39 -0
- data/lib/golem/config.rb +112 -0
- data/lib/golem/db.rb +46 -0
- data/lib/golem/db/pg.rb +69 -0
- data/lib/golem/db/postgres.sql +19 -0
- data/lib/golem/db/static.rb +66 -0
- data/lib/golem/parser.rb +47 -0
- data/lib/golem/version.rb +13 -0
- data/test/helper.rb +53 -0
- data/test/test_access.rb +31 -0
- data/test/test_config.rb +16 -0
- data/test/test_db.rb +12 -0
- metadata +192 -0
data/lib/golem/parser.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
# Parsing command line options.
|
4
|
+
module Golem::Parser
|
5
|
+
# Parse arguments and run the specified command (or +environment+ if non given).
|
6
|
+
def self.run(args)
|
7
|
+
options = {}
|
8
|
+
::OptionParser.new do |opts|
|
9
|
+
opts.banner = "Usage: golem [options] command [arguments]"
|
10
|
+
opts.separator ""
|
11
|
+
opts.separator "Options:"
|
12
|
+
opts.on("-c", "--config FILE", "path to config file") {|val| options[:cfg_path] = val}
|
13
|
+
opts.on("-d", "--db URL", "database to use (e.g. 'simple' or 'postgres://', etc.)") {|val| options[:db] = val}
|
14
|
+
opts.on("-u", "--user-home PATH", "path to user's home (e.g. the authorized key will be written here)") {|val| options[:user_home] = val}
|
15
|
+
opts.on("-r", "--repositories DIR", "path to repositories (may be relative to user_home)") {|val| options[:repository_dir] = val}
|
16
|
+
opts.on("-b", "--base DIR", "path to base (place of conf, hooks by default)") {|val| options[:base_dir] = val}
|
17
|
+
opts.on("-B", "--bin DIR", "path to executable (defaults to base/bin)") {|val| options[:bin_dir] = val}
|
18
|
+
opts.on("-H", "--hooks DIR", "path to hooks (defaults to base/hooks)") {|val| options[:hooks_dir] = val}
|
19
|
+
opts.on("-h", "--help", "show this message") {puts opts; exit}
|
20
|
+
opts.on("-v", "--verbose", "show output (defaults to false, note: not every command supports it)") {Golem::Parser.verbose = true}
|
21
|
+
opts.separator ""
|
22
|
+
opts.separator "Environment variables (options always take precedence):"
|
23
|
+
opts.separator "\tGOLEM_CONF is used as config file path if exists"
|
24
|
+
opts.separator "\tGOLEM_BASE is used as base dir"
|
25
|
+
opts.separator "\tHOME is used as user-home path"
|
26
|
+
opts.separator ""
|
27
|
+
opts.separator "Commands:"
|
28
|
+
Golem::Command::COMMANDS.each do |cmd|
|
29
|
+
usage = Golem::Command.usage(cmd).split("\n")
|
30
|
+
opts.separator "\tgolem #{cmd.to_s} " + usage.shift
|
31
|
+
opts.separator usage.collect {|l| "\t\t" + l}.join("\n") if usage.length > 0
|
32
|
+
opts.separator "\t\tsynonyms: " + Golem::Command::ALIASES[cmd].join(', ') if Golem::Command::ALIASES.key?(cmd)
|
33
|
+
end
|
34
|
+
end.parse! args
|
35
|
+
Golem::Config.auto_configure(options.delete(:cfg_path)) do
|
36
|
+
options.each do |key, val|
|
37
|
+
send((key.to_s + "=").to_sym, val)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
Golem::Command.run(args.shift || "environment", {:verbose => (@verbose || false)}, *args)
|
41
|
+
end
|
42
|
+
|
43
|
+
# @private
|
44
|
+
def self.verbose=(val) # :nodoc:
|
45
|
+
@verbose = !!val
|
46
|
+
end
|
47
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
|
12
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
13
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
14
|
+
require 'golem'
|
15
|
+
|
16
|
+
class Test::Unit::TestCase
|
17
|
+
class << self; attr_accessor :cfg, :users, :repos, :keys end
|
18
|
+
attr_accessor :cfg, :users, :repos, :keys
|
19
|
+
|
20
|
+
def setup
|
21
|
+
self.cfg = self.class.cfg || {}
|
22
|
+
self.users = self.class.users || []
|
23
|
+
self.repos = self.class.repos || {}
|
24
|
+
self.keys = self.class.keys || {}
|
25
|
+
Golem.configure(cfg) do |cfg|
|
26
|
+
cfg.db = 'static'
|
27
|
+
Golem::DB.setup do |db|
|
28
|
+
users.each {|u| db.add_user u}
|
29
|
+
repos.each {|u, r| (r.is_a?(Array) ? r : [r]).each {|r| db.add_repository r, u}}
|
30
|
+
keys.each {|u, k| (k.is_a?(Array) ? k : [k]).each {|k| db.add_key u, k}}
|
31
|
+
end
|
32
|
+
end if users.length > 0
|
33
|
+
end
|
34
|
+
|
35
|
+
def teardown
|
36
|
+
Golem::Config.instance_variable_set("@vars", nil) #need to reset
|
37
|
+
Golem::DB.instance_variable_set("@db", nil) #need to reset
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class WithTestDb < Test::Unit::TestCase
|
42
|
+
self.users = ["test_user1", "test_user2"]
|
43
|
+
self.repos = {"test_user1" => ["test_repo1", "test_repo2"], "test_user2" => "test_repo3"}
|
44
|
+
self.keys = {"test_user1" => ["test_key1", "test_key2"], "test_user2" => "test_key3"}
|
45
|
+
undef_method :default_test
|
46
|
+
|
47
|
+
def self.inherited(base)
|
48
|
+
base.users = users
|
49
|
+
base.repos = repos
|
50
|
+
base.keys = keys
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
data/test/test_access.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestAccess < WithTestDb
|
4
|
+
def test_access
|
5
|
+
repos.each do |user, repos|
|
6
|
+
(repos.is_a?(Array) ? repos : [repos]).each do |repo|
|
7
|
+
assert Golem::Access.check(user, repo, 'unused'), "access check failed for #{user.to_s}, #{repo.to_s}"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_return_values
|
13
|
+
assert_kind_of Array, Golem::Access.users
|
14
|
+
assert_equal users, Golem::Access.users
|
15
|
+
assert_kind_of Array, Golem::Access.repositories
|
16
|
+
assert_equal repos.values.flatten, Golem::Access.repositories
|
17
|
+
assert_kind_of Hash, Golem::Access.ssh_keys
|
18
|
+
assert_equal keys.inject({}) {|m, (u, k)| m[u] = k.is_a?(Array) ? k : [k]; m}, Golem::Access.ssh_keys
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_convenience_methods
|
22
|
+
assert Golem::Access.read?("receive-pack")
|
23
|
+
assert !Golem::Access.write?("receive-pack")
|
24
|
+
["upload-pack", "upload-archive"].each do |w|
|
25
|
+
assert !Golem::Access.read?(w)
|
26
|
+
assert Golem::Access.write?(w)
|
27
|
+
end
|
28
|
+
assert !Golem::Access.read?("invalid")
|
29
|
+
assert !Golem::Access.write?("invalid")
|
30
|
+
end
|
31
|
+
end
|
data/test/test_config.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestConfig < Test::Unit::TestCase
|
4
|
+
def test_configure
|
5
|
+
assert_nothing_raised do
|
6
|
+
Golem.configure do |cfg|
|
7
|
+
Golem::Config::CFG_VARS.each do |var|
|
8
|
+
cfg.send((var.to_s + "=").to_sym, var)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
Golem::Config::CFG_VARS.each do |var|
|
12
|
+
assert_equal var, Golem::Config.send(var)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/test/test_db.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestDb < WithTestDb
|
4
|
+
def test_static
|
5
|
+
assert_equal users.collect {|u| {:name => u}}, Golem::DB.users
|
6
|
+
assert_equal users, Golem::DB.users(:return => :array)
|
7
|
+
assert_equal repos.collect {|u, r| (r.is_a?(Array) ? r : [r]).collect {|r| {:user_name => u, :name => r}}}.flatten, Golem::DB.repositories
|
8
|
+
assert_equal repos.values.flatten, Golem::DB.repositories(:return => :array)
|
9
|
+
assert_equal keys.collect {|u, k| (k.is_a?(Array) ? k : [k]).collect {|k| {:user_name => u, :key => k}}}.flatten, Golem::DB.ssh_keys
|
10
|
+
assert_equal keys.collect {|u, k| (k.is_a?(Array) ? k : [k]).collect {|k| [u, k]}}.flatten(1), Golem::DB.ssh_keys(:return => :array)
|
11
|
+
end
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gitgolem
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- PoTa
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-05-10 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
22
|
+
none: false
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
hash: 7
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 6
|
30
|
+
- 0
|
31
|
+
version: 0.6.0
|
32
|
+
name: yard
|
33
|
+
prerelease: false
|
34
|
+
type: :development
|
35
|
+
requirement: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ~>
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 23
|
43
|
+
segments:
|
44
|
+
- 1
|
45
|
+
- 0
|
46
|
+
- 0
|
47
|
+
version: 1.0.0
|
48
|
+
name: bundler
|
49
|
+
prerelease: false
|
50
|
+
type: :development
|
51
|
+
requirement: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ~>
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 7
|
59
|
+
segments:
|
60
|
+
- 1
|
61
|
+
- 5
|
62
|
+
- 2
|
63
|
+
version: 1.5.2
|
64
|
+
name: jeweler
|
65
|
+
prerelease: false
|
66
|
+
type: :development
|
67
|
+
requirement: *id003
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 3
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
version: "0"
|
78
|
+
name: rcov
|
79
|
+
prerelease: false
|
80
|
+
type: :development
|
81
|
+
requirement: *id004
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
hash: 3
|
89
|
+
segments:
|
90
|
+
- 0
|
91
|
+
version: "0"
|
92
|
+
name: bluecloth
|
93
|
+
prerelease: false
|
94
|
+
type: :development
|
95
|
+
requirement: *id005
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ~>
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
hash: 1
|
103
|
+
segments:
|
104
|
+
- 1
|
105
|
+
version: "1"
|
106
|
+
name: test-unit
|
107
|
+
prerelease: false
|
108
|
+
type: :development
|
109
|
+
requirement: *id006
|
110
|
+
description: Golem provides an easy way to host and manage access to git repositories on a server under a single user.
|
111
|
+
email: pota@mosfet.hu
|
112
|
+
executables:
|
113
|
+
- golem
|
114
|
+
- golem-shell
|
115
|
+
extensions: []
|
116
|
+
|
117
|
+
extra_rdoc_files:
|
118
|
+
- LICENSE.txt
|
119
|
+
- README.md
|
120
|
+
- TODO
|
121
|
+
files:
|
122
|
+
- .document
|
123
|
+
- .yardopts
|
124
|
+
- Gemfile
|
125
|
+
- LICENSE.txt
|
126
|
+
- README.md
|
127
|
+
- Rakefile
|
128
|
+
- bin/golem
|
129
|
+
- bin/golem-shell
|
130
|
+
- lib/gitgolem.rb
|
131
|
+
- lib/golem.rb
|
132
|
+
- lib/golem/access.rb
|
133
|
+
- lib/golem/command.rb
|
134
|
+
- lib/golem/command/auth.rb
|
135
|
+
- lib/golem/command/clear_repositories.rb
|
136
|
+
- lib/golem/command/create_repository.rb
|
137
|
+
- lib/golem/command/delete_repository.rb
|
138
|
+
- lib/golem/command/environment.rb
|
139
|
+
- lib/golem/command/save_config.rb
|
140
|
+
- lib/golem/command/setup_db.rb
|
141
|
+
- lib/golem/command/update_hooks.rb
|
142
|
+
- lib/golem/command/update_keys_file.rb
|
143
|
+
- lib/golem/config.rb
|
144
|
+
- lib/golem/db.rb
|
145
|
+
- lib/golem/db/pg.rb
|
146
|
+
- lib/golem/db/postgres.sql
|
147
|
+
- lib/golem/db/static.rb
|
148
|
+
- lib/golem/parser.rb
|
149
|
+
- lib/golem/version.rb
|
150
|
+
- test/helper.rb
|
151
|
+
- test/test_access.rb
|
152
|
+
- test/test_config.rb
|
153
|
+
- test/test_db.rb
|
154
|
+
- TODO
|
155
|
+
homepage: http://github.com/eLod/golem
|
156
|
+
licenses:
|
157
|
+
- MIT
|
158
|
+
post_install_message:
|
159
|
+
rdoc_options: []
|
160
|
+
|
161
|
+
require_paths:
|
162
|
+
- lib
|
163
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
164
|
+
none: false
|
165
|
+
requirements:
|
166
|
+
- - ">="
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
hash: 3
|
169
|
+
segments:
|
170
|
+
- 0
|
171
|
+
version: "0"
|
172
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
173
|
+
none: false
|
174
|
+
requirements:
|
175
|
+
- - ">="
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
hash: 3
|
178
|
+
segments:
|
179
|
+
- 0
|
180
|
+
version: "0"
|
181
|
+
requirements: []
|
182
|
+
|
183
|
+
rubyforge_project:
|
184
|
+
rubygems_version: 1.7.2
|
185
|
+
signing_key:
|
186
|
+
specification_version: 3
|
187
|
+
summary: Gem to host git repositories.
|
188
|
+
test_files:
|
189
|
+
- test/helper.rb
|
190
|
+
- test/test_access.rb
|
191
|
+
- test/test_config.rb
|
192
|
+
- test/test_db.rb
|