asgit 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/asgit/config.rb +24 -0
- data/lib/asgit/services.rb +31 -0
- data/lib/asgit/shell.rb +28 -0
- data/lib/asgit/url.rb +25 -0
- data/lib/asgit/version.rb +3 -0
- data/lib/asgit.rb +41 -0
- data/spec/asgit/config_spec.rb +37 -0
- data/spec/asgit/services_spec.rb +27 -0
- data/spec/asgit/url_spec.rb +29 -0
- data/spec/asgit_spec.rb +54 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/support/eat_stdout.rb +4 -0
- data/spec/support/fake_stdout.rb +48 -0
- metadata +67 -0
data/lib/asgit/config.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Asgit
|
2
|
+
class Config
|
3
|
+
attr_accessor :organization, :project
|
4
|
+
|
5
|
+
def service
|
6
|
+
@_service
|
7
|
+
end
|
8
|
+
|
9
|
+
def service= name
|
10
|
+
@_service = Asgit::Services.send(name.to_sym)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
class << self
|
16
|
+
def configure &block
|
17
|
+
yield config
|
18
|
+
end
|
19
|
+
|
20
|
+
def config
|
21
|
+
@_config ||= Config.new
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Asgit
|
2
|
+
module Services
|
3
|
+
|
4
|
+
DATA = {
|
5
|
+
github: {
|
6
|
+
base_url: 'https://github.com',
|
7
|
+
base_structure: "%{base_url}/%{organization}/%{project}",
|
8
|
+
commit_uri: "commit/%{commit}",
|
9
|
+
branch_uri: "tree/%{branch}"
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
DATA.each_key do |service|
|
14
|
+
define_singleton_method(service) do
|
15
|
+
instance_variable_get("@_#{service}") || instance_variable_set("@_#{service}", Service.new( DATA[service] ))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Service
|
20
|
+
|
21
|
+
def initialize data
|
22
|
+
data.each do |attr, val|
|
23
|
+
self.class.send(:define_method, attr) { val }
|
24
|
+
end
|
25
|
+
return self.freeze
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
data/lib/asgit/shell.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'open3'
|
2
|
+
|
3
|
+
module Asgit
|
4
|
+
module Shell
|
5
|
+
|
6
|
+
class << self
|
7
|
+
|
8
|
+
def run command, &block
|
9
|
+
stdout, stderr, status = Open3.capture3(command)
|
10
|
+
|
11
|
+
if status.success?
|
12
|
+
yield stdout if block_given?
|
13
|
+
[ true, stdout, stderr ]
|
14
|
+
else
|
15
|
+
$stderr.puts "Problem running #{command}"
|
16
|
+
$stderr.puts stderr
|
17
|
+
[ false, stdout, stderr ]
|
18
|
+
end
|
19
|
+
rescue StandardError => e
|
20
|
+
$stderr.puts "Problem running '#{command}'"
|
21
|
+
$stderr.puts "#{e.message}"
|
22
|
+
$stderr.puts "#{e.backtrace}"
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
data/lib/asgit/url.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Asgit
|
2
|
+
module Url
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def project
|
7
|
+
Asgit.config.service.base_structure % {
|
8
|
+
base_url: Asgit.config.service.base_url,
|
9
|
+
organization: Asgit.config.organization,
|
10
|
+
project: Asgit.config.project
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
def commit sha
|
15
|
+
File.join( project, Asgit.config.service.commit_uri % { commit: sha } )
|
16
|
+
end
|
17
|
+
|
18
|
+
def branch name
|
19
|
+
File.join( project, Asgit.config.service.branch_uri % { branch: name } )
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
data/lib/asgit.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'asgit/shell'
|
2
|
+
require 'asgit/url'
|
3
|
+
require 'asgit/config'
|
4
|
+
require 'asgit/services'
|
5
|
+
|
6
|
+
module Asgit
|
7
|
+
class << self
|
8
|
+
|
9
|
+
# Check if working tree is clean
|
10
|
+
# @return [Boolean] true if branch is clean
|
11
|
+
def working_tree_clean?
|
12
|
+
Shell.run "git status" do |output|
|
13
|
+
return output.include? "nothing to commit"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Get current git branch based on exec directory
|
18
|
+
# @return [String] the current checked out branch
|
19
|
+
def current_branch
|
20
|
+
Shell.run "git symbolic-ref HEAD" do |output|
|
21
|
+
return output.strip.gsub(/^refs\/heads\//, '')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Get current git commit based on exec directory
|
26
|
+
# @return [String] the current commit level
|
27
|
+
def current_commit
|
28
|
+
Shell.run "git rev-parse HEAD" do |output|
|
29
|
+
return output.strip
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Check if branch is in sync with remote
|
34
|
+
# @return [Boolean]
|
35
|
+
def remote_up_to_date?
|
36
|
+
status, stdout, stderr = Shell.run "git push --dry-run"
|
37
|
+
return status && stderr.include?( "Everything up-to-date" )
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Asgit::Config do
|
4
|
+
|
5
|
+
describe "::config" do
|
6
|
+
it "returns a config" do
|
7
|
+
expect( Asgit.config.class ).to eq Asgit::Config
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "::configure" do
|
12
|
+
it "yields the config" do
|
13
|
+
Asgit.configure do |config|
|
14
|
+
expect( config.class ).to eq Asgit::Config
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "sets attributes on Config" do
|
19
|
+
Asgit.configure do |config|
|
20
|
+
config.project = "woot"
|
21
|
+
end
|
22
|
+
|
23
|
+
expect( Asgit.config.project ).to eq "woot"
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#service" do
|
27
|
+
it "sets as an Asgit::Services::Service" do
|
28
|
+
Asgit.configure do |c|
|
29
|
+
c.service = :github
|
30
|
+
end
|
31
|
+
|
32
|
+
expect( Asgit.config.service.class ).to eq Asgit::Services::Service
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Asgit::Services do
|
4
|
+
|
5
|
+
it "returns a Service for services that exist" do
|
6
|
+
expect( Asgit::Services.github.class ).to eq Asgit::Services::Service
|
7
|
+
end
|
8
|
+
|
9
|
+
it "doesn't redefine a service if it is set" do
|
10
|
+
Asgit::Services.instance_variable_set("@_github", "foo")
|
11
|
+
expect( Asgit::Services.github ).to eq "foo"
|
12
|
+
|
13
|
+
# teardown, just to keep from poluting the rest of the tests
|
14
|
+
Asgit::Services.send(:remove_instance_variable, "@_github")
|
15
|
+
end
|
16
|
+
|
17
|
+
describe Asgit::Services::Service do
|
18
|
+
|
19
|
+
let(:github) { Asgit::Services.github }
|
20
|
+
|
21
|
+
it "returns data for each key" do
|
22
|
+
expect( github.base_url ).to eq "https://github.com"
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Asgit::Url do
|
4
|
+
|
5
|
+
before :all do
|
6
|
+
Asgit.configure do |c|
|
7
|
+
c.organization = "wu"
|
8
|
+
c.project = "tang"
|
9
|
+
c.service = :github
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
after :all do
|
14
|
+
Asgit::Services.send(:remove_instance_variable, "@_github")
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "::commit" do
|
18
|
+
it "returns the correct url for the provided commit" do
|
19
|
+
expect( Asgit::Url.commit "woot" ).to eq "https://github.com/wu/tang/commit/woot"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "::branch" do
|
24
|
+
it "returns the correct url for the provided branch" do
|
25
|
+
expect( Asgit::Url.branch "woot" ).to eq "https://github.com/wu/tang/tree/woot"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/spec/asgit_spec.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Asgit do
|
4
|
+
|
5
|
+
describe "::working_tree_clean?" do
|
6
|
+
it "is true when nothing to commit" do
|
7
|
+
Asgit::Shell.fake_stdout "# On branch master\n" +
|
8
|
+
"nothing to commit, working directory clean" do
|
9
|
+
Asgit.working_tree_clean?.should be_true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
it "is false when tree isn't clean" do
|
13
|
+
Asgit::Shell.fake_stdout "# On branch master\n" +
|
14
|
+
"# Untracked files:\n" +
|
15
|
+
"# (use \"git add <file>...\" to include in what will be committed)\n" +
|
16
|
+
"#\n" +
|
17
|
+
"# foo\n" +
|
18
|
+
"nothing added to commit but untracked files present (use \"git add\" to track)\n" do
|
19
|
+
Asgit.working_tree_clean?.should be_false
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "::current_branch" do
|
25
|
+
it "returns master when on master" do
|
26
|
+
Asgit::Shell.fake_stdout "refs/heads/master" do
|
27
|
+
Asgit.current_branch.should == "master"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "::current_commit" do
|
33
|
+
it "returns current commit" do
|
34
|
+
Asgit::Shell.fake_stdout "12345" do
|
35
|
+
Asgit.current_commit.should == "12345"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "::remote_up_to_date?" do
|
41
|
+
it "returns true if remote is current" do
|
42
|
+
Asgit::Shell.fake_stderr "Everything up-to-date" do
|
43
|
+
Asgit.remote_up_to_date?.should be_true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
it "returns false if remote is out of sync" do
|
47
|
+
Asgit::Shell.fake_stderr "To git@github.com:mailchimp/statistrano.git\n" +
|
48
|
+
"fbe7c67..3cf2934 HEAD -> master" do
|
49
|
+
Asgit.remote_up_to_date?.should be_false
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'pry-debugger'
|
3
|
+
|
4
|
+
require 'asgit'
|
5
|
+
|
6
|
+
require 'support/fake_stdout'
|
7
|
+
require 'support/eat_stdout'
|
8
|
+
|
9
|
+
describe "spec_helper" do
|
10
|
+
describe "Asgit::Shell.fake_stdout" do
|
11
|
+
it "overrides the actual stdout for Asgit::Shell" do
|
12
|
+
Asgit::Shell.fake_stdout "woo" do
|
13
|
+
expect( Asgit::Shell.run("foo")[1] ).to eq "woo"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
describe "Asgit::Shell.fake_stderr" do
|
18
|
+
it "overrides the actual stderr for Asgit::Shell" do
|
19
|
+
Asgit::Shell.fake_stderr "woo" do
|
20
|
+
expect( Asgit::Shell.run("foo")[2] ).to eq "woo"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Asgit
|
2
|
+
module Shell
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def fake_stdout out
|
6
|
+
set_stdout out
|
7
|
+
yield
|
8
|
+
ensure
|
9
|
+
unset_stdout
|
10
|
+
end
|
11
|
+
|
12
|
+
def fake_stderr err
|
13
|
+
set_stderr err
|
14
|
+
yield
|
15
|
+
ensure
|
16
|
+
unset_stderr
|
17
|
+
end
|
18
|
+
|
19
|
+
def patched_run command, &block
|
20
|
+
if @shell_out || @shell_err
|
21
|
+
yield @shell_out if block_given?
|
22
|
+
[ true, @shell_out, @shell_err ]
|
23
|
+
else
|
24
|
+
system_run command, &block
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def set_stdout out
|
29
|
+
@shell_out = out
|
30
|
+
end
|
31
|
+
|
32
|
+
def unset_stdout
|
33
|
+
@shell_out = nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def set_stderr err
|
37
|
+
@shell_err = err
|
38
|
+
end
|
39
|
+
|
40
|
+
def unset_stderr
|
41
|
+
@shell_err = nil
|
42
|
+
end
|
43
|
+
|
44
|
+
alias_method :system_run, :run
|
45
|
+
alias_method :run, :patched_run
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: asgit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Steven Sloan
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-09-06 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: ! ' A simple query interface for git. '
|
15
|
+
email:
|
16
|
+
- stevenosloan@gmail.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- lib/asgit/config.rb
|
22
|
+
- lib/asgit/services.rb
|
23
|
+
- lib/asgit/shell.rb
|
24
|
+
- lib/asgit/url.rb
|
25
|
+
- lib/asgit/version.rb
|
26
|
+
- lib/asgit.rb
|
27
|
+
- spec/asgit/config_spec.rb
|
28
|
+
- spec/asgit/services_spec.rb
|
29
|
+
- spec/asgit/url_spec.rb
|
30
|
+
- spec/asgit_spec.rb
|
31
|
+
- spec/spec_helper.rb
|
32
|
+
- spec/support/eat_stdout.rb
|
33
|
+
- spec/support/fake_stdout.rb
|
34
|
+
homepage: http://github.com/stevenosloan/asgit
|
35
|
+
licenses:
|
36
|
+
- MIT
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
require_paths:
|
40
|
+
- lib
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
none: false
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubyforge_project:
|
55
|
+
rubygems_version: 1.8.25
|
56
|
+
signing_key:
|
57
|
+
specification_version: 3
|
58
|
+
summary: A simple query interface for git
|
59
|
+
test_files:
|
60
|
+
- spec/asgit/config_spec.rb
|
61
|
+
- spec/asgit/services_spec.rb
|
62
|
+
- spec/asgit/url_spec.rb
|
63
|
+
- spec/asgit_spec.rb
|
64
|
+
- spec/spec_helper.rb
|
65
|
+
- spec/support/eat_stdout.rb
|
66
|
+
- spec/support/fake_stdout.rb
|
67
|
+
has_rdoc:
|