Skip to content

Instantly share code, notes, and snippets.

@mihael
Forked from anonymous/gitsis.rb
Created December 22, 2012 11:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mihael/4358541 to your computer and use it in GitHub Desktop.
Save mihael/4358541 to your computer and use it in GitHub Desktop.
#a simple gitosis-admin/* interface
#used at http://kitschmaster.com for managing Gitosis
module Gitsis
def save_changes(msg, config)
c_msg = `cd #{File.dirname(config)}; git commit -am '#{msg}'`
p_msg = `cd #{File.dirname(config)}; git push origin master`
"GITSIS:\n#{c_msg}\n#{p_msg}"
end
class Group
attr_accessor :name, :writables, :members
def initialize(n, w, m)
@name = n
@writables = w
@members = m
end
end
class Repo
attr_accessor :name, :description, :owner
def initialize(n, d, o)
@name = n
@description = d
@owner= o
end
end
def parse_group(name, config)
header = "group #{name}"
w = []
m = []
inside = 0
File.open(config, "r").each do |line|
if inside>0&&inside<3
w = line.split(" = ")[1].split if line =~ /writable =/
m = line.split(" = ")[1].split if line =~ /members =/
inside+=1
end
inside = 1 if line =~ /\[#{header}\]/
end
Group.new(name, w, m)
end
def parse_repo(name, config)
header = "repo #{name}"
d = ""
o = ""
inside = 0
File.open(config, "r").each do |line|
if inside>0&&inside<3
d = line.split(" = ")[1].split if line =~ /description =/
o = line.split(" = ")[1].split if line =~ /owner =/
inside+=1
end
inside = 1 if line =~ /\[#{header}\]/
end
Repo.new(name, d, o)
end
def parse_datetime(line)
parts = line[1..-1].split
DateTime.strptime("#{parts[0]} #{parts[1]}","%d.%m.%Y %H:%M:%S")
end
#lines: an array of lines
def delete_lines(lines, config)
return false unless lines.size>0
f = config
fb = f + ".bak"
File.rename(f, fb)
File.open(f, "w") do |out|
File.foreach(fb) {|line| out.puts line unless lines.include? $.}
end
true
end
#returns line number if found, else false
def find_header(header, config)
File.open(config, "r").each do |line|
return $. if line =~ /\[#{header}\]/
end
false
end
def find_repo(name, config)
find_header("repo #{name}", config)
end
def find_group(name, config)
find_header("group #{name}", config)
end
def add_repo(name, description, owner, config)
#check if there is already a repo named like this, if yes, return
return false if find_repo(name, config)
#goto end of file add
#[repo name]
#description = #{description}
#owner = #{owner}
File.open(config, "a") do |out| #append at end
out.puts "[repo #{name}]"
out.puts "description = #{description}"
out.puts "owner = #{owner}"
out.puts " "
end
true
end
def rem_repo(name, config)
#move to the header line and delete that one plus all next lines until next header
header_line = find_repo(name, config)
delete_lines([header_line, header_line+1, header_line+2], config) if header_line
end
def add_group(name, writables, members, config)
return false if find_group(name, config)
File.open(config, "a") do |out|
out.puts "[group #{name}]"
out.puts "writable = #{writables.join(' ')}"
out.puts "members = #{members.join(' ')}"
out.puts " "
end
true
end
def rem_group(name, config)
header_line = find_group(name, config)
delete_lines([header_line, header_line+1, header_line+2], config) if header_line
end
def find_key(member, config)
f = File.join(File.dirname(config), "keydir", "#{member}.pub")
File.exists? f
end
def add_key(member, ssh_key, config)
f = File.join(File.dirname(config), "keydir", "#{member}.pub")
File.open(f, "w") do |out|
out.puts ssh_key
end
`cd #{File.dirname(config)}; git add keydir/#{member}.pub`
end
def rem_key(member, config)
File.delete(File.join(File.dirname(config), "keydir", "#{member}.pub"))
end
def add_member(member, group_name, config)
#get previous values
header_line = find_group(group_name, config)
header = "group #{group_name}"
if header_line
inside = 0
w = []
m = []
File.open(config, "r").each do |line|
if inside>0&&inside<3
w = line.split(" = ")[1].split if line =~ /writable =/
m = line.split(" = ")[1].split if line =~ /members =/
inside+=1
end
inside = 1 if line =~ /\[#{header}\]/
end
#remove this group
delete_lines([header_line, header_line+1, header_line+2], config)
#add values to write back
m << member unless m.include? member
#add refreshed group
add_group(group_name, w, m, config)
return true
end
false
end
def rem_member(member, group_name, config)
#get previous values
header_line = find_group(group_name, config)
header = "group #{group_name}"
if header_line
inside = 0
w = []
m = []
File.open(config, "r").each do |line|
if inside>0&&inside<3
w = line.split(" = ")[1].split if line =~ /writable =/
m = line.split(" = ")[1].split if line =~ /members =/
inside+=1
end
inside = 1 if line =~ /\[#{header}\]/
end
#remove this group
delete_lines([header_line, header_line+1, header_line+2], config)
#remove values to write back
m.delete(member) if m.include? member
#add refreshed group
add_group(group_name, w, m, config)
return true
end
false
end
def add_writable(writable, group_name, config)
#get previous values
header_line = find_group(group_name, config)
header = "group #{group_name}"
if header_line
inside = 0
w = []
m = []
File.open(config, "r").each do |line|
if inside>0&&inside<3
w = line.split(" = ")[1].split if line =~ /writable =/
m = line.split(" = ")[1].split if line =~ /members =/
inside+=1
end
inside = 1 if line =~ /\[#{header}\]/
end
#remove this group
delete_lines([header_line, header_line+1, header_line+2], config)
#add values to write back
w << writable unless w.include? writable
#add refreshed group
add_group(group_name, w, m, config)
return true
end
false
end
def rem_writable(config, group_name, writable)
#get previous values
header_line = find_group(group_name, config)
header = "group #{group_name}"
if header_line
inside = 0
w = []
m = []
File.open(config, "r").each do |line|
if inside>0&&inside<3
w = line.split(" = ")[1].split if line =~ /writable =/
m = line.split(" = ")[1].split if line =~ /members =/
inside+=1
end
inside = 1 if line =~ /\[#{header}\]/
end
#remove this group
delete_lines([header_line, header_line+1, header_line+2], config)
#remove values to write back
w.delete(writable) if w.include? writable
#add refreshed group
add_group(group_name, w, m, config)
return true
end
false
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment