termcity 0.5.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/exe/termcity +27 -7
- data/lib/termcity/api.rb +2 -2
- data/lib/termcity/cli.rb +3 -1
- data/lib/termcity/formatters/iterm2.rb +5 -5
- data/lib/termcity/formatters/simple.rb +19 -27
- data/lib/termcity/summary.rb +23 -38
- data/lib/termcity/version.rb +1 -1
- data/termcity.gemspec +2 -2
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c892485b183a6b842bc3423e3e763e46cf7290f0
|
4
|
+
data.tar.gz: 9624a4743a97c74b8615a0ab6131fdedc9f800e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57adcd164a8300e3b36d43a2696c9cde192cd9147fd7c1aef643c8643fb412dd1a09b873ceae23d1679f7663939f48a3dab40ee44f9144c6965827a530f38312
|
7
|
+
data.tar.gz: e2ff976bdf83a13e6341f0bd2e81b509d1a2ae5861bd437906c1fb4447dbdf08b73595d78a631d6292b29c58344573557c2dd024db64ba8c61837b28bf3c6ac0
|
data/exe/termcity
CHANGED
@@ -13,7 +13,8 @@ HELP = <<~TXT
|
|
13
13
|
[Options]
|
14
14
|
|
15
15
|
-b, --branch: defaults to current repo branch
|
16
|
-
-p, --project: defaults to camelcasing repo directory
|
16
|
+
-p, --teamcity-project: defaults to camelcasing repo directory
|
17
|
+
-n, --circleci-reponame: defaults to repo directory
|
17
18
|
-r, --revision: defaults to latest revision known to CI
|
18
19
|
|
19
20
|
[CREDENTIALS]:
|
@@ -51,10 +52,14 @@ OptionParser.new do |opts|
|
|
51
52
|
options[:branch] = b
|
52
53
|
end
|
53
54
|
|
54
|
-
opts.on("-p PROJECT_ID", "--project PROJECT_ID", "The project id (defaults to camelCasing on repo directory)") do |p|
|
55
|
+
opts.on("-p PROJECT_ID", "--teamcity-project PROJECT_ID", "The project id (defaults to camelCasing on repo directory)") do |p|
|
55
56
|
options[:project_id] = p
|
56
57
|
end
|
57
58
|
|
59
|
+
opts.on("-n REPONAME", "--circleci-reponame REPONAME", "The reponame (defaults to repo directory)") do |p|
|
60
|
+
options[:reponame] = p
|
61
|
+
end
|
62
|
+
|
58
63
|
opts.on("-r REVISION", "--revision REVISION", "The git revision to look for (defaults to revision of latest test run)") do |r|
|
59
64
|
options[:revision] = r
|
60
65
|
|
@@ -84,21 +89,35 @@ if !options[:branch]
|
|
84
89
|
end
|
85
90
|
end
|
86
91
|
|
92
|
+
root_dir = nil
|
93
|
+
|
87
94
|
if !options[:project_id]
|
88
|
-
root_dir
|
89
|
-
|
95
|
+
root_dir ||=
|
96
|
+
File.basename(
|
97
|
+
`git rev-parse --show-toplevel`
|
90
98
|
.chomp
|
91
99
|
.tap { raise "detecting root dir failed" unless $?==0}
|
100
|
+
)
|
92
101
|
|
93
102
|
camelcase_root_dir =
|
94
|
-
|
95
|
-
.basename(root_dir)
|
103
|
+
root_dir
|
96
104
|
.sub(/^[a-z\d]*/) { $&.capitalize }
|
97
105
|
.gsub(/(?:_|(\/))([a-z\d]*)/) { $2.capitalize }
|
98
106
|
|
99
107
|
options[:project_id] = camelcase_root_dir
|
100
108
|
end
|
101
109
|
|
110
|
+
if !options[:reponame]
|
111
|
+
root_dir ||=
|
112
|
+
File.basename(
|
113
|
+
`git rev-parse --show-toplevel`
|
114
|
+
.chomp
|
115
|
+
.tap { raise "detecting root dir failed" unless $?==0}
|
116
|
+
)
|
117
|
+
|
118
|
+
options[:reponame] = root_dir
|
119
|
+
end
|
120
|
+
|
102
121
|
creds_file = File.expand_path("~/.termcity")
|
103
122
|
if !File.exist?(creds_file)
|
104
123
|
warn "Could not find a credentials file. See --help for info."
|
@@ -122,5 +141,6 @@ Termcity::CLI.simple_format(
|
|
122
141
|
host: yaml["host"],
|
123
142
|
branch: options[:branch],
|
124
143
|
revision: options[:revision],
|
125
|
-
project_id: options[:project_id]
|
144
|
+
project_id: options[:project_id],
|
145
|
+
reponame: options[:reponame]
|
126
146
|
)
|
data/lib/termcity/api.rb
CHANGED
@@ -19,8 +19,8 @@ module Termcity
|
|
19
19
|
@host = host
|
20
20
|
end
|
21
21
|
|
22
|
-
def summary(branch:, project_id:, revision:)
|
23
|
-
path = "/builds?branch=#{branch}&project_id=#{project_id}"
|
22
|
+
def summary(branch:, project_id:, revision:, reponame:)
|
23
|
+
path = "/builds?branch=#{branch}&project_id=#{project_id}&reponame=#{reponame}"
|
24
24
|
path = "#{path}&revision=#{revision}" if revision
|
25
25
|
url = URI.join(@host, path).to_s
|
26
26
|
get(url)
|
data/lib/termcity/cli.rb
CHANGED
@@ -10,12 +10,13 @@ module Termcity
|
|
10
10
|
new(**args).simple_format
|
11
11
|
end
|
12
12
|
|
13
|
-
def initialize(branch:, token:, host:, project_id:, revision:)
|
13
|
+
def initialize(branch:, token:, host:, project_id:, revision:, reponame:)
|
14
14
|
@branch = branch
|
15
15
|
@token = token
|
16
16
|
@host = host
|
17
17
|
@project_id = project_id
|
18
18
|
@revision = revision
|
19
|
+
@reponame = reponame
|
19
20
|
end
|
20
21
|
|
21
22
|
def simple_format
|
@@ -29,6 +30,7 @@ module Termcity
|
|
29
30
|
branch: @branch,
|
30
31
|
revision: @revision,
|
31
32
|
project_id: @project_id,
|
33
|
+
reponame: @reponame,
|
32
34
|
)
|
33
35
|
|
34
36
|
formatter =
|
@@ -11,15 +11,15 @@ module Termcity
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def format(summary)
|
14
|
-
rows = summary.builds.map do |
|
14
|
+
rows = summary.builds.map do |build|
|
15
15
|
cols = []
|
16
16
|
|
17
|
-
text = simple_formatter.status_string(
|
18
|
-
"#{linkify(t,
|
17
|
+
text = simple_formatter.status_string(build) { |t|
|
18
|
+
"#{linkify(t, build.fetch("web_url"))}#{" "*(10-t.length)}"
|
19
19
|
}
|
20
20
|
|
21
|
-
cols << linkify(text,
|
22
|
-
cols <<
|
21
|
+
cols << linkify(text, build.fetch("web_url"))
|
22
|
+
cols << build.fetch("build_type")
|
23
23
|
cols.join(" ")
|
24
24
|
end
|
25
25
|
|
@@ -5,22 +5,13 @@ module Termcity
|
|
5
5
|
class Simple
|
6
6
|
include Utils::Color
|
7
7
|
|
8
|
-
STATUSES = {
|
9
|
-
queued: "queued",
|
10
|
-
failing: "failing",
|
11
|
-
running: "running",
|
12
|
-
failed_to_start: "failstrt",
|
13
|
-
failed: "failed",
|
14
|
-
success: "success"
|
15
|
-
}
|
16
|
-
|
17
8
|
COLORS = {
|
18
|
-
failing
|
19
|
-
queued
|
20
|
-
running
|
21
|
-
|
22
|
-
failed
|
23
|
-
success
|
9
|
+
"failing" => :red,
|
10
|
+
"queued" => :yellow,
|
11
|
+
"running" => :blue,
|
12
|
+
"failstrt" => :default,
|
13
|
+
"failed" => :red,
|
14
|
+
"success" => :green
|
24
15
|
}
|
25
16
|
|
26
17
|
attr_reader :io
|
@@ -29,22 +20,22 @@ module Termcity
|
|
29
20
|
end
|
30
21
|
|
31
22
|
def format(summary)
|
32
|
-
rows = summary.builds.map
|
23
|
+
rows = summary.builds.map { |build|
|
33
24
|
cols = []
|
34
|
-
cols << status_string(
|
35
|
-
cols <<
|
36
|
-
cols <<
|
25
|
+
cols << status_string(build)
|
26
|
+
cols << build.fetch("build_type")
|
27
|
+
cols << build.fetch("web_url")
|
37
28
|
|
38
29
|
cols.join(" : ")
|
39
|
-
|
30
|
+
}
|
40
31
|
|
41
32
|
@io.puts(summarize(summary, rows))
|
42
33
|
end
|
43
34
|
|
44
|
-
def status_string(
|
45
|
-
name =
|
46
|
-
name = "#{name},q" if re_enqueued
|
47
|
-
color = COLORS[
|
35
|
+
def status_string(build)
|
36
|
+
name = build.fetch("status")
|
37
|
+
name = "#{name},q" if build.fetch("re_enqueued")
|
38
|
+
color = COLORS[build.fetch("status")]
|
48
39
|
|
49
40
|
text =
|
50
41
|
if block_given?
|
@@ -62,12 +53,13 @@ module Termcity
|
|
62
53
|
"This revision may still be in the queue (or may be unkown/old)"
|
63
54
|
else
|
64
55
|
|
65
|
-
revision = summary.builds.map {|b| b.dig(
|
56
|
+
revision = summary.builds.map {|b| b.dig("sha")}.compact.first
|
66
57
|
[
|
67
58
|
rows,
|
68
59
|
"",
|
69
60
|
"Revision: #{revision}",
|
70
|
-
"Overview: #{summary.
|
61
|
+
"Teamcity Overview: #{summary.teamcity_link}",
|
62
|
+
"CircleCI Overview: #{summary.circle_link}",
|
71
63
|
counts(summary),
|
72
64
|
].join("\n")
|
73
65
|
end
|
@@ -79,7 +71,7 @@ module Termcity
|
|
79
71
|
["Success", summary.counts[:success]],
|
80
72
|
["Failure", summary.counts[:failure]],
|
81
73
|
["Running", summary.counts[:running]],
|
82
|
-
["FailedToStart", summary.counts[:
|
74
|
+
["FailedToStart", summary.counts[:failstrt]],
|
83
75
|
["Queued", summary.counts[:queued]],
|
84
76
|
["Re-Queued", summary.counts[:re_enqueued]]
|
85
77
|
]
|
data/lib/termcity/summary.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module Termcity
|
2
2
|
class Summary
|
3
|
-
def initialize(revision:, api:, branch:, project_id:)
|
3
|
+
def initialize(revision:, api:, branch:, project_id:, reponame:)
|
4
4
|
@branch = branch
|
5
5
|
@project_id = project_id
|
6
6
|
@api = api
|
7
7
|
@revision = revision
|
8
|
+
@reponame = reponame
|
8
9
|
end
|
9
10
|
|
10
11
|
def builds
|
@@ -15,8 +16,12 @@ module Termcity
|
|
15
16
|
data[:counts]
|
16
17
|
end
|
17
18
|
|
18
|
-
def
|
19
|
-
data.dig(:links, :
|
19
|
+
def teamcity_link
|
20
|
+
data.dig(:links, :teamcity_overview)
|
21
|
+
end
|
22
|
+
|
23
|
+
def circle_link
|
24
|
+
data.dig(:links, :circle_overview)
|
20
25
|
end
|
21
26
|
|
22
27
|
def data
|
@@ -28,18 +33,26 @@ module Termcity
|
|
28
33
|
failure: 0,
|
29
34
|
running: 0,
|
30
35
|
queued: 0,
|
31
|
-
|
36
|
+
failstrt: 0,
|
32
37
|
re_enqueued: 0,
|
33
38
|
}
|
34
39
|
|
35
|
-
summary = @api.summary(
|
40
|
+
summary = @api.summary(
|
41
|
+
branch: @branch,
|
42
|
+
project_id: @project_id,
|
43
|
+
revision: @revision,
|
44
|
+
reponame: @reponame
|
45
|
+
)
|
36
46
|
|
37
47
|
builds = summary.fetch("builds")
|
38
48
|
.sort_by {|b| b.fetch("build_type")}
|
39
49
|
.map {|b| summarize(b, counts) }
|
40
50
|
|
41
51
|
{
|
42
|
-
links: {
|
52
|
+
links: {
|
53
|
+
teamcity_overview: summary.dig("links", "teamcity_overview"),
|
54
|
+
circle_overview: summary.dig("links", "circle_overview")
|
55
|
+
},
|
43
56
|
builds: builds,
|
44
57
|
counts: counts
|
45
58
|
}
|
@@ -47,44 +60,16 @@ module Termcity
|
|
47
60
|
end
|
48
61
|
|
49
62
|
def summarize(build, counts)
|
50
|
-
status = status(build)
|
51
|
-
|
52
63
|
count_type =
|
53
|
-
if [
|
64
|
+
if ["failing", "failed"].include?(build.fetch("status"))
|
54
65
|
:failure
|
55
66
|
else
|
56
|
-
status
|
67
|
+
build.fetch("status").to_sym
|
57
68
|
end
|
58
69
|
counts[count_type] += 1
|
59
70
|
counts[:total] += 1
|
60
|
-
counts[:re_enqueued] +=1 if
|
61
|
-
|
62
|
-
{
|
63
|
-
raw: build,
|
64
|
-
status: status
|
65
|
-
}
|
66
|
-
end
|
67
|
-
|
68
|
-
def status(build)
|
69
|
-
re_enqueued = build.fetch("re_enqueued")
|
70
|
-
|
71
|
-
if build.fetch("state") == "queued"
|
72
|
-
{type: :queued, re_enqueued: false}
|
73
|
-
elsif build.fetch("state") == "running"
|
74
|
-
if build.fetch("status") == "FAILURE"
|
75
|
-
{type: :failing, re_enqueued: re_enqueued}
|
76
|
-
else
|
77
|
-
{type: :running, re_enqueued: re_enqueued}
|
78
|
-
end
|
79
|
-
else
|
80
|
-
if build.fetch("failed_to_start", false)
|
81
|
-
{type: :failed_to_start, re_enqueued: re_enqueued}
|
82
|
-
elsif build.fetch("status") == "FAILURE"
|
83
|
-
{type: :failed, re_enqueued: re_enqueued}
|
84
|
-
else
|
85
|
-
{type: :success, re_enqueued: re_enqueued}
|
86
|
-
end
|
87
|
-
end
|
71
|
+
counts[:re_enqueued] +=1 if build.fetch("re_enqueued")
|
72
|
+
build
|
88
73
|
end
|
89
74
|
end
|
90
75
|
end
|
data/lib/termcity/version.rb
CHANGED
data/termcity.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Pete Kinnecom"]
|
10
10
|
spec.email = ["git@k7u7.com"]
|
11
11
|
|
12
|
-
spec.summary = %q{Terminal view of TeamCity}
|
13
|
-
spec.description = %q{See TeamCity build status for a branch in your terminal. Pipe it to grep or whatever. Get nicely formatted links if you use iTerm2.}
|
12
|
+
spec.summary = %q{Terminal view of TeamCity/CircleCI}
|
13
|
+
spec.description = %q{See TeamCity/CircleCI build status for a branch in your terminal. Pipe it to grep or whatever. Get nicely formatted links if you use iTerm2.}
|
14
14
|
# spec.homepage = "none"
|
15
15
|
|
16
16
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: termcity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pete Kinnecom
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,8 +38,8 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
|
-
description: See TeamCity build status for a branch in your terminal. Pipe
|
42
|
-
or whatever. Get nicely formatted links if you use iTerm2.
|
41
|
+
description: See TeamCity/CircleCI build status for a branch in your terminal. Pipe
|
42
|
+
it to grep or whatever. Get nicely formatted links if you use iTerm2.
|
43
43
|
email:
|
44
44
|
- git@k7u7.com
|
45
45
|
executables:
|
@@ -85,5 +85,5 @@ rubyforge_project:
|
|
85
85
|
rubygems_version: 2.5.2
|
86
86
|
signing_key:
|
87
87
|
specification_version: 4
|
88
|
-
summary: Terminal view of TeamCity
|
88
|
+
summary: Terminal view of TeamCity/CircleCI
|
89
89
|
test_files: []
|