forked from ericpaulbishop/redmine_git_hosting
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgitolite_conf.rb
executable file
·137 lines (115 loc) · 2.88 KB
/
gitolite_conf.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
module GitHosting
class GitoliteConfig
def initialize file_path
@path = file_path
load
end
def save
File.open(@path, "w") do |f|
f.puts content
end
@original_content = content
end
def add_write_user repo_name, users
repository(repo_name).add "RW+", users
end
def set_write_user repo_name, users
repository(repo_name).set "RW+", users
end
def add_read_user repo_name, users
repository(repo_name).add "R", users
end
def set_read_user repo_name, users
repository(repo_name).set "R", users
end
def delete_repo repo_name
@repositories.delete(repo_name)
end
def rename_repo old_name, new_name
if @repositories.has_key?(old_name)
perms = @repositories.delete(old_name)
@repositories[new_name] = perms
end
end
def changed?
@original_content != content
end
def all_repos
repos={}
@repositories.each do |repo, rights|
repos[repo] = 1
end
return repos
end
private
def load
@original_content = []
@repositories = ActiveSupport::OrderedHash.new
cur_repo_name = nil
File.open(@path).each_line do |line|
@original_content << line
tokens = line.strip.split
if tokens.first == 'repo'
cur_repo_name = tokens.last
@repositories[cur_repo_name] = GitoliteAccessRights.new
next
end
cur_repo_right = @repositories[cur_repo_name]
if cur_repo_right and tokens[1] == '='
cur_repo_right.add tokens.first, tokens[2..-1]
end
end
@original_content = @original_content.join
end
def repository repo_name
@repositories[repo_name] ||= GitoliteAccessRights.new
end
def content
content = []
# To facilitate creation of repos, even when no users are defined
# always define at least one user -- specifically the admin
# user which has rights to modify gitolite-admin and control
# all repos. Since the gitolite-admin user can grant anyone
# any permission anyway, this isn't really a security risk.
# If no users are defined, this ensures the repo actually
# gets created, hence it's necessary.
admin_user = @repositories["gitolite-admin"].rights["RW+".to_sym][0]
@repositories.each do |repo, rights|
content << "repo\t#{repo}"
has_users=false
rights.each do |perm, users|
if users.length > 0
has_users=true
content << "\t#{perm}\t=\t#{users.join(' ')}"
end
end
if !has_users
content << "\tR\t=\t#{admin_user}"
end
content << ""
end
return content.join("\n")
end
end
class GitoliteAccessRights
def initialize
@rights = ActiveSupport::OrderedHash.new
end
def rights
@rights
end
def add perm, users
@rights[perm.to_sym] ||= []
@rights[perm.to_sym] << users
@rights[perm.to_sym].flatten!
@rights[perm.to_sym].uniq!
end
def set perm, users
@rights[perm.to_sym] = []
add perm, users
end
def each
@rights.each {|k,v| yield k, v}
end
end
end