rgit 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +4 -0
- data/README +1 -0
- data/Rakefile +1 -0
- data/bin/rgit +61 -0
- data/files/.htaccess +2 -0
- data/files/rit.php +109 -0
- data/lib/rgit.rb +228 -0
- data/lib/rgit/version.rb +3 -0
- data/rgit.gemspec +24 -0
- metadata +112 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.lock
|
data/Gemfile
ADDED
data/README
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Stupid Git clone with a PHP backend that i needed because I can't stand FTP while working on shared hostings.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
data/bin/rgit
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rgit'
|
4
|
+
|
5
|
+
rit = Rgit::Repo.new("empty")
|
6
|
+
if (Dir.exists? ".rit_empty")
|
7
|
+
Dir.chdir(".rit_empty")
|
8
|
+
conf = JSON.parse(File.read("rit.conf"))
|
9
|
+
rit.repo = conf["repo"]
|
10
|
+
Dir.chdir("../")
|
11
|
+
end
|
12
|
+
options = {}
|
13
|
+
OptionParser.new do |opts|
|
14
|
+
opts.banner = "Usage: rit [options]..."
|
15
|
+
opts.on('-d [arg]', '--define [arg]', 'Sets current repo') do |repo|
|
16
|
+
rit.repo = "empty"
|
17
|
+
rit.write_config "rit.conf","repo", repo
|
18
|
+
end
|
19
|
+
opts.on('-a [arg]', '--add [arg]', 'Adds files') do |pattern|
|
20
|
+
rit.add_files pattern
|
21
|
+
end
|
22
|
+
opts.on('-j', '--json', 'generates remote json.conf') do |what|
|
23
|
+
rit.generate
|
24
|
+
end
|
25
|
+
opts.on('-r [arg]','--repo [arg]',"Sets remote repo") do |repo|
|
26
|
+
rit.write_config "rit.conf","repo",repo
|
27
|
+
end
|
28
|
+
opts.on('-k [arg]','--key [arg]',"Sets key") do |key|
|
29
|
+
rit.write_config "rit.conf","key",key
|
30
|
+
end
|
31
|
+
opts.on('-c [arg]','--clean [arg]',"Clean files added to queue") do
|
32
|
+
rit.delete_queue
|
33
|
+
end
|
34
|
+
opts.on('-f','--force',"Forces file overwrite") do
|
35
|
+
options[:force] = true
|
36
|
+
end
|
37
|
+
opts.on('-u [arg]','--user [arg]',"Sets username") do |u|
|
38
|
+
rit.write_config "rit.conf","user",u
|
39
|
+
end
|
40
|
+
opts.on('-p [arg]','--push [arg]',"Pushes to repo") do |arg|
|
41
|
+
rit.upload_files(options)
|
42
|
+
end
|
43
|
+
opts.on('-g','--generate',"generate configuration (to upload in /.rit_keys)") do
|
44
|
+
rit.ziphp
|
45
|
+
end
|
46
|
+
opts.on('-s','--sync',"Downloads from remote repo") do
|
47
|
+
rit.sync
|
48
|
+
end
|
49
|
+
opts.on('-i [arg]','--init [arg]',"Creates empty repo") do |arg|
|
50
|
+
if FileTest::directory? ".rit_"+arg
|
51
|
+
puts "A .rit_#{arg} directory already exists"
|
52
|
+
exit
|
53
|
+
end
|
54
|
+
rit.create_repo arg
|
55
|
+
end
|
56
|
+
opts.on( '-h', '--help', 'Display this screen' ) do
|
57
|
+
puts opts
|
58
|
+
exit
|
59
|
+
end
|
60
|
+
end.parse!
|
61
|
+
|
data/files/.htaccess
ADDED
data/files/rit.php
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
<?php
|
2
|
+
|
3
|
+
if (!isset($_POST["name"]) || !isset($_POST["key"]))
|
4
|
+
die("!!! You need to have a valid username:key combination in order to access this page");
|
5
|
+
elseif (!isset($_GET["action"]))
|
6
|
+
die("!!! You need to set an action");
|
7
|
+
|
8
|
+
$user = str_replace(array('/','.'),'',$_POST["name"]);
|
9
|
+
$ukey = str_replace(array('/','.'),'',$_POST["key"]);
|
10
|
+
if (!(file_exists(".rit_keys/".$user)))
|
11
|
+
die("!!! Such user doesn't exist");
|
12
|
+
|
13
|
+
$key = trim(file_get_contents(".rit_keys/".$user));
|
14
|
+
if ($key != $ukey)
|
15
|
+
die("!!! Wrong username:key combination");
|
16
|
+
|
17
|
+
function updateField($file,$key,$value) {
|
18
|
+
if (file_exists(".rit/".$file)) {
|
19
|
+
$prev = json_decode(file_get_contents(".rit/".$file),true);
|
20
|
+
$prev[$key] = $value;
|
21
|
+
}
|
22
|
+
else
|
23
|
+
$prev[$key] = $value;
|
24
|
+
file_put_contents(".rit/".$file,json_encode($prev));
|
25
|
+
}
|
26
|
+
function getField($file,$key) {
|
27
|
+
if (file_exists(".rit/".$file)) {
|
28
|
+
$prev = json_decode(file_get_contents(".rit/".$file),true);
|
29
|
+
if ($prev[$key] != "")
|
30
|
+
return $prev[$key];
|
31
|
+
else
|
32
|
+
return "404";
|
33
|
+
}
|
34
|
+
else
|
35
|
+
return "404";
|
36
|
+
}
|
37
|
+
function generateJSON() {
|
38
|
+
$path = $_POST["dir"]."/".$_POST["filename"];
|
39
|
+
updateField($_POST["repo"],$path,$_POST["last"]);
|
40
|
+
}
|
41
|
+
function handle_upload() {
|
42
|
+
$path = $_POST["dir"]."/".basename( $_FILES['rit']['name']);
|
43
|
+
updateField($_POST["repo"],$path,$_POST["last"]);
|
44
|
+
if (!file_exists($_POST["dir"]) && !is_dir($_POST["dir"]))
|
45
|
+
mkdir($_POST["dir"], 0, true);
|
46
|
+
if (file_exists($path))
|
47
|
+
unlink($path);
|
48
|
+
move_uploaded_file($_FILES['rit']['tmp_name'], $path);
|
49
|
+
}
|
50
|
+
function add_user() {
|
51
|
+
if(!isset($_POST["add_name"]) || !isset($_POST["add_key"]))
|
52
|
+
die("!!! You need to specify a new username and a new key");
|
53
|
+
file_put_contents(".rit_keys/".str_replace(array('/','.'),'',$_POST["add_name"]),str_replace(array('/','.'),'',$_POST["add_key"]));
|
54
|
+
}
|
55
|
+
function remove_user() {
|
56
|
+
if(!isset($_POST["rem_name"]))
|
57
|
+
die("!!! You need to specify a username to remove");
|
58
|
+
elseif (file_exists(".rit_keys/".str_replace(array('/','.'),'',$_POST["rem_name"])))
|
59
|
+
unlink(".rit_keys/".str_replace(array('/','.'),'',$_POST["rem_name"]));
|
60
|
+
else
|
61
|
+
die("No such user");
|
62
|
+
}
|
63
|
+
|
64
|
+
function downloadUpdate() {
|
65
|
+
$file = $_POST["file"];
|
66
|
+
if (file_exists($file)) {
|
67
|
+
header('Content-Description: File Transfer');
|
68
|
+
header('Content-Type: application/octet-stream');
|
69
|
+
header('Content-Disposition: attachment; filename='.basename($file));
|
70
|
+
header('Content-Transfer-Encoding: binary');
|
71
|
+
header('Expires: 0');
|
72
|
+
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
|
73
|
+
header('Pragma: public');
|
74
|
+
header('Content-Length: ' . filesize($file));
|
75
|
+
ob_clean();
|
76
|
+
flush();
|
77
|
+
readfile($file);
|
78
|
+
exit;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
function listFiles() {
|
83
|
+
echo file_get_contents(".rit/".$_POST["repo"]);
|
84
|
+
}
|
85
|
+
|
86
|
+
switch ($_GET["action"]) {
|
87
|
+
case 'add':
|
88
|
+
add_user();
|
89
|
+
break;
|
90
|
+
case 'upload':
|
91
|
+
handle_upload();
|
92
|
+
break;
|
93
|
+
case 'remove':
|
94
|
+
remove_user();
|
95
|
+
break;
|
96
|
+
case 'update':
|
97
|
+
downloadUpdate();
|
98
|
+
break;
|
99
|
+
case 'list':
|
100
|
+
listFiles();
|
101
|
+
break;
|
102
|
+
case 'generate':
|
103
|
+
generateJSON();
|
104
|
+
break;
|
105
|
+
default:
|
106
|
+
die("Such action doesn't exist");
|
107
|
+
}
|
108
|
+
?>
|
109
|
+
|
data/lib/rgit.rb
ADDED
@@ -0,0 +1,228 @@
|
|
1
|
+
require 'rgit/version'
|
2
|
+
require 'rest_client'
|
3
|
+
require 'json'
|
4
|
+
require 'optparse'
|
5
|
+
require 'find'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'date'
|
8
|
+
require 'zipruby'
|
9
|
+
|
10
|
+
|
11
|
+
module Rgit
|
12
|
+
class Repo
|
13
|
+
FILE_DIR = File.expand_path(File.join('..', '..', 'files'), __FILE__)
|
14
|
+
attr_accessor :repo
|
15
|
+
def initialize(repo)
|
16
|
+
@repo = repo
|
17
|
+
RestClient.proxy = ENV['http_proxy']
|
18
|
+
end
|
19
|
+
# upload_files -> pushes files to repo
|
20
|
+
def upload_files(options)
|
21
|
+
Dir.chdir(".rit_"+@repo)
|
22
|
+
files = JSON.parse(File.read("queue.json"));
|
23
|
+
Dir.chdir("../")
|
24
|
+
i = 1
|
25
|
+
self.get_repo_files
|
26
|
+
puts "Pushing #{files.length} file(s)"
|
27
|
+
files.map! do |file|
|
28
|
+
puts "[#{i}/#{files.length}] "+file["dir"]+"/"+file["name"]
|
29
|
+
if (new_file? File.join(file["dir"],file["name"]))
|
30
|
+
puts "Newer version of "+file["dir"]+"/"+file["name"]+" available on the webserver, run rgit --sync"
|
31
|
+
print "Do you really want to overwrite a newer version of "+file["dir"]+"/"+file["name"]+"? (y/n)"
|
32
|
+
choice = gets.chop
|
33
|
+
(choice == "y")? allow = true : allow = false
|
34
|
+
else
|
35
|
+
allow = true
|
36
|
+
end
|
37
|
+
if (allow)
|
38
|
+
request = RestClient.post(read_config("rit.conf","repo")+"?action=upload",
|
39
|
+
{
|
40
|
+
:repo => @repo,
|
41
|
+
:dir => file["dir"],
|
42
|
+
:name => read_config("rit.conf","user"),
|
43
|
+
:key => read_config("rit.conf","key"),
|
44
|
+
:last => file["last"],
|
45
|
+
:rit => File.new(File.join(file["dir"],file["name"]),'rb')
|
46
|
+
}
|
47
|
+
);
|
48
|
+
end
|
49
|
+
i+=1
|
50
|
+
end
|
51
|
+
Dir.chdir(".rit_"+@repo)
|
52
|
+
File.delete("queue.json")
|
53
|
+
Dir.chdir("../")
|
54
|
+
end
|
55
|
+
#generate -> creates rit.conf
|
56
|
+
def generate
|
57
|
+
Dir.chdir(".rit_"+@repo)
|
58
|
+
files = JSON.parse(File.read("queue.json"));
|
59
|
+
Dir.chdir("../")
|
60
|
+
i = 1
|
61
|
+
puts "Adding to rit.conf #{files.length} file(s)"
|
62
|
+
files.map! do |file|
|
63
|
+
puts "[#{i}/#{files.length}] "+file["dir"]+"/"+file["name"]
|
64
|
+
request = RestClient.post(read_config("rit.conf","repo")+"?action=generate",
|
65
|
+
{
|
66
|
+
:repo => @repo,
|
67
|
+
:dir => file["dir"],
|
68
|
+
:name => read_config("rit.conf","user"),
|
69
|
+
:key => read_config("rit.conf","key"),
|
70
|
+
:last => file["last"],
|
71
|
+
:filename => file["name"]
|
72
|
+
}
|
73
|
+
);
|
74
|
+
i+=1
|
75
|
+
end
|
76
|
+
Dir.chdir(".rit_"+@repo)
|
77
|
+
File.delete("queue.json")
|
78
|
+
Dir.chdir("../")
|
79
|
+
end
|
80
|
+
# write_config -> updates config file (uses JSON)
|
81
|
+
def write_config file,key,value
|
82
|
+
Dir.chdir(".rit_"+@repo)
|
83
|
+
conf = JSON.parse(File.read(file))
|
84
|
+
conf[key] = value
|
85
|
+
f = File.new(file, "w+")
|
86
|
+
f.write(JSON.generate(conf))
|
87
|
+
Dir.chdir("../")
|
88
|
+
end
|
89
|
+
#read_config -> reads key from JSON config file
|
90
|
+
def read_config file,key
|
91
|
+
if !FileTest::directory? ".rit_"+@repo
|
92
|
+
puts "You need to create an empty repo first"
|
93
|
+
exit
|
94
|
+
end
|
95
|
+
Dir.chdir(".rit_"+@repo)
|
96
|
+
if File.file? file
|
97
|
+
conf = JSON.parse(File.read(file))
|
98
|
+
Dir.chdir("../")
|
99
|
+
return conf[key]
|
100
|
+
end
|
101
|
+
end
|
102
|
+
#get_files -> recursively finds file matching given regex
|
103
|
+
def get_files(dir, regex)
|
104
|
+
returnedFiles = []
|
105
|
+
i = 0
|
106
|
+
Find.find(@repo+"/"+dir) do |path|
|
107
|
+
dir, name = File.split(path)
|
108
|
+
if (!File.directory?(File.join(dir,name)) && (File.join(dir,name)) =~ regex)
|
109
|
+
returnedFiles << {:dir => dir, :name => name, :last => File.mtime(path)}
|
110
|
+
puts "Added file: #{dir}/#{name}"
|
111
|
+
i += 1
|
112
|
+
end
|
113
|
+
end
|
114
|
+
puts "Total: #{i} file(s)"
|
115
|
+
return returnedFiles
|
116
|
+
end
|
117
|
+
#new_file? -> check if server's file version is newer than the local one
|
118
|
+
def new_file? file_path
|
119
|
+
if !File.exist? file_path
|
120
|
+
return false
|
121
|
+
end
|
122
|
+
local_time = File.mtime(file_path)
|
123
|
+
if !self.read_config("remote.conf",file_path).nil?
|
124
|
+
remote_time = DateTime.parse(self.read_config("remote.conf",file_path)).to_time
|
125
|
+
return local_time < remote_time
|
126
|
+
else
|
127
|
+
return false
|
128
|
+
end
|
129
|
+
end
|
130
|
+
#get_repo_files -> gets file list from repo
|
131
|
+
def get_repo_files
|
132
|
+
puts "Downloading remote file list"
|
133
|
+
get_repo_conf = RestClient.post(self.read_config("rit.conf","repo")+'?action=update', {:name => self.read_config("rit.conf","user"), :key => self.read_config("rit.conf","key"), :file => File.join(".rit",@repo) }) { |resp, request, result, &block|
|
134
|
+
open(File.join(".rit_"+@repo,"remote.conf"), "wb") do |file|
|
135
|
+
file.write(resp.body)
|
136
|
+
end
|
137
|
+
}
|
138
|
+
end
|
139
|
+
#create_repo -> creates new repo
|
140
|
+
def create_repo key
|
141
|
+
if (!Dir.exists? ".rit_empty")
|
142
|
+
Dir.mkdir(".rit_empty")
|
143
|
+
Dir.chdir(".rit_empty")
|
144
|
+
normal = Hash.new()
|
145
|
+
normal["repo"]= key
|
146
|
+
normal["json_sucks"] = "not less than 2 vars"
|
147
|
+
f=File.open("rit.conf","w+")
|
148
|
+
f.write(JSON.generate(normal))
|
149
|
+
else
|
150
|
+
conf = JSON.parse(File.read("rit.conf"))
|
151
|
+
conf["repo"] = key
|
152
|
+
f = File.new("rit.conf", "w+")
|
153
|
+
f.write(JSON.generate(conf))
|
154
|
+
end
|
155
|
+
Dir.chdir("../")
|
156
|
+
Dir.mkdir(".rit_"+key)
|
157
|
+
Dir.mkdir(key)
|
158
|
+
Dir.chdir ".rit_"+key
|
159
|
+
data = Hash.new()
|
160
|
+
print "Username: "
|
161
|
+
data["user"] = gets.chop
|
162
|
+
print "Password: "
|
163
|
+
data["key"] = gets.chop
|
164
|
+
print "Repo: "
|
165
|
+
data["repo"] = gets.chop
|
166
|
+
f=File.open("rit.conf","w+")
|
167
|
+
f.write(JSON.generate(data))
|
168
|
+
Dir.chdir("../")
|
169
|
+
end
|
170
|
+
#add_files -> adds file to queue
|
171
|
+
def add_files pattern
|
172
|
+
Dir.chdir(".rit_"+@repo)
|
173
|
+
f = File.new("queue.json", "w+")
|
174
|
+
Dir.chdir("../")
|
175
|
+
f.write(JSON.generate(self.get_files(".",Regexp.new(pattern))))
|
176
|
+
end
|
177
|
+
#delete_queue -> deletes queue
|
178
|
+
def delete_queue
|
179
|
+
Dir.chdir(".rit_"+@repo)
|
180
|
+
File.delete("queue.json")
|
181
|
+
Dir.chdir("../")
|
182
|
+
end
|
183
|
+
#sync
|
184
|
+
def sync
|
185
|
+
self.get_repo_files
|
186
|
+
files = JSON.parse(File.read(File.join(".rit_"+@repo,"remote.conf")))
|
187
|
+
puts "syncing #{files.length} files"
|
188
|
+
i = 0
|
189
|
+
files.each do |key, value|
|
190
|
+
print "[#{i+1}/#{files.length}] #{key}"
|
191
|
+
if (!File.exist? key) || (new_file? key)
|
192
|
+
if !File.exist? key
|
193
|
+
file_path = File.split(key);
|
194
|
+
FileUtils.mkdir_p(file_path[0]);
|
195
|
+
end
|
196
|
+
req = RestClient.post(self.read_config("rit.conf","repo")+'?action=update', {:name => self.read_config("rit.conf","user"), :key => self.read_config("rit.conf","key"), :file => key }) { |resp, request, result, &block|
|
197
|
+
puts "\t\t*syncED*"
|
198
|
+
open(key, "wb") do |file|
|
199
|
+
file.write(resp.body)
|
200
|
+
end
|
201
|
+
}
|
202
|
+
else
|
203
|
+
puts "\t\t*UPDATED*"
|
204
|
+
end
|
205
|
+
i += 1
|
206
|
+
end
|
207
|
+
end
|
208
|
+
#ziphp -> creates zip for the webserver
|
209
|
+
def ziphp
|
210
|
+
if File.exist?("rgit_upload.zip")
|
211
|
+
File.unlink("rgit_upload.zip")
|
212
|
+
end
|
213
|
+
print "Insert username: "
|
214
|
+
name = gets
|
215
|
+
print "Insert password: "
|
216
|
+
pwd = gets
|
217
|
+
Zip::Archive.open('rgit_upload.zip', Zip::CREATE) do |ar|
|
218
|
+
ar.add_dir(".rit_keys")
|
219
|
+
ar.add_dir(".rit");
|
220
|
+
ar.add_file(File.join(FILE_DIR,"rit.php"))
|
221
|
+
ar.add_buffer(File.join(".rit_keys/",name.chop), pwd.chop)
|
222
|
+
ar.add_file(".rit_keys/.htaccess", File.join(FILE_DIR,".htaccess"))
|
223
|
+
ar.add_file(".rit/.htaccess", File.join(FILE_DIR,".htaccess"))
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
data/lib/rgit/version.rb
ADDED
data/rgit.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "rgit/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "rgit"
|
7
|
+
s.version = Rgit::VERSION
|
8
|
+
s.authors = ["yawn"]
|
9
|
+
s.email = ["yawn.localhost@gmail.com"]
|
10
|
+
s.homepage = "http://github.com/MrYawn/Rgit"
|
11
|
+
s.summary = %q{stupid ruby git clone}
|
12
|
+
s.description = %q{git clone that manages website using a php backend}
|
13
|
+
|
14
|
+
s.rubyforge_project = "rgit"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
s.add_dependency "rest-client"
|
21
|
+
s.add_dependency "json"
|
22
|
+
s.add_dependency "zipruby"
|
23
|
+
end
|
24
|
+
|
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rgit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
version: 0.0.3
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- yawn
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-07-07 00:00:00 +02:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rest-client
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :runtime
|
32
|
+
version_requirements: *id001
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: json
|
35
|
+
prerelease: false
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
version: "0"
|
44
|
+
type: :runtime
|
45
|
+
version_requirements: *id002
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: zipruby
|
48
|
+
prerelease: false
|
49
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 0
|
56
|
+
version: "0"
|
57
|
+
type: :runtime
|
58
|
+
version_requirements: *id003
|
59
|
+
description: git clone that manages website using a php backend
|
60
|
+
email:
|
61
|
+
- yawn.localhost@gmail.com
|
62
|
+
executables:
|
63
|
+
- rgit
|
64
|
+
extensions: []
|
65
|
+
|
66
|
+
extra_rdoc_files: []
|
67
|
+
|
68
|
+
files:
|
69
|
+
- .gitignore
|
70
|
+
- Gemfile
|
71
|
+
- README
|
72
|
+
- Rakefile
|
73
|
+
- bin/rgit
|
74
|
+
- files/.htaccess
|
75
|
+
- files/rit.php
|
76
|
+
- lib/rgit.rb
|
77
|
+
- lib/rgit/version.rb
|
78
|
+
- rgit.gemspec
|
79
|
+
has_rdoc: true
|
80
|
+
homepage: http://github.com/MrYawn/Rgit
|
81
|
+
licenses: []
|
82
|
+
|
83
|
+
post_install_message:
|
84
|
+
rdoc_options: []
|
85
|
+
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
segments:
|
94
|
+
- 0
|
95
|
+
version: "0"
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
segments:
|
102
|
+
- 0
|
103
|
+
version: "0"
|
104
|
+
requirements: []
|
105
|
+
|
106
|
+
rubyforge_project: rgit
|
107
|
+
rubygems_version: 1.3.7
|
108
|
+
signing_key:
|
109
|
+
specification_version: 3
|
110
|
+
summary: stupid ruby git clone
|
111
|
+
test_files: []
|
112
|
+
|