git_guts 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/bin/bash-bin +5 -0
- data/bin/git-about +19 -0
- data/bin/git-autocommit +19 -0
- data/bin/git-fireworks +5 -0
- data/bin/git-guts +19 -0
- data/bin/git-inception +19 -0
- data/bin/git-map +19 -0
- data/bin/git-multipush +19 -0
- data/bin/git-music +5 -0
- data/bin/git-open +19 -0
- data/bin/git-quote +19 -0
- data/bin/git-server +19 -0
- data/bin/git-test +19 -0
- data/bin/git-welcome +19 -0
- data/bin/ruby-bin +19 -0
- data/bin/scripts/git-about.rb +12 -0
- data/bin/scripts/git-autocommit.rb +3 -0
- data/bin/scripts/git-fireworks +158 -0
- data/bin/scripts/git-guts.rb +28 -0
- data/bin/scripts/git-inception.rb +3 -0
- data/bin/scripts/git-map.rb +3 -0
- data/bin/scripts/git-multipush.rb +3 -0
- data/bin/scripts/git-music +4 -0
- data/bin/scripts/git-open.rb +4 -0
- data/bin/scripts/git-quote.rb +13 -0
- data/bin/scripts/git-server.rb +3 -0
- data/bin/scripts/git-test.rb +3 -0
- data/bin/scripts/git-welcome.rb +61 -0
- data/bin/support/africa-fullmap.gif +0 -0
- data/bin/support/africa-map.gif +0 -0
- data/bin/support/inception.mp3 +0 -0
- data/git_guts.gemspec +43 -0
- data/lib/extensions/string.rb +31 -0
- data/lib/git_guts/about.rb +20 -0
- data/lib/git_guts/autocommit.rb +28 -0
- data/lib/git_guts/guts.rb +11 -0
- data/lib/git_guts/inception.rb +14 -0
- data/lib/git_guts/map.rb +19 -0
- data/lib/git_guts/multi_push.rb +24 -0
- data/lib/git_guts/open.rb +21 -0
- data/lib/git_guts/quote.rb +20 -0
- data/lib/git_guts/server.rb +33 -0
- data/lib/git_guts/test.rb +15 -0
- data/lib/git_guts/version.rb +3 -0
- data/lib/git_guts/welcome.rb +12 -0
- data/lib/git_guts.rb +4 -0
- data/lib/git_server/.gitignore +2 -0
- data/lib/git_server/Gemfile +9 -0
- data/lib/git_server/README.md +1 -0
- data/lib/git_server/Rakefile +4 -0
- data/lib/git_server/config.ru +4 -0
- data/lib/git_server/lib/git_server.rb +62 -0
- data/lib/git_server/lib/git_server_app.rb +38 -0
- data/lib/git_server/lib/version.rb +3 -0
- data/lib/git_server/log/.gitignore +1 -0
- data/lib/git_server/public/css/app.css +184 -0
- data/lib/git_server/public/css/details.css +54 -0
- data/lib/git_server/public/css/fonts.css +12 -0
- data/lib/git_server/public/css/pre.css +11 -0
- data/lib/git_server/public/images/.gitignore +0 -0
- data/lib/git_server/public/images/arrow.png +0 -0
- data/lib/git_server/public/images/cat.png +0 -0
- data/lib/git_server/public/images/diff.png +0 -0
- data/lib/git_server/public/images/loader.gif +0 -0
- data/lib/git_server/public/images/pipe.png +0 -0
- data/lib/git_server/public/images/reset.png +0 -0
- data/lib/git_server/public/js/.gitignore +0 -0
- data/lib/git_server/public/js/app.js +129 -0
- data/lib/git_server/public/js/jquery-2.0-min.js +6 -0
- data/lib/git_server/views/404.haml +4 -0
- data/lib/git_server/views/blob.haml +26 -0
- data/lib/git_server/views/commit.haml +17 -0
- data/lib/git_server/views/commit_summary.haml +19 -0
- data/lib/git_server/views/diff.haml +21 -0
- data/lib/git_server/views/diff_file.haml +19 -0
- data/lib/git_server/views/diff_summary.haml +3 -0
- data/lib/git_server/views/index.haml +25 -0
- data/lib/git_server/views/layout.haml +10 -0
- data/lib/git_server/views/tree.haml +19 -0
- data/lib/guard/git.rb +22 -0
- data/lib/thor/git_group.rb +12 -0
- metadata +285 -0
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'git_guts'
|
2
|
+
require 'git_guts/welcome'
|
3
|
+
GitGuts::Welcome.start
|
4
|
+
__END__
|
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
|
+
/ / ###/
|
Binary file
|
Binary file
|
Binary file
|
data/git_guts.gemspec
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'git_guts/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "git_guts"
|
8
|
+
gem.version = GitGuts::VERSION
|
9
|
+
gem.authors = ["Shadab Ahmed"]
|
10
|
+
gem.email = ["shadab.ansari@gmail.com"]
|
11
|
+
gem.description = %q{Diving deep into git with ruby}
|
12
|
+
gem.summary = %q{Helper commands to see your way around git}
|
13
|
+
gem.homepage = "http://github.com/shadabahmed/git_guts"
|
14
|
+
|
15
|
+
gem.add_dependency 'rack'
|
16
|
+
gem.add_dependency 'guard'
|
17
|
+
gem.add_dependency 'thor'
|
18
|
+
gem.add_dependency 'sinatra'
|
19
|
+
gem.add_dependency 'haml'
|
20
|
+
gem.add_dependency 'git'
|
21
|
+
gem.add_dependency 'ruby-filemagic'
|
22
|
+
gem.add_dependency 'diffy'
|
23
|
+
gem.add_dependency 'thin'
|
24
|
+
|
25
|
+
gem.files = `git ls-files`.split($/)
|
26
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
27
|
+
gem.require_paths = ["lib"]
|
28
|
+
gem.executables = `git ls-files ./bin`.split($/).reject{|f| f =~ /(scripts|support)/}.collect{|f| f.sub('bin/', '')}
|
29
|
+
Gem.post_install do
|
30
|
+
`which ruby > #{gem.gem_dir}/bin/RUBY_BIN`
|
31
|
+
end
|
32
|
+
gem.post_install_message = <<-MSG
|
33
|
+
|
34
|
+
************************************************************
|
35
|
+
Thanks for installing git-guts
|
36
|
+
|
37
|
+
Please run this command manually:
|
38
|
+
|
39
|
+
which ruby > #{gem.gem_dir}/bin/RUBY_BIN_PATH
|
40
|
+
|
41
|
+
************************************************************
|
42
|
+
MSG
|
43
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class String
|
2
|
+
ColorMap = {:default => 39, :cyan => 36, :red => 31, :green => 32, :blue => 34, :magent => 35, :yellow => 33, :white => 37}
|
3
|
+
Colors = ColorMap.keys
|
4
|
+
|
5
|
+
# colorization
|
6
|
+
def colorize(color_code)
|
7
|
+
empty? ? self : "\e[#{color_code}m#{self}\e[0m"
|
8
|
+
end
|
9
|
+
|
10
|
+
ColorMap.each do |name, code|
|
11
|
+
define_method(name) do
|
12
|
+
colorize(code)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def random_color
|
17
|
+
self.send(Colors[rand(Colors.length)])
|
18
|
+
end
|
19
|
+
|
20
|
+
def slow_puts(opts = {})
|
21
|
+
opts[:delay] = 0.02 unless opts[:delay]
|
22
|
+
opts[:newline] = true if opts[:newline].nil?
|
23
|
+
self.each_char do |x|
|
24
|
+
print x
|
25
|
+
STDOUT.flush
|
26
|
+
sleep opts[:delay]
|
27
|
+
end
|
28
|
+
puts if opts[:newline]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module GitGuts
|
2
|
+
class About < Thor::GitGroup
|
3
|
+
desc 'Describe the person'
|
4
|
+
argument :name, :required => true, :banner => '<PERSON NAME>', :type => :string
|
5
|
+
|
6
|
+
def about
|
7
|
+
if name.downcase != 'shadab'
|
8
|
+
"\nSorry, I do not know this guy\n".red.slow_puts
|
9
|
+
else
|
10
|
+
DATA.each_line.each do |msg|
|
11
|
+
msg.chomp.random_color.slow_puts
|
12
|
+
end
|
13
|
+
"\nGeography geek - ".random_color.slow_puts(:newline => false)
|
14
|
+
sleep 1
|
15
|
+
"Infact claims, that he can name and place all countries on the African continent\n".random_color.slow_puts
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'git'
|
2
|
+
require 'guard'
|
3
|
+
require 'guard/git'
|
4
|
+
|
5
|
+
module GitGuts
|
6
|
+
class Autocommit < Thor::GitGroup
|
7
|
+
WORKING_DIRECTORY = Dir.getwd
|
8
|
+
desc 'Auto commit if files change'
|
9
|
+
argument :files, :required => true, :banner => '<Files To Watch>', :type => :array
|
10
|
+
class_option :exclusive, :aliases => '-e', :desc => 'Only commit the files being observed', :banner => ''
|
11
|
+
def autocommit
|
12
|
+
begin
|
13
|
+
Git.open(WORKING_DIRECTORY)
|
14
|
+
guard_file = <<-EOF
|
15
|
+
guard 'git'#{",:exclusive => true" if options[:exclusive]} do
|
16
|
+
watch(%r{^#{files.join('|')}$})
|
17
|
+
end
|
18
|
+
EOF
|
19
|
+
Guard.start(:guardfile_contents => guard_file)
|
20
|
+
while Guard.running do
|
21
|
+
sleep 0.5
|
22
|
+
end
|
23
|
+
rescue ArgumentError
|
24
|
+
puts "Could open repository. Is it a valid git repository ?"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module GitGuts
|
2
|
+
class Inception < Thor::GitGroup
|
3
|
+
desc 'Shows git inception'
|
4
|
+
def inception
|
5
|
+
1.upto(30) do |level|
|
6
|
+
str = " "*(30-level) + ".git"
|
7
|
+
puts level == 29 ? (str + " <--- 2nd Level Gitception").red : str
|
8
|
+
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
|
data/lib/git_guts/map.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module GitGuts
|
2
|
+
class Map < Thor::GitGroup
|
3
|
+
argument :country, :required => true
|
4
|
+
class_option :full, :aliases => '-f'
|
5
|
+
|
6
|
+
desc 'Shows a map'
|
7
|
+
def map
|
8
|
+
if country.downcase != 'africa'
|
9
|
+
"\nMap for #{ARGV[0]} does not exist\n".red.slow_puts
|
10
|
+
else
|
11
|
+
type = options[:full] ? 'fullmap' : 'map'
|
12
|
+
file_path = File.expand_path("../../../bin/support/#{country}-#{type}.gif", __FILE__)
|
13
|
+
`open file://#{file_path}`
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'git'
|
2
|
+
require 'net/ssh'
|
3
|
+
|
4
|
+
module GitGuts
|
5
|
+
class MultiPush < Thor::GitGroup
|
6
|
+
WORKING_DIRECTORY = Dir.getwd
|
7
|
+
desc 'Creates a remote'
|
8
|
+
argument :remotes, :required => true, :banner => '<Remotes> <Branch>', :desc => 'remotes and branches', :type => :array
|
9
|
+
def create
|
10
|
+
begin
|
11
|
+
raise Thor::Error.new("No branch specified".red) if remotes.size < 2
|
12
|
+
branch = remotes.pop
|
13
|
+
Git.open(WORKING_DIRECTORY)
|
14
|
+
remotes.each do |remote|
|
15
|
+
puts "Pushing #{branch} to #{remote}"
|
16
|
+
puts %x[git push #{remote} #{branch}]
|
17
|
+
raise Thor::Error.new "Push to #{remote} failed" if $?.to_i > 0
|
18
|
+
end
|
19
|
+
rescue ArgumentError
|
20
|
+
raise Thor::Error.new "Could open repository. Is it a valid git repository ?"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'git'
|
2
|
+
|
3
|
+
module GitGuts
|
4
|
+
class Open < Thor::GitGroup
|
5
|
+
desc 'Opens a git object'
|
6
|
+
argument :sha, :required => true, :banner => '<Object SHA>', :type => :string
|
7
|
+
WORKING_DIRECTORY = Dir.getwd
|
8
|
+
def open
|
9
|
+
begin
|
10
|
+
repo = Git.open(WORKING_DIRECTORY)
|
11
|
+
puts repo.object(sha).contents
|
12
|
+
rescue ArgumentError
|
13
|
+
puts "Could open repository. Is it a valid git repository ?"
|
14
|
+
rescue Git::GitExecuteError
|
15
|
+
puts "Not a valid git object"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module GitGuts
|
2
|
+
class Quote < Thor::GitGroup
|
3
|
+
desc 'Quotes a person'
|
4
|
+
argument :name, :required => true, :banner => '<PERSON NAME>', :type => :string
|
5
|
+
|
6
|
+
def quote
|
7
|
+
if name.downcase != 'linus'
|
8
|
+
"\nSorry, I do not know this guy\n".red.slow_puts
|
9
|
+
else
|
10
|
+
DATA.each_line.each_with_index do |msg, i|
|
11
|
+
if i == 4
|
12
|
+
msg.chomp.random_color.slow_puts :delay => 0.015
|
13
|
+
else
|
14
|
+
msg.chomp.random_color.slow_puts
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'rack'
|
2
|
+
require 'git'
|
3
|
+
require 'sinatra'
|
4
|
+
require 'haml'
|
5
|
+
require 'git'
|
6
|
+
require 'filemagic'
|
7
|
+
require 'diffy'
|
8
|
+
require 'thin'
|
9
|
+
|
10
|
+
module GitGuts
|
11
|
+
class Server < Thor::GitGroup
|
12
|
+
desc 'Starts a local git server'
|
13
|
+
class_option :port, :aliases => '-p', :required => true, :type => :numeric
|
14
|
+
class_option :dir, :aliases => '-d', :required => false, :type => :string, :desc => 'Repository directory . Default is current directory'
|
15
|
+
def start
|
16
|
+
repo_dir = (options[:dir] && File.expand_path(options[:dir])) || Dir.getwd
|
17
|
+
puts repo_dir
|
18
|
+
begin
|
19
|
+
options[:dir] ? Git.bare(repo_dir) : Git.open(repo_dir)
|
20
|
+
ENV['RACK_ENV'] = 'production'
|
21
|
+
ENV['GIT_DIR'] = repo_dir
|
22
|
+
ENV['BARE'] = '1' if options[:dir]
|
23
|
+
require 'git_server/lib/git_server_app'
|
24
|
+
Rack::Server.start :app => GitServerApp, :Port => options[:port]
|
25
|
+
rescue ArgumentError
|
26
|
+
puts "Could not start server. Is it a valid git repository ?"
|
27
|
+
else
|
28
|
+
puts "Server closed"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module GitGuts
|
2
|
+
class Test < Thor::GitGroup
|
3
|
+
desc 'Prints out Hello'
|
4
|
+
|
5
|
+
argument :name, :required => true, :banner => 'Please enter a name', :type => :string
|
6
|
+
class_option :verbose, :aliases => '-v'
|
7
|
+
class_option :terbose, :aliases => '-t'
|
8
|
+
def hi
|
9
|
+
puts "Hi #{name} !"
|
10
|
+
puts "How are you today?" if options[:verbose]
|
11
|
+
puts "I am good" if options[:terbose]
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module GitGuts
|
2
|
+
class Welcome < Thor::GitGroup
|
3
|
+
desc 'Gives a big warm welcome'
|
4
|
+
def welcome
|
5
|
+
system 'clear'
|
6
|
+
ask "Did you reduce the font size ? It's really BIGGGGGGGGGGGG".random_color
|
7
|
+
DATA.each_line do |line|
|
8
|
+
line.chomp.slow_puts(:delay => 0.0001)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/git_guts.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
A more interactive way to explore git logs
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module GitServer
|
2
|
+
REPO_PATH = ENV['GIT_DIR'] || Dir.getwd
|
3
|
+
GitRepo = ENV['BARE'] ? Git.bare(REPO_PATH) : Git.open(REPO_PATH)
|
4
|
+
class App < Sinatra::Base
|
5
|
+
get '/' do
|
6
|
+
commits = GitRepo.object('HEAD') && GitRepo.log(100) rescue []
|
7
|
+
haml :index, :locals => {:commits => commits, :repo => GitRepo}
|
8
|
+
end
|
9
|
+
|
10
|
+
get '/commit/:sha' do |sha|
|
11
|
+
commit = GitRepo.gcommit(sha)
|
12
|
+
haml :commit, :layout => false, :locals => {:commit => commit}, :ugly => true
|
13
|
+
end
|
14
|
+
|
15
|
+
get '/tree/:sha' do |sha|
|
16
|
+
tree = GitRepo.gtree(sha)
|
17
|
+
haml :tree, :layout => false, :locals => {:tree => tree}, :ugly => true
|
18
|
+
end
|
19
|
+
|
20
|
+
get '/blob/:sha' do |sha|
|
21
|
+
blob = GitRepo.gblob(sha)
|
22
|
+
@file_type = determine_type(blob, params[:name]) if params[:name]
|
23
|
+
haml :blob, :layout => false, :locals => {:blob => blob}, :ugly => true
|
24
|
+
end
|
25
|
+
|
26
|
+
get '/diff/:sha1/:sha2' do |sha1, sha2|
|
27
|
+
diffs = GitRepo.diff(sha1, sha2)
|
28
|
+
haml :diff, :layout => false, :locals => {:diffs => diffs}, :ugly => true
|
29
|
+
end
|
30
|
+
|
31
|
+
get '*' do
|
32
|
+
haml :'404'
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
helpers do
|
38
|
+
def data_uri(blob)
|
39
|
+
base64 = Base64.encode64(blob.contents).gsub("\n",'')
|
40
|
+
mime = FileMagic.new(FileMagic::MAGIC_MIME).buffer(blob.contents)
|
41
|
+
"data:#{mime};base64,#{base64}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def file_type(blob, name)
|
45
|
+
determine_type(blob, name)
|
46
|
+
end
|
47
|
+
|
48
|
+
def determine_type(blob, name)
|
49
|
+
extname = File.extname(name).downcase
|
50
|
+
if %w[.bmp .gif .jpg .jpeg .png].include?(extname)
|
51
|
+
:image
|
52
|
+
else
|
53
|
+
case FileMagic.new(FileMagic::MAGIC_MIME).buffer(blob.contents)
|
54
|
+
when /image/ then :image
|
55
|
+
when /binary|octet/ then :binary
|
56
|
+
else :text
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative 'version'
|
2
|
+
require 'tempfile'
|
3
|
+
require 'base64'
|
4
|
+
require_relative 'git_server'
|
5
|
+
|
6
|
+
module GitServer
|
7
|
+
|
8
|
+
class App
|
9
|
+
configure do
|
10
|
+
set :root, File.join(File.dirname(__FILE__), '..')
|
11
|
+
set :public_folder, File.join(root, 'public')
|
12
|
+
set :views, File.join(root, 'views')
|
13
|
+
set :environment, :production
|
14
|
+
disable :logging, :sessions
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Repository < Rack::Directory
|
19
|
+
def self.path
|
20
|
+
GitRepo.repo.path
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.url
|
24
|
+
if ENV['BARE']
|
25
|
+
"/#{File.basename File.expand_path(GitRepo.repo.path)}"
|
26
|
+
else
|
27
|
+
"/#{File.basename GitRepo.dir.path}.git"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize
|
32
|
+
super(self.class.path)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
GitServerApp = Rack::URLMap.new('/' => GitServer::App.new,
|
38
|
+
GitServer::Repository.url => GitServer::Repository.new)
|
@@ -0,0 +1 @@
|
|
1
|
+
*.log
|