-
Notifications
You must be signed in to change notification settings - Fork 250
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
🎨 Add rainbow colouring of steps label #290
🎨 Add rainbow colouring of steps label #290
Conversation
The following is the coverage report on pkg/.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I love this😄
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: chmouel, gavinfish The full list of commands accepted by this bot can be found here. The pull request process is described here
Needs approval from an approver in each of these files:
Approvers can indicate their approval by writing |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice 👍🏼 one comment though 😅
pkg/formatted/color.go
Outdated
func (rc *RainbowColors) Get(label string) *color.Color { | ||
if _, ok := rc.cached[label]; !ok { | ||
rc.cached[label] = rc.all[rc.current] | ||
rc.current++ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There might be a race here if this is called in different goroutine 🤔
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah i tough about that but since we werent using it i didn't follow tough, what do you suggest? external lib for locking etc...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
and fyi i did test it with -race
and it was running well but i'll just sync/lock/release it in case off,
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@chmouel right, we might not be in the case of race condition in the cli, but if somebody uses this might hit it
92af56a
to
d51799c
Compare
The following is the coverage report on pkg/.
|
pkg/formatted/color.go
Outdated
if _, ok := rc.cached[label]; !ok { | ||
rc.cached[label] = rc.all[rc.current] | ||
rc.current++ | ||
if rc.current >= len(rc.all) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: usually this is done using rc.current = (rc.current +1) % len(rc.all)
without having the need for an if
pkg/formatted/color.go
Outdated
} | ||
|
||
func (rc *RainbowColors) Get(label string) *color.Color { | ||
mux.Lock() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
mux must be part of the rc
and not a package level variable; this allows for mulitple RainbowColors to be used without having one instance to wait for another instance.
pkg/formatted/color.go
Outdated
|
||
func (rc *RainbowColors) Get(label string) *color.Color { | ||
mux.Lock() | ||
defer mux.Unlock() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it is better to use Rlock
and RWlocks
pkg/formatted/color.go
Outdated
|
||
"github.com/fatih/color" | ||
) | ||
|
||
var ( | ||
mux sync.Mutex |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
mux should be instance variable and not package var since it only locks the rc.cached
and not a package level variable.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
❤️ Neat!
some comments about sync.Mutex
that needs addressing.
d51799c
to
d3d9e95
Compare
The following is the coverage report on pkg/.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/lgtm
/meow boxes
In response to this:
Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. |
/hold |
pkg/formatted/color.go
Outdated
} | ||
|
||
var ( | ||
allColors = []color.Attribute{ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
red is avoided since we keep it for error messages, (probably should have put this in the comment instead of here)
pkg/formatted/color.go
Outdated
|
||
"github.com/fatih/color" | ||
) | ||
|
||
type counter struct { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
when I mentione RLock and Lock() I was hinting to having a single mutex in the rainbow. which will be RLocked for checking if the item is in cache and if not, Lock() to add the item in cache. but i like your implementation to create a round robin counter but for the counter itself, Get
and increase
isn't quite as useful as just a next
which returns the next value.
please consider one of these implemention for counter. 1. that uses atomic, the other that uses a mutex
type atomicCounter struct {
value uint32
threshold int
}
func (c *atomicCounter) next() int {
v := atomic.AddUint32(&c.value, 1)
next := int(v-1) % c.threshold
atomic.CompareAndSwapUint32(&c.value, uint32(c.threshold), 0)
return next
}
type counter struct {
value int
threshold int
m sync.Mutex
}
func (c *counter) next() int {
c.m.Lock()
defer c.m.Unlock()
v := c.value
c.value = (v + 1) % c.threshold
return v
}
and the rainbow would be some what like this
type rainbow struct {
cache sync.Map
counter counter
}
func newRainbow() *rainbow {
return &rainbow{
counter: counter{threshold: len(palette)},
}
}
func (r *rainbow) colorFor(x string) color {
if value, ok := r.cache.Load(x); ok {
return value.(color)
}
clr := palette[r.counter.next()]
r.cache.Store(x, clr)
return clr
}
We were showing the same blue color for every steps, let's now cycle of a list of colors. Signed-off-by: Chmouel Boudjnah <[email protected]>
d3d9e95
to
ce502af
Compare
The following is the coverage report on pkg/.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
looks good to me expect for the Fprintf
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/lgtm
#290 | [Chmouel Boudjnah] Add rainbow colouring of the steps | 2019/09/08-05:36 #292 | [danielhelfand] add SilenceUsage: true to root.go | 2019/09/08-22:11 #293 | [Carlos Santana] Update install instructions in readme to 0.3.1 | 2019/09/08-23:39 #279 | [16yuki0702] Add deletion scenario to e2e test | 2019/09/09-02:17 #279 | [16yuki0702] Fix to use -f flag | 2019/09/09-02:17 #300 | [Chmouel Boudjnah] Use a older version of thrift | 2019/09/09-08:48 #300 | [Chmouel Boudjnah] Don't run go mod vendor on every build | 2019/09/09-08:48 #301 | [Chmouel Boudjnah] E2E tests fixes | 2019/09/09-12:00 #303 | [danielhelfand] add taskrun describe command | 2019/09/10-02:15 #304 | [16yuki0702] Fix document typos | 2019/09/10-04:45 null | [Piyush Garg] Fix interactive prompt with --last | 2019/09/10-07:04 null | [16yuki0702] Add canceling feature to taskrun command | 2019/09/10-08:23 null | [Chmouel Boudjnah] Improve release script | 2019/09/11-10:35 null | [Sunil Thaha] Doc: Improve taskrun help example | 2019/09/12-02:09 null | [Piyush Garg] Fix -n not working with pipeline logs | 2019/09/12-02:23 null | [Piyush Garg] Show descriptive failure message | 2019/09/12-03:36 null | [danielhelfand] change error message returned by task for namespace | 2019/09/16-06:48 null | [Chmouel Boudjnah] Add a Tasrun to build rpm. | 2019/09/17-01:52 null | [Chmouel Boudjnah] Add information about copr rpm package repo in README | 2019/09/17-01:52 null | [Chmouel Boudjnah] Use khuram spec files which does a proper source build | 2019/09/17-01:52 null | [Chmouel Boudjnah] Update README with distros supported for dnf install | 2019/09/17-01:52 null | [Nikhil Thomas] Fix CI breakage | 2019/09/19-23:57 null | [Andrea Frittoli] Fix the logs command when creating a pipelinerun | 2019/09/20-01:57 null | [16yuki0702] Adding missing copyright header | 2019/09/23-04:47 null | [danielhelfand] correct copr package section typos | 2019/09/23-08:38 null | [danielhelfand] align pipeline describe output with other describe commands | 2019/09/24-04:58 null | [Chmouel Boudjnah] Add no colour option | 2019/09/24-05:24 null | [Chmouel Boudjnah] Disable nocolour test | 2019/09/24-05:24 null | [Chmouel Boudjnah] Generate documentation | 2019/09/24-05:24 null | [danielhelfand] align output with task describe command | 2019/09/24-05:36 null | [cappyzawa] fix misspell based on https://goreportcard.com/report/github.com/tektoncd/cli#misspell | 2019/09/24-06:20 null | [danielhelfand] add check to taskrun cancel for already executed taskrun | 2019/09/24-07:56 null | [Pradeep Kumar] Common method to get last run for a pipeline | 2019/09/24-08:17 null | [Pradeep Kumar] correts imports order | 2019/09/24-08:17 null | [Andrea Frittoli] Improve the error message on pipeline create | 2019/09/24-09:40 null | [Andrea Frittoli] Fix the logs command when creating a pipelinerun | 2019/09/24-09:40 null | [danielhelfand] add check to pipelinerun cancel for already executed pipelinerun | 2019/09/25-09:11 null | [Vincent Demeester] Bump tektoncd/pipeline to 0.7.x | 2019/09/25-10:02 null | [Vincent Demeester] bump github.com/AlecAivazis/survey/v2 to v2.0.4 | 2019/09/25-10:02 null | [Khurram Baig] Add Vendored Dependencies to RPM Spec | 2019/09/26-03:03 Signed-off-by: Chmouel Boudjnah <[email protected]>
We were showing the same blue color for every steps, let's now cycle of a list of
colors.
Demo: https://asciinema.org/a/hbJk1PqMFE8hleRpDsraPw0WB
Closes #285
Release Notes