Skip to content

Instantly share code, notes, and snippets.

Created December 22, 2012 11:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save anonymous/4358537 to your computer and use it in GitHub Desktop.
Save anonymous/4358537 to your computer and use it in GitHub Desktop.
my development platform http://kitschmaster.com manages many git repositories for many Artists with Gitosis. although Gitosis has not been updated since ii first started using it and some people say it is obsolete, ii am still using it today with satisfaction. this is a short module ii use to deal with Gitosis from RubyOnRails or from ruby in ge…
#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