barkeep-client 0.0.2 → 0.0.3
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/Gemfile.lock +18 -0
- data/barkeep_client.gemspec +7 -7
- data/bin/barkeep +51 -10
- data/lib/barkeep/commit.rb +47 -0
- data/lib/barkeep/constants.rb +3 -0
- data/lib/barkeep/unapproved.rb +81 -0
- metadata +80 -24
data/Gemfile.lock
ADDED
data/barkeep_client.gemspec
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
3
|
|
3
4
|
Gem::Specification.new do |s|
|
4
5
|
s.name = "barkeep-client"
|
5
|
-
s.version = "0.0.
|
6
|
+
s.version = "0.0.3"
|
6
7
|
s.authors = ["Caleb Spare"]
|
7
8
|
s.email = ["caleb@ooyala.com"]
|
8
|
-
s.homepage = ""
|
9
|
-
s.summary = %q{
|
10
|
-
s.description = %q{
|
9
|
+
s.homepage = "https://github.com/ooyala/barkeep"
|
10
|
+
s.summary = %q{Barkeep command-line client}
|
11
|
+
s.description = %q{A command-line client for Barkeep's REST API.}
|
11
12
|
|
12
13
|
s.rubyforge_project = "barkeep-client"
|
13
14
|
|
@@ -16,7 +17,6 @@ Gem::Specification.new do |s|
|
|
16
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
18
|
s.require_paths = ["lib"]
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
# s.add_runtime_dependency "rest-client"
|
20
|
+
s.add_dependency "trollop", "~> 1.16.2"
|
21
|
+
s.add_dependency "dedent", "~> 0.0.2"
|
22
22
|
end
|
data/bin/barkeep
CHANGED
@@ -1,12 +1,53 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
3
|
+
require "rubygems"
|
4
|
+
require "dedent"
|
5
|
+
require "yaml"
|
6
|
+
|
7
|
+
require "barkeep/commit"
|
8
|
+
require "barkeep/unapproved"
|
9
|
+
|
10
|
+
CONFIG_FILE = File.join(ENV["HOME"], ".barkeeprc")
|
11
|
+
|
12
|
+
COMMANDS = {
|
13
|
+
"commit" => "Get information about a particular commit.",
|
14
|
+
"unapproved" => "Find unapproved commits from a list or commit range."
|
15
|
+
}
|
16
|
+
|
17
|
+
sub_command = ARGV.shift
|
18
|
+
unless COMMANDS.include? sub_command
|
19
|
+
puts sub_command ? "Error: unrecognized command '#{sub_command}'" : "Error: must provide command."
|
20
|
+
puts <<-EOS.dedent
|
21
|
+
|
22
|
+
Usage:
|
23
|
+
$ barkeep <command> [args]
|
24
|
+
where <command> is one of:
|
25
|
+
EOS
|
26
|
+
COMMANDS.each { |command, purpose| puts " #{command.rjust(COMMANDS.keys.map(&:size).max)} | #{purpose}" }
|
27
|
+
puts <<-EOS.dedent
|
28
|
+
|
29
|
+
Type 'barkeep <command> --help' for more information about a particular command."
|
30
|
+
EOS
|
31
|
+
exit 1
|
32
|
+
end
|
33
|
+
|
34
|
+
# Load in configuration from ~/.barkeeprc.
|
35
|
+
begin
|
36
|
+
configuration = YAML.load_file CONFIG_FILE
|
37
|
+
rescue
|
38
|
+
puts <<-EOS.dedent
|
39
|
+
Error: #{CONFIG_FILE} must exist to specify barkeep server information, and it must be a valid YAML file.
|
40
|
+
EOS
|
41
|
+
exit 1
|
42
|
+
end
|
43
|
+
|
44
|
+
# Check the configuration
|
45
|
+
REQUIRED_KEYS = %w[barkeep_server]
|
46
|
+
unless REQUIRED_KEYS.each { |key| configuration.include? key }
|
47
|
+
puts "Error: each of the following configuration keys are required in your #{CONFIG_FILE}:"
|
48
|
+
REQUIRED_KEYS.each { |key| puts " #{key}" }
|
49
|
+
exit 1
|
50
|
+
end
|
51
|
+
|
52
|
+
# Delegate to the trollop parsing + client logic that lives in the appropriate subcommand file.
|
53
|
+
BarkeepClient.send sub_command.to_sym, configuration
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "trollop"
|
3
|
+
require "dedent"
|
4
|
+
require "net/http"
|
5
|
+
require "json"
|
6
|
+
|
7
|
+
require "barkeep/constants"
|
8
|
+
|
9
|
+
module BarkeepClient
|
10
|
+
def self.commit(configuration)
|
11
|
+
options = Trollop::options do
|
12
|
+
banner <<-EOS.dedent
|
13
|
+
Barkeep's 'commit' command shows information about a particular commit.
|
14
|
+
|
15
|
+
Usage:
|
16
|
+
$ barkeep commit [options] <commit>
|
17
|
+
where <commit> is specified as a (partial) SHA-1 hash (for the current repo) or as, for example,
|
18
|
+
myrepo/d29a4a0fa
|
19
|
+
to specify a particular repository, and [options] can include:
|
20
|
+
EOS
|
21
|
+
end
|
22
|
+
Trollop::die "must provide a commit sha" unless ARGV.size == 1
|
23
|
+
|
24
|
+
commit = ARGV[0]
|
25
|
+
repo, sha = case commit
|
26
|
+
when %r{^[^/]+/#{SHA_REGEX}$} # foo/abc123
|
27
|
+
commit.split "/"
|
28
|
+
when /^#{SHA_REGEX}$/ # abc123
|
29
|
+
repo = File.basename(`git rev-parse --show-toplevel`).strip
|
30
|
+
if repo.empty?
|
31
|
+
Trollop::die "need to be in a git repo or specify a repository (e.g. myrepo/abc123)"
|
32
|
+
end
|
33
|
+
[repo, commit]
|
34
|
+
else
|
35
|
+
Trollop::die "#{commit} is an invalid commit specification"
|
36
|
+
end
|
37
|
+
uri = URI.parse(File.join(configuration["barkeep_server"], "/api/commits/#{repo}/#{sha}"))
|
38
|
+
result = Net::HTTP.get_response uri
|
39
|
+
if result.code.to_i != 200
|
40
|
+
error = JSON.parse(result.body)["message"] rescue nil
|
41
|
+
puts error ? "Error: #{error}" : "Unspecified server error."
|
42
|
+
exit 1
|
43
|
+
end
|
44
|
+
info = JSON.parse(result.body)
|
45
|
+
info.each { |key, value| puts " #{key.rjust(info.keys.map(&:size).max)}: #{value}" }
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "trollop"
|
3
|
+
require "dedent"
|
4
|
+
require "net/http"
|
5
|
+
require "json"
|
6
|
+
|
7
|
+
require "barkeep/constants"
|
8
|
+
|
9
|
+
module BarkeepClient
|
10
|
+
def self.unapproved(configuration)
|
11
|
+
options = Trollop::options do
|
12
|
+
banner <<-EOS.dedent
|
13
|
+
Barkeep's 'unapproved' command shows information about a particular commit. It MUST be run from a git
|
14
|
+
repository of the same name as the repository on the server.
|
15
|
+
|
16
|
+
Usage:
|
17
|
+
$ barkeep unapproved [options] <commit-range>
|
18
|
+
where <commit-range> is a single git SHA or a commit range specified using git's '..' syntax.
|
19
|
+
For example:
|
20
|
+
|
21
|
+
$ barkeep unapproved abc123
|
22
|
+
$ barkeep unapproved abc123..def456
|
23
|
+
|
24
|
+
[options] can include:
|
25
|
+
EOS
|
26
|
+
opt :stop_on_unapproved, "Stop and print a message on the first unapproved commit."
|
27
|
+
end
|
28
|
+
Trollop::die "must provide a commit range" unless ARGV.size == 1
|
29
|
+
|
30
|
+
repo = File.basename(`git rev-parse --show-toplevel`).strip
|
31
|
+
if repo.empty?
|
32
|
+
Trollop::die "need to be in a git repo"
|
33
|
+
end
|
34
|
+
|
35
|
+
commit_range = ARGV[0]
|
36
|
+
case commit_range
|
37
|
+
when /^#{SHA_REGEX}$/
|
38
|
+
commits_string = `git rev-parse #{commit_range}`
|
39
|
+
when /^#{SHA_REGEX}\.\.(#{SHA_REGEX})?$/, /^\.\.#{SHA_REGEX}$/
|
40
|
+
commits_string = `git log --format='%H' #{commit_range}`
|
41
|
+
else
|
42
|
+
Trollop::die "#{commit_range} is an invalid commit range specification"
|
43
|
+
end
|
44
|
+
exit(1) unless $?.to_i.zero?
|
45
|
+
commits = commits_string.split("\n").map(&:strip)
|
46
|
+
|
47
|
+
if commits.empty?
|
48
|
+
puts "No commits in range."
|
49
|
+
exit 0
|
50
|
+
end
|
51
|
+
|
52
|
+
unapproved_commits = {}
|
53
|
+
commits.each do |sha|
|
54
|
+
uri = URI.parse(File.join(configuration["barkeep_server"], "/api/commits/#{repo}/#{sha}"))
|
55
|
+
result = Net::HTTP.get_response uri
|
56
|
+
if result.code.to_i != 200
|
57
|
+
error = JSON.parse(result.body)["message"] rescue nil
|
58
|
+
puts error ? "Error: #{error}" : "Unspecified server error."
|
59
|
+
exit 1
|
60
|
+
end
|
61
|
+
info = JSON.parse(result.body)
|
62
|
+
next if info["approved"]
|
63
|
+
author_name = `git log --format='%an' #{sha} -n 1`
|
64
|
+
if options[:stop_on_unapproved]
|
65
|
+
puts "Found unapproved commit #{sha} by #{author_name}"
|
66
|
+
exit 1
|
67
|
+
end
|
68
|
+
unapproved_commits[sha] = author_name
|
69
|
+
end
|
70
|
+
|
71
|
+
if unapproved_commits.empty?
|
72
|
+
puts "#{commits.size} approved commit(s) and no unapproved commits in the given range."
|
73
|
+
else
|
74
|
+
puts "#{commits.size - unapproved_commits.size} approved commit(s) and " <<
|
75
|
+
"#{unapproved_commits.size} unapproved commit(s) in the given range."
|
76
|
+
puts "Unapproved:"
|
77
|
+
unapproved_commits.each { |sha, author| puts "#{sha} #{author}" }
|
78
|
+
exit 1
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
metadata
CHANGED
@@ -1,53 +1,109 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: barkeep-client
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Caleb Spare
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
17
|
+
|
18
|
+
date: 2011-12-08 00:00:00 -08:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: trollop
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 83
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 16
|
33
|
+
- 2
|
34
|
+
version: 1.16.2
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: dedent
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 27
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 0
|
49
|
+
- 2
|
50
|
+
version: 0.0.2
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
description: A command-line client for Barkeep's REST API.
|
54
|
+
email:
|
16
55
|
- caleb@ooyala.com
|
17
|
-
executables:
|
56
|
+
executables:
|
18
57
|
- barkeep
|
19
58
|
extensions: []
|
59
|
+
|
20
60
|
extra_rdoc_files: []
|
21
|
-
|
61
|
+
|
62
|
+
files:
|
22
63
|
- .gitignore
|
23
64
|
- .rbenv-version
|
24
65
|
- Gemfile
|
66
|
+
- Gemfile.lock
|
25
67
|
- README.md
|
26
68
|
- Rakefile
|
27
69
|
- barkeep_client.gemspec
|
28
70
|
- bin/barkeep
|
29
|
-
|
71
|
+
- lib/barkeep/commit.rb
|
72
|
+
- lib/barkeep/constants.rb
|
73
|
+
- lib/barkeep/unapproved.rb
|
74
|
+
has_rdoc: true
|
75
|
+
homepage: https://github.com/ooyala/barkeep
|
30
76
|
licenses: []
|
77
|
+
|
31
78
|
post_install_message:
|
32
79
|
rdoc_options: []
|
33
|
-
|
80
|
+
|
81
|
+
require_paths:
|
34
82
|
- lib
|
35
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
84
|
none: false
|
37
|
-
requirements:
|
38
|
-
- -
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
|
41
|
-
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
hash: 3
|
89
|
+
segments:
|
90
|
+
- 0
|
91
|
+
version: "0"
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
93
|
none: false
|
43
|
-
requirements:
|
44
|
-
- -
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
hash: 3
|
98
|
+
segments:
|
99
|
+
- 0
|
100
|
+
version: "0"
|
47
101
|
requirements: []
|
102
|
+
|
48
103
|
rubyforge_project: barkeep-client
|
49
|
-
rubygems_version: 1.
|
104
|
+
rubygems_version: 1.6.2
|
50
105
|
signing_key:
|
51
106
|
specification_version: 3
|
52
|
-
summary:
|
107
|
+
summary: Barkeep command-line client
|
53
108
|
test_files: []
|
109
|
+
|