From f3c759655aaffb1f6cbbc42e22182501d25c13f0 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Mon, 4 Nov 2019 17:17:36 -0600 Subject: [PATCH 001/911] init --- .gitignore | 1 + cmd/gold/main.go | 28 ++++++++ go.mod | 9 +++ go.sum | 6 ++ gold.go | 166 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 210 insertions(+) create mode 100644 .gitignore create mode 100644 cmd/gold/main.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 gold.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1d90896 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +cmd/gold/gold diff --git a/cmd/gold/main.go b/cmd/gold/main.go new file mode 100644 index 0000000..09b73fe --- /dev/null +++ b/cmd/gold/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "fmt" + + "github.com/magicnumbers/gold" + bf "gopkg.in/russross/blackfriday.v2" +) + +const tmd = ` +# Test + +This is a test yo. + +## Dude! + +* one +* two +* three + +[yoda](http://flame.com) +` + +func main() { + r := gold.TermRenderer{} + out := bf.Run([]byte(tmd), bf.WithRenderer(&r)) + fmt.Println(string(out)) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d4fbb09 --- /dev/null +++ b/go.mod @@ -0,0 +1,9 @@ +module github.com/magicnumbers/gold + +go 1.13 + +require ( + github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 + github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect + gopkg.in/russross/blackfriday.v2 v2.0.0 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..58da90e --- /dev/null +++ b/go.sum @@ -0,0 +1,6 @@ +github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 h1:im9kkmH0WWwxzegiv18gSUJbuXR9y028rXrWuPp6Jug= +github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +gopkg.in/russross/blackfriday.v2 v2.0.0 h1:+FlnIV8DSQnT7NZ43hcVKcdJdzZoeCmJj4Ql8gq5keA= +gopkg.in/russross/blackfriday.v2 v2.0.0/go.mod h1:6sSBNz/GtOm/pJTuh5UmBK2ZHfmnxGbl2NZg1UliSOI= diff --git a/gold.go b/gold.go new file mode 100644 index 0000000..530fbe6 --- /dev/null +++ b/gold.go @@ -0,0 +1,166 @@ +package gold + +import ( + "fmt" + "io" + "strconv" + "strings" + + "github.com/logrusorgru/aurora" + bf "gopkg.in/russross/blackfriday.v2" +) + +type RuleKey int + +const ( + Color RuleKey = iota + BackgroundColor + Underline + Bold + Italic + CrossedOut + Faint + Conceal + Overlined + Inverse + Blink +) + +type TermRenderer struct { + style map[bf.NodeType]map[RuleKey]string +} + +func BaseString(node *bf.Node) string { + switch node.Type { + case bf.Document: + return "" + case bf.BlockQuote: + return fmt.Sprintf("```\n%s\n```", string(node.Literal)) + case bf.List: + return "" + case bf.Item: + return fmt.Sprintf("* %s", string(node.Literal)) + case bf.Paragraph: + if node.Prev != nil && node.Prev.Type != bf.Link { + return "\n" + } else { + return "" + } + case bf.Heading: + return fmt.Sprintf("%s ", strings.Repeat("#", node.HeadingData.Level)) + case bf.HorizontalRule: + return "---\n" + case bf.Emph: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.Strong: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.Del: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.Link: + return fmt.Sprintf("[%s](%s)\n", string(node.LastChild.Literal), string(node.LinkData.Destination)) + case bf.Image: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.Text: + if node.Parent != nil && node.Parent.Type != bf.Link { + return fmt.Sprintf("%s\n", string(node.Literal)) + } else { + return "" + } + case bf.HTMLBlock: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.CodeBlock: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.Softbreak: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.Hardbreak: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.Code: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.HTMLSpan: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.Table: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.TableCell: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.TableHead: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.TableBody: + return fmt.Sprintf("%s\n", string(node.Literal)) + case bf.TableRow: + return fmt.Sprintf("%s\n", string(node.Literal)) + default: + return "" + } + +} + +func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { + if !entering { + return bf.GoToNext + } + text := BaseString(node) + if text == "" { + return bf.GoToNext + } + rules := tr.style[node.Type] + if len(rules) == 0 { + fmt.Fprintf(w, "%s", text) + return bf.GoToNext + } + out := aurora.Reset(text) + if r, ok := rules[Color]; ok { + i, err := strconv.Atoi(r) + if err == nil && i >= 0 && i <= 255 { + out = out.Index(uint8(i)) + } + } + if r, ok := rules[BackgroundColor]; ok { + i, err := strconv.Atoi(r) + if err == nil && i >= 0 && i <= 255 { + out = out.Index(uint8(i)) + } + } + if r, ok := rules[Underline]; ok { + if r == "true" { + out = out.Underline() + } + } + if r, ok := rules[Bold]; ok { + if r == "true" { + out = out.Bold() + } + } + if r, ok := rules[Italic]; ok { + if r == "true" { + out = out.Italic() + } + } + if r, ok := rules[CrossedOut]; ok { + if r == "true" { + out = out.CrossedOut() + } + } + if r, ok := rules[Overlined]; ok { + if r == "true" { + out = out.Overlined() + } + } + if r, ok := rules[Inverse]; ok { + if r == "true" { + out = out.Reverse() + } + } + if r, ok := rules[Blink]; ok { + if r == "true" { + out = out.Blink() + } + } + w.Write([]byte(aurora.Sprintf("%s", out))) + return bf.GoToNext +} + +func (tr *TermRenderer) RenderHeader(w io.Writer, ast *bf.Node) { +} + +func (tr *TermRenderer) RenderFooter(w io.Writer, ast *bf.Node) { +} From 9da65bd2dad6958d749b6a6918e926bfac621f66 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Mon, 4 Nov 2019 17:17:36 -0600 Subject: [PATCH 002/911] init --- main.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 main.go diff --git a/main.go b/main.go new file mode 100644 index 0000000..09b73fe --- /dev/null +++ b/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "fmt" + + "github.com/magicnumbers/gold" + bf "gopkg.in/russross/blackfriday.v2" +) + +const tmd = ` +# Test + +This is a test yo. + +## Dude! + +* one +* two +* three + +[yoda](http://flame.com) +` + +func main() { + r := gold.TermRenderer{} + out := bf.Run([]byte(tmd), bf.WithRenderer(&r)) + fmt.Println(string(out)) +} From a89ebe80b561fef140be2184475509fbb581dd15 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Sat, 9 Nov 2019 14:07:01 -0600 Subject: [PATCH 003/911] Load style from json --- cmd/gold/dark.json | 10 ++ cmd/gold/main.go | 12 ++- gold.go | 229 ++++++++++++++++++++++++++++++++------------- 3 files changed, 182 insertions(+), 69 deletions(-) create mode 100644 cmd/gold/dark.json diff --git a/cmd/gold/dark.json b/cmd/gold/dark.json new file mode 100644 index 0000000..e760449 --- /dev/null +++ b/cmd/gold/dark.json @@ -0,0 +1,10 @@ +{ + "link": { + "color": "123", + "underline": true + }, + "heading": { + "bold": true, + "inverse": true + } +} diff --git a/cmd/gold/main.go b/cmd/gold/main.go index 09b73fe..fc0eab9 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -1,7 +1,9 @@ package main import ( + "flag" "fmt" + "os" "github.com/magicnumbers/gold" bf "gopkg.in/russross/blackfriday.v2" @@ -22,7 +24,13 @@ This is a test yo. ` func main() { - r := gold.TermRenderer{} - out := bf.Run([]byte(tmd), bf.WithRenderer(&r)) + s := flag.String("s", "", "style json path") + flag.Parse() + r, err := gold.NewTermRenderer(*s) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + out := bf.Run([]byte(tmd), bf.WithRenderer(r)) fmt.Println(string(out)) } diff --git a/gold.go b/gold.go index 530fbe6..a0319c0 100644 --- a/gold.go +++ b/gold.go @@ -1,8 +1,11 @@ package gold import ( + "encoding/json" "fmt" "io" + "io/ioutil" + "os" "strconv" "strings" @@ -26,134 +29,171 @@ const ( Blink ) -type TermRenderer struct { - style map[bf.NodeType]map[RuleKey]string +type ElementStyle struct { + Color string `json:"color"` + BackgroundColor string `json:"background_color"` + Underline bool `json:"underline"` + Bold bool `json:"bold"` + Italic bool `json:"italic"` + CrossedOut bool `json:"crossed_out"` + Faint bool `json:"faint"` + Conceal bool `json:"conceal"` + Overlined bool `json:"overlined"` + Inverse bool `json:"inverse"` + Blink bool `json:"blink"` } -func BaseString(node *bf.Node) string { +type Element struct { + BaseString string +} + +type TermRenderer struct { + style map[bf.NodeType]*ElementStyle +} + +func NewElement(node *bf.Node) Element { switch node.Type { case bf.Document: - return "" + return Element{""} case bf.BlockQuote: - return fmt.Sprintf("```\n%s\n```", string(node.Literal)) + return Element{fmt.Sprintf("```\n%s\n```", string(node.Literal))} case bf.List: - return "" + return Element{""} case bf.Item: - return fmt.Sprintf("* %s", string(node.Literal)) + return Element{fmt.Sprintf("* %s", string(node.Literal))} case bf.Paragraph: if node.Prev != nil && node.Prev.Type != bf.Link { - return "\n" + return Element{"\n"} } else { - return "" + return Element{""} } case bf.Heading: - return fmt.Sprintf("%s ", strings.Repeat("#", node.HeadingData.Level)) + return Element{fmt.Sprintf("%s ", strings.Repeat("#", node.HeadingData.Level))} case bf.HorizontalRule: - return "---\n" + return Element{"---\n"} case bf.Emph: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.Strong: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.Del: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.Link: - return fmt.Sprintf("[%s](%s)\n", string(node.LastChild.Literal), string(node.LinkData.Destination)) + return Element{fmt.Sprintf("[%s](%s)\n", string(node.LastChild.Literal), string(node.LinkData.Destination))} case bf.Image: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.Text: if node.Parent != nil && node.Parent.Type != bf.Link { - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} } else { - return "" + return Element{""} } case bf.HTMLBlock: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.CodeBlock: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.Softbreak: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.Hardbreak: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.Code: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.HTMLSpan: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.Table: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.TableCell: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.TableHead: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.TableBody: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} case bf.TableRow: - return fmt.Sprintf("%s\n", string(node.Literal)) + return Element{fmt.Sprintf("%s\n", string(node.Literal))} default: - return "" + return Element{""} } } +func NewTermRenderer(stylePath string) (*TermRenderer, error) { + if stylePath == "" { + return NewTermRendererFromBytes([]byte("{}")) + } + f, err := os.Open(stylePath) + if err != nil { + return nil, err + } + defer f.Close() + b, _ := ioutil.ReadAll(f) + return NewTermRendererFromBytes(b) +} + +func NewTermRendererFromBytes(b []byte) (*TermRenderer, error) { + e := make(map[string]*ElementStyle, 0) + err := json.Unmarshal(b, &e) + if err != nil { + return nil, err + } + tr := &TermRenderer{} + tr.style = make(map[bf.NodeType]*ElementStyle) + + for k, v := range e { + t, err := keyToType(k) + if err != nil { + fmt.Println(err) + continue + } + tr.style[t] = v + } + return tr, nil +} + func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { if !entering { return bf.GoToNext } - text := BaseString(node) - if text == "" { + el := NewElement(node) + if el.BaseString == "" { return bf.GoToNext } rules := tr.style[node.Type] - if len(rules) == 0 { - fmt.Fprintf(w, "%s", text) + if rules == nil { + fmt.Fprintf(w, "%s", el.BaseString) return bf.GoToNext } - out := aurora.Reset(text) - if r, ok := rules[Color]; ok { - i, err := strconv.Atoi(r) + out := aurora.Reset(el.BaseString) + if rules.Color != "" { + i, err := strconv.Atoi(rules.Color) if err == nil && i >= 0 && i <= 255 { out = out.Index(uint8(i)) } } - if r, ok := rules[BackgroundColor]; ok { - i, err := strconv.Atoi(r) + if rules.BackgroundColor != "" { + i, err := strconv.Atoi(rules.BackgroundColor) if err == nil && i >= 0 && i <= 255 { out = out.Index(uint8(i)) } } - if r, ok := rules[Underline]; ok { - if r == "true" { - out = out.Underline() - } + if rules.Underline { + out = out.Underline() } - if r, ok := rules[Bold]; ok { - if r == "true" { - out = out.Bold() - } + if rules.Bold { + out = out.Bold() } - if r, ok := rules[Italic]; ok { - if r == "true" { - out = out.Italic() - } + if rules.Italic { + out = out.Italic() } - if r, ok := rules[CrossedOut]; ok { - if r == "true" { - out = out.CrossedOut() - } + if rules.CrossedOut { + out = out.CrossedOut() } - if r, ok := rules[Overlined]; ok { - if r == "true" { - out = out.Overlined() - } + if rules.Overlined { + out = out.Overlined() } - if r, ok := rules[Inverse]; ok { - if r == "true" { - out = out.Reverse() - } + if rules.Inverse { + out = out.Reverse() } - if r, ok := rules[Blink]; ok { - if r == "true" { - out = out.Blink() - } + if rules.Blink { + out = out.Blink() } w.Write([]byte(aurora.Sprintf("%s", out))) return bf.GoToNext @@ -164,3 +204,58 @@ func (tr *TermRenderer) RenderHeader(w io.Writer, ast *bf.Node) { func (tr *TermRenderer) RenderFooter(w io.Writer, ast *bf.Node) { } + +func keyToType(key string) (bf.NodeType, error) { + switch key { + case "document": + return bf.Document, nil + case "block_quote": + return bf.BlockQuote, nil + case "list": + return bf.List, nil + case "item": + return bf.Item, nil + case "paragraph": + return bf.Paragraph, nil + case "heading": + return bf.Heading, nil + case "hr": + return bf.HorizontalRule, nil + case "emph": + return bf.Emph, nil + case "strong": + return bf.Strong, nil + case "del": + return bf.Del, nil + case "link": + return bf.Link, nil + case "image": + return bf.Image, nil + case "text": + return bf.Text, nil + case "html_block": + return bf.HTMLBlock, nil + case "code_block": + return bf.CodeBlock, nil + case "softbreak": + return bf.Softbreak, nil + case "hardbreak": + return bf.Hardbreak, nil + case "code": + return bf.Code, nil + case "html_span": + return bf.HTMLSpan, nil + case "table": + return bf.Table, nil + case "table_cel": + return bf.TableCell, nil + case "table_head": + return bf.TableHead, nil + case "table_body": + return bf.TableBody, nil + case "table_row": + return bf.TableRow, nil + default: + return 0, fmt.Errorf("Invalid element type: %s", key) + } +} From dda88169f45e66982b9b7d0fc89a3aa9f0931b1c Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Sat, 9 Nov 2019 14:07:01 -0600 Subject: [PATCH 004/911] Load style from json --- dark.json | 10 ++++++++++ main.go | 12 ++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 dark.json diff --git a/dark.json b/dark.json new file mode 100644 index 0000000..e760449 --- /dev/null +++ b/dark.json @@ -0,0 +1,10 @@ +{ + "link": { + "color": "123", + "underline": true + }, + "heading": { + "bold": true, + "inverse": true + } +} diff --git a/main.go b/main.go index 09b73fe..fc0eab9 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,9 @@ package main import ( + "flag" "fmt" + "os" "github.com/magicnumbers/gold" bf "gopkg.in/russross/blackfriday.v2" @@ -22,7 +24,13 @@ This is a test yo. ` func main() { - r := gold.TermRenderer{} - out := bf.Run([]byte(tmd), bf.WithRenderer(&r)) + s := flag.String("s", "", "style json path") + flag.Parse() + r, err := gold.NewTermRenderer(*s) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + out := bf.Run([]byte(tmd), bf.WithRenderer(r)) fmt.Println(string(out)) } From 9701392dc47fa4edf34e27a5f8f61ac6aaf88ea0 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Sat, 9 Nov 2019 16:12:54 -0600 Subject: [PATCH 005/911] Much better parsing, README example --- cmd/gold/README.md | 15 ++++ cmd/gold/dark.json | 8 +- cmd/gold/main.go | 17 ++++- gold.go | 183 +++++++++++++++++++++++++++++++++++++-------- 4 files changed, 187 insertions(+), 36 deletions(-) create mode 100644 cmd/gold/README.md diff --git a/cmd/gold/README.md b/cmd/gold/README.md new file mode 100644 index 0000000..7923f1b --- /dev/null +++ b/cmd/gold/README.md @@ -0,0 +1,15 @@ +# Charm Gold + +Render markdown on the CLI, with _pizzazz_! + +## Usage + +Supply a JSON stylesheet with the `-s` flag. Use a markdown file as the argument. + +``` +./gold -s dark.json README.md +``` + +## Colors + +Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logrusorgru/aurora#Index). diff --git a/cmd/gold/dark.json b/cmd/gold/dark.json index e760449..045fc5c 100644 --- a/cmd/gold/dark.json +++ b/cmd/gold/dark.json @@ -5,6 +5,12 @@ }, "heading": { "bold": true, - "inverse": true + "color": "3" + }, + "code": { + "color": "200" + }, + "code_block": { + "color": "200" } } diff --git a/cmd/gold/main.go b/cmd/gold/main.go index fc0eab9..afe48bc 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -3,6 +3,7 @@ package main import ( "flag" "fmt" + "io/ioutil" "os" "github.com/magicnumbers/gold" @@ -26,11 +27,23 @@ This is a test yo. func main() { s := flag.String("s", "", "style json path") flag.Parse() + args := flag.Args() + if len(args) != 1 { + fmt.Println("Missing Markdown file. Usage: ./gold -s STYLE.json FILE.md") + os.Exit(1) + } + f, err := os.Open(args[0]) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + defer f.Close() + b, _ := ioutil.ReadAll(f) r, err := gold.NewTermRenderer(*s) if err != nil { fmt.Println(err) os.Exit(1) } - out := bf.Run([]byte(tmd), bf.WithRenderer(r)) - fmt.Println(string(out)) + out := bf.Run(b, bf.WithRenderer(r)) + fmt.Printf("%s", string(out)) } diff --git a/gold.go b/gold.go index a0319c0..3ec5938 100644 --- a/gold.go +++ b/gold.go @@ -44,7 +44,9 @@ type ElementStyle struct { } type Element struct { - BaseString string + Token string + Pre string + Post string } type TermRenderer struct { @@ -54,63 +56,171 @@ type TermRenderer struct { func NewElement(node *bf.Node) Element { switch node.Type { case bf.Document: - return Element{""} + return Element{ + Token: "", + Pre: "", + Post: "", + } case bf.BlockQuote: - return Element{fmt.Sprintf("```\n%s\n```", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "\n", + Post: "\n", + } case bf.List: - return Element{""} + return Element{ + Token: string(node.Literal), + Pre: "\n", + Post: "\n", + } case bf.Item: - return Element{fmt.Sprintf("* %s", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "\n", + Post: "\n", + } case bf.Paragraph: - if node.Prev != nil && node.Prev.Type != bf.Link { - return Element{"\n"} + if node.Next != nil { + return Element{ + Token: string(node.Literal), + Pre: "\n", + Post: "\n\n", + } } else { - return Element{""} + return Element{ + Token: string(node.Literal), + Pre: "\n", + Post: "\n", + } } case bf.Heading: - return Element{fmt.Sprintf("%s ", strings.Repeat("#", node.HeadingData.Level))} + return Element{ + Token: fmt.Sprintf("%s ", strings.Repeat("#", node.HeadingData.Level)), + Pre: "", + Post: "\n", + } case bf.HorizontalRule: - return Element{"---\n"} + return Element{ + Token: "---", + Pre: "\n", + Post: "\n", + } case bf.Emph: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "", + Post: "", + } case bf.Strong: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "", + Post: "", + } case bf.Del: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "", + Post: "", + } case bf.Link: - return Element{fmt.Sprintf("[%s](%s)\n", string(node.LastChild.Literal), string(node.LinkData.Destination))} + return Element{ + Token: fmt.Sprintf("[%s](%s)", string(node.LastChild.Literal), string(node.LinkData.Destination)), + Pre: "", + Post: "", + } case bf.Image: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "", + Post: "", + } case bf.Text: if node.Parent != nil && node.Parent.Type != bf.Link { - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "", + Post: "", + } } else { - return Element{""} + return Element{ + Token: "", + Pre: "", + Post: "", + } } case bf.HTMLBlock: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "\n", + Post: "\n", + } case bf.CodeBlock: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: fmt.Sprintf("```\n%s\n```\n\n", string(node.Literal)), + Pre: "", + Post: "\n", + } case bf.Softbreak: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "", + Post: "\n", + } case bf.Hardbreak: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "\n", + Post: "\n", + } case bf.Code: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: fmt.Sprintf("`%s`", string(node.Literal)), + Pre: "", + Post: "", + } case bf.HTMLSpan: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "", + Post: "", + } case bf.Table: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "\n", + Post: "\n", + } case bf.TableCell: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "", + Post: "", + } case bf.TableHead: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "", + Post: "", + } case bf.TableBody: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "", + Post: "", + } case bf.TableRow: - return Element{fmt.Sprintf("%s\n", string(node.Literal))} + return Element{ + Token: string(node.Literal), + Pre: "\n", + Post: "\n", + } default: - return Element{""} + return Element{ + Token: string(node.Literal), + Pre: "", + Post: "", + } } } @@ -149,19 +259,26 @@ func NewTermRendererFromBytes(b []byte) (*TermRenderer, error) { } func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { + // fmt.Fprintf(w, "%s %t", node.Type, entering) + el := NewElement(node) + if entering && el.Pre != "" { + fmt.Fprintf(w, "%s", el.Pre) + } + if !entering && el.Post != "" { + fmt.Fprintf(w, "%s", el.Post) + } if !entering { return bf.GoToNext } - el := NewElement(node) - if el.BaseString == "" { + if el.Token == "" { return bf.GoToNext } rules := tr.style[node.Type] if rules == nil { - fmt.Fprintf(w, "%s", el.BaseString) + fmt.Fprintf(w, "%s", el.Token) return bf.GoToNext } - out := aurora.Reset(el.BaseString) + out := aurora.Reset(el.Token) if rules.Color != "" { i, err := strconv.Atoi(rules.Color) if err == nil && i >= 0 && i <= 255 { From 09bb6b3dd1b9d90de77d5b614cb80f3e9589e508 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Sat, 9 Nov 2019 16:12:54 -0600 Subject: [PATCH 006/911] Much better parsing, README example --- README.md | 15 +++++++++++++++ dark.json | 8 +++++++- main.go | 17 +++++++++++++++-- 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..7923f1b --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# Charm Gold + +Render markdown on the CLI, with _pizzazz_! + +## Usage + +Supply a JSON stylesheet with the `-s` flag. Use a markdown file as the argument. + +``` +./gold -s dark.json README.md +``` + +## Colors + +Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logrusorgru/aurora#Index). diff --git a/dark.json b/dark.json index e760449..045fc5c 100644 --- a/dark.json +++ b/dark.json @@ -5,6 +5,12 @@ }, "heading": { "bold": true, - "inverse": true + "color": "3" + }, + "code": { + "color": "200" + }, + "code_block": { + "color": "200" } } diff --git a/main.go b/main.go index fc0eab9..afe48bc 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "flag" "fmt" + "io/ioutil" "os" "github.com/magicnumbers/gold" @@ -26,11 +27,23 @@ This is a test yo. func main() { s := flag.String("s", "", "style json path") flag.Parse() + args := flag.Args() + if len(args) != 1 { + fmt.Println("Missing Markdown file. Usage: ./gold -s STYLE.json FILE.md") + os.Exit(1) + } + f, err := os.Open(args[0]) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + defer f.Close() + b, _ := ioutil.ReadAll(f) r, err := gold.NewTermRenderer(*s) if err != nil { fmt.Println(err) os.Exit(1) } - out := bf.Run([]byte(tmd), bf.WithRenderer(r)) - fmt.Println(string(out)) + out := bf.Run(b, bf.WithRenderer(r)) + fmt.Printf("%s", string(out)) } From a1f213d1af5de0e45d5261052b2ff99269dead44 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Sat, 9 Nov 2019 16:24:57 -0600 Subject: [PATCH 007/911] Remove test md --- cmd/gold/main.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/cmd/gold/main.go b/cmd/gold/main.go index afe48bc..d310dc4 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -10,20 +10,6 @@ import ( bf "gopkg.in/russross/blackfriday.v2" ) -const tmd = ` -# Test - -This is a test yo. - -## Dude! - -* one -* two -* three - -[yoda](http://flame.com) -` - func main() { s := flag.String("s", "", "style json path") flag.Parse() From 439ee25c7e9a87efbb965111d7cad83d52388d7c Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Sat, 9 Nov 2019 16:24:57 -0600 Subject: [PATCH 008/911] Remove test md --- main.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/main.go b/main.go index afe48bc..d310dc4 100644 --- a/main.go +++ b/main.go @@ -10,20 +10,6 @@ import ( bf "gopkg.in/russross/blackfriday.v2" ) -const tmd = ` -# Test - -This is a test yo. - -## Dude! - -* one -* two -* three - -[yoda](http://flame.com) -` - func main() { s := flag.String("s", "", "style json path") flag.Parse() From 132da36b1a856e3754590b93841b6dbaa60a11d6 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Sat, 9 Nov 2019 16:29:04 -0600 Subject: [PATCH 009/911] Remove old consts --- gold.go | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/gold.go b/gold.go index 3ec5938..fce8358 100644 --- a/gold.go +++ b/gold.go @@ -13,22 +13,6 @@ import ( bf "gopkg.in/russross/blackfriday.v2" ) -type RuleKey int - -const ( - Color RuleKey = iota - BackgroundColor - Underline - Bold - Italic - CrossedOut - Faint - Conceal - Overlined - Inverse - Blink -) - type ElementStyle struct { Color string `json:"color"` BackgroundColor string `json:"background_color"` From 985a7e5178d6761a64f569d068853421802f28f9 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Tue, 12 Nov 2019 15:53:11 -0500 Subject: [PATCH 010/911] Fix child element rendering --- cmd/gold/dark.json | 6 ++++++ gold.go | 21 ++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/cmd/gold/dark.json b/cmd/gold/dark.json index 045fc5c..75d3550 100644 --- a/cmd/gold/dark.json +++ b/cmd/gold/dark.json @@ -12,5 +12,11 @@ }, "code_block": { "color": "200" + }, + "emph": { + "italic": true + }, + "strong": { + "bold": true } } diff --git a/gold.go b/gold.go index fce8358..21d60fd 100644 --- a/gold.go +++ b/gold.go @@ -79,7 +79,7 @@ func NewElement(node *bf.Node) Element { } case bf.Heading: return Element{ - Token: fmt.Sprintf("%s ", strings.Repeat("#", node.HeadingData.Level)), + Token: fmt.Sprintf("%s %s", strings.Repeat("#", node.HeadingData.Level), node.FirstChild.Literal), Pre: "", Post: "\n", } @@ -91,13 +91,13 @@ func NewElement(node *bf.Node) Element { } case bf.Emph: return Element{ - Token: string(node.Literal), + Token: string(node.FirstChild.Literal), Pre: "", Post: "", } case bf.Strong: return Element{ - Token: string(node.Literal), + Token: string(node.FirstChild.Literal), Pre: "", Post: "", } @@ -251,6 +251,9 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf if !entering && el.Post != "" { fmt.Fprintf(w, "%s", el.Post) } + if isChild(node) { + return bf.GoToNext + } if !entering { return bf.GoToNext } @@ -306,6 +309,18 @@ func (tr *TermRenderer) RenderHeader(w io.Writer, ast *bf.Node) { func (tr *TermRenderer) RenderFooter(w io.Writer, ast *bf.Node) { } +func isChild(node *bf.Node) bool { + if node.Parent == nil { + return false + } + switch node.Parent.Type { + case bf.Heading, bf.Link, bf.Emph, bf.Strong: + return true + default: + return false + } +} + func keyToType(key string) (bf.NodeType, error) { switch key { case "document": From 5daf00f9204a6ea8ef31296bd3af79d4ac3872c8 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Tue, 12 Nov 2019 15:53:11 -0500 Subject: [PATCH 011/911] Fix child element rendering --- dark.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dark.json b/dark.json index 045fc5c..75d3550 100644 --- a/dark.json +++ b/dark.json @@ -12,5 +12,11 @@ }, "code_block": { "color": "200" + }, + "emph": { + "italic": true + }, + "strong": { + "bold": true } } From 218aff99ae9ca0d9be1b3a0c9e3e3d035da758d4 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Tue, 12 Nov 2019 16:36:51 -0500 Subject: [PATCH 012/911] Remove blackfriday requirement from clients --- cmd/gold/main.go | 4 +--- gold.go | 12 ++++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/cmd/gold/main.go b/cmd/gold/main.go index d310dc4..d90c061 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -7,7 +7,6 @@ import ( "os" "github.com/magicnumbers/gold" - bf "gopkg.in/russross/blackfriday.v2" ) func main() { @@ -25,11 +24,10 @@ func main() { } defer f.Close() b, _ := ioutil.ReadAll(f) - r, err := gold.NewTermRenderer(*s) + out, err := gold.RenderBytes(b, *s) if err != nil { fmt.Println(err) os.Exit(1) } - out := bf.Run(b, bf.WithRenderer(r)) fmt.Printf("%s", string(out)) } diff --git a/gold.go b/gold.go index 21d60fd..813b17a 100644 --- a/gold.go +++ b/gold.go @@ -209,6 +209,18 @@ func NewElement(node *bf.Node) Element { } +func Render(in string, stylePath string) ([]byte, error) { + return RenderBytes([]byte(in), stylePath) +} + +func RenderBytes(in []byte, stylePath string) ([]byte, error) { + r, err := NewTermRenderer(stylePath) + if err != nil { + return nil, err + } + return bf.Run(in, bf.WithRenderer(r)), nil +} + func NewTermRenderer(stylePath string) (*TermRenderer, error) { if stylePath == "" { return NewTermRendererFromBytes([]byte("{}")) From 5d9883623dea2297f75713d15fd82481c90c0dbc Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Tue, 12 Nov 2019 16:36:51 -0500 Subject: [PATCH 013/911] Remove blackfriday requirement from clients --- main.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/main.go b/main.go index d310dc4..d90c061 100644 --- a/main.go +++ b/main.go @@ -7,7 +7,6 @@ import ( "os" "github.com/magicnumbers/gold" - bf "gopkg.in/russross/blackfriday.v2" ) func main() { @@ -25,11 +24,10 @@ func main() { } defer f.Close() b, _ := ioutil.ReadAll(f) - r, err := gold.NewTermRenderer(*s) + out, err := gold.RenderBytes(b, *s) if err != nil { fmt.Println(err) os.Exit(1) } - out := bf.Run(b, bf.WithRenderer(r)) fmt.Printf("%s", string(out)) } From f6dd895862012d39a789c3c636e466aa3d14f510 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Tue, 12 Nov 2019 16:39:26 -0500 Subject: [PATCH 014/911] Move important stuff up top --- gold.go | 90 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/gold.go b/gold.go index 813b17a..f098002 100644 --- a/gold.go +++ b/gold.go @@ -37,6 +37,51 @@ type TermRenderer struct { style map[bf.NodeType]*ElementStyle } +func Render(in string, stylePath string) ([]byte, error) { + return RenderBytes([]byte(in), stylePath) +} + +func RenderBytes(in []byte, stylePath string) ([]byte, error) { + r, err := NewTermRenderer(stylePath) + if err != nil { + return nil, err + } + return bf.Run(in, bf.WithRenderer(r)), nil +} + +func NewTermRenderer(stylePath string) (*TermRenderer, error) { + if stylePath == "" { + return NewTermRendererFromBytes([]byte("{}")) + } + f, err := os.Open(stylePath) + if err != nil { + return nil, err + } + defer f.Close() + b, _ := ioutil.ReadAll(f) + return NewTermRendererFromBytes(b) +} + +func NewTermRendererFromBytes(b []byte) (*TermRenderer, error) { + e := make(map[string]*ElementStyle, 0) + err := json.Unmarshal(b, &e) + if err != nil { + return nil, err + } + tr := &TermRenderer{} + tr.style = make(map[bf.NodeType]*ElementStyle) + + for k, v := range e { + t, err := keyToType(k) + if err != nil { + fmt.Println(err) + continue + } + tr.style[t] = v + } + return tr, nil +} + func NewElement(node *bf.Node) Element { switch node.Type { case bf.Document: @@ -209,51 +254,6 @@ func NewElement(node *bf.Node) Element { } -func Render(in string, stylePath string) ([]byte, error) { - return RenderBytes([]byte(in), stylePath) -} - -func RenderBytes(in []byte, stylePath string) ([]byte, error) { - r, err := NewTermRenderer(stylePath) - if err != nil { - return nil, err - } - return bf.Run(in, bf.WithRenderer(r)), nil -} - -func NewTermRenderer(stylePath string) (*TermRenderer, error) { - if stylePath == "" { - return NewTermRendererFromBytes([]byte("{}")) - } - f, err := os.Open(stylePath) - if err != nil { - return nil, err - } - defer f.Close() - b, _ := ioutil.ReadAll(f) - return NewTermRendererFromBytes(b) -} - -func NewTermRendererFromBytes(b []byte) (*TermRenderer, error) { - e := make(map[string]*ElementStyle, 0) - err := json.Unmarshal(b, &e) - if err != nil { - return nil, err - } - tr := &TermRenderer{} - tr.style = make(map[bf.NodeType]*ElementStyle) - - for k, v := range e { - t, err := keyToType(k) - if err != nil { - fmt.Println(err) - continue - } - tr.style[t] = v - } - return tr, nil -} - func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { // fmt.Fprintf(w, "%s %t", node.Type, entering) el := NewElement(node) From 1642207b78bf0d57f7c08401c0bb8d22ad2334a2 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Fri, 15 Nov 2019 12:01:12 -0600 Subject: [PATCH 015/911] Remove redundant else --- gold.go | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/gold.go b/gold.go index f098002..b35fd7c 100644 --- a/gold.go +++ b/gold.go @@ -115,12 +115,11 @@ func NewElement(node *bf.Node) Element { Pre: "\n", Post: "\n\n", } - } else { - return Element{ - Token: string(node.Literal), - Pre: "\n", - Post: "\n", - } + } + return Element{ + Token: string(node.Literal), + Pre: "\n", + Post: "\n", } case bf.Heading: return Element{ @@ -171,12 +170,11 @@ func NewElement(node *bf.Node) Element { Pre: "", Post: "", } - } else { - return Element{ - Token: "", - Pre: "", - Post: "", - } + } + return Element{ + Token: "", + Pre: "", + Post: "", } case bf.HTMLBlock: return Element{ From 3b0f6f82077556f0dd236f161572f2d2b898bd7a Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Fri, 15 Nov 2019 12:02:39 -0600 Subject: [PATCH 016/911] Update repo org --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index d4fbb09..0d09c77 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/magicnumbers/gold +module github.com/charmbracelet/gold go 1.13 From 892e2e0198caac43b9f3ddf7a8d205ee921417a3 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Fri, 15 Nov 2019 12:27:41 -0600 Subject: [PATCH 017/911] README and LICENSE --- LICENSE | 21 +++++++++++++++++++++ README.md | 18 ++++++++++++++++++ cmd/gold/README.md | 2 +- 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 LICENSE create mode 100644 README.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..beda40d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Charmbracelet, Inc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2d20ff1 --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# Gold + +Render markdown on the CLI, with _pizzazz_! + +## What is it? + +Gold is a Golang library that allows you to use JSON based stylesheets to +render Markdown files in the terminal. Just like CSS, you can define color and +style attributes on Markdown elements. The difference is that you use ANSI +color and terminal codes instead of CSS properties and hex colors. + +## Usage + +See [cmd/gold](cmd/gold). + +## Colors + +Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logrusorgru/aurora#Index). diff --git a/cmd/gold/README.md b/cmd/gold/README.md index 7923f1b..28ad07d 100644 --- a/cmd/gold/README.md +++ b/cmd/gold/README.md @@ -1,4 +1,4 @@ -# Charm Gold +# Gold Render markdown on the CLI, with _pizzazz_! From 2446b97342f582fa1dbe7ca12d03edcca4febba8 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Fri, 15 Nov 2019 12:27:41 -0600 Subject: [PATCH 018/911] README and LICENSE --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7923f1b..28ad07d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Charm Gold +# Gold Render markdown on the CLI, with _pizzazz_! From 9fb7e211bacce80a333fb03ac66329bea1d167ff Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Fri, 15 Nov 2019 12:28:33 -0600 Subject: [PATCH 019/911] Link to main.go --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2d20ff1..c8b0a0a 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ color and terminal codes instead of CSS properties and hex colors. ## Usage -See [cmd/gold](cmd/gold). +See [cmd/gold](cmd/gold/main.go). ## Colors From abdc2bb390120bdb512cf68d62f9071b5dd0a37d Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Fri, 15 Nov 2019 12:35:04 -0600 Subject: [PATCH 020/911] Update repo org --- cmd/gold/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gold/main.go b/cmd/gold/main.go index d90c061..6be7a6c 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -6,7 +6,7 @@ import ( "io/ioutil" "os" - "github.com/magicnumbers/gold" + "github.com/charmbracelet/gold" ) func main() { From c7686d7131386fc5683da41f06c1dbdcf8958f78 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Fri, 15 Nov 2019 12:35:04 -0600 Subject: [PATCH 021/911] Update repo org --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index d90c061..6be7a6c 100644 --- a/main.go +++ b/main.go @@ -6,7 +6,7 @@ import ( "io/ioutil" "os" - "github.com/magicnumbers/gold" + "github.com/charmbracelet/gold" ) func main() { From 55eb9ee65ac61e71068fc1791db5216d78fb8a29 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 22 Nov 2019 03:52:21 +0100 Subject: [PATCH 022/911] Support fetching READMEs from GitHub When passing a valid GitHub URL instead of a filename to gold, it will fetch either README.md or README (in that order) from GitHub and displays the markdown content. Example: ./gold -s dark.json https://github.com/muesli/beehive --- cmd/gold/github.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ cmd/gold/main.go | 29 +++++++++++++++++++++++------ 2 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 cmd/gold/github.go diff --git a/cmd/gold/github.go b/cmd/gold/github.go new file mode 100644 index 0000000..d8a9731 --- /dev/null +++ b/cmd/gold/github.go @@ -0,0 +1,45 @@ +package main + +import ( + "errors" + "net/http" + "net/url" + "strings" +) + +// isGitHubURL tests a string to determine if it is a well-structured GitHub URL +func isGitHubURL(s string) bool { + u, err := url.ParseRequestURI(s) + if err != nil { + return false + } + + return strings.ToLower(u.Host) == "github.com" +} + +// findGitHubREADME tries to find the correct README filename in a repository +func findGitHubREADME(s string) (*http.Response, error) { + u, err := url.ParseRequestURI(s) + if err != nil { + return nil, err + } + + u.Host = "raw.githubusercontent.com" + readmeNames := []string{"README.md", "README"} + + for _, r := range readmeNames { + v := u + v.Path += "/master/" + r + + resp, err := http.Get(v.String()) + if err != nil { + return nil, err + } + + if resp.StatusCode == http.StatusOK { + return resp, nil + } + } + + return nil, errors.New("can't find README in GitHub repository") +} diff --git a/cmd/gold/main.go b/cmd/gold/main.go index 6be7a6c..876ee9b 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -3,6 +3,7 @@ package main import ( "flag" "fmt" + "io" "io/ioutil" "os" @@ -17,13 +18,29 @@ func main() { fmt.Println("Missing Markdown file. Usage: ./gold -s STYLE.json FILE.md") os.Exit(1) } - f, err := os.Open(args[0]) - if err != nil { - fmt.Println(err) - os.Exit(1) + + var in io.Reader + if isGitHubURL(args[0]) { + resp, err := findGitHubREADME(args[0]) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + defer resp.Body.Close() + in = resp.Body + } else { + f, err := os.Open(args[0]) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + defer f.Close() + in = f } - defer f.Close() - b, _ := ioutil.ReadAll(f) + + b, _ := ioutil.ReadAll(in) out, err := gold.RenderBytes(b, *s) if err != nil { fmt.Println(err) From bbd2e15001484a41fcb0844dbdf775ed72274f9d Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 22 Nov 2019 03:52:21 +0100 Subject: [PATCH 023/911] Support fetching READMEs from GitHub When passing a valid GitHub URL instead of a filename to gold, it will fetch either README.md or README (in that order) from GitHub and displays the markdown content. Example: ./gold -s dark.json https://github.com/muesli/beehive --- github.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ main.go | 29 +++++++++++++++++++++++------ 2 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 github.go diff --git a/github.go b/github.go new file mode 100644 index 0000000..d8a9731 --- /dev/null +++ b/github.go @@ -0,0 +1,45 @@ +package main + +import ( + "errors" + "net/http" + "net/url" + "strings" +) + +// isGitHubURL tests a string to determine if it is a well-structured GitHub URL +func isGitHubURL(s string) bool { + u, err := url.ParseRequestURI(s) + if err != nil { + return false + } + + return strings.ToLower(u.Host) == "github.com" +} + +// findGitHubREADME tries to find the correct README filename in a repository +func findGitHubREADME(s string) (*http.Response, error) { + u, err := url.ParseRequestURI(s) + if err != nil { + return nil, err + } + + u.Host = "raw.githubusercontent.com" + readmeNames := []string{"README.md", "README"} + + for _, r := range readmeNames { + v := u + v.Path += "/master/" + r + + resp, err := http.Get(v.String()) + if err != nil { + return nil, err + } + + if resp.StatusCode == http.StatusOK { + return resp, nil + } + } + + return nil, errors.New("can't find README in GitHub repository") +} diff --git a/main.go b/main.go index 6be7a6c..876ee9b 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "flag" "fmt" + "io" "io/ioutil" "os" @@ -17,13 +18,29 @@ func main() { fmt.Println("Missing Markdown file. Usage: ./gold -s STYLE.json FILE.md") os.Exit(1) } - f, err := os.Open(args[0]) - if err != nil { - fmt.Println(err) - os.Exit(1) + + var in io.Reader + if isGitHubURL(args[0]) { + resp, err := findGitHubREADME(args[0]) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + defer resp.Body.Close() + in = resp.Body + } else { + f, err := os.Open(args[0]) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + defer f.Close() + in = f } - defer f.Close() - b, _ := ioutil.ReadAll(f) + + b, _ := ioutil.ReadAll(in) out, err := gold.RenderBytes(b, *s) if err != nil { fmt.Println(err) From 41f9c1792e8182e0ef9cbb12018f41e795ae89ec Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 22 Nov 2019 03:28:26 +0100 Subject: [PATCH 024/911] Support reading from stdin When you start gold with "-" as an argument it will read directly from stdin, instead of opening a file. Example calls: ./gold -s dark.json README.md or cat README.md | ./gold -s dark.json --- cmd/gold/main.go | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/cmd/gold/main.go b/cmd/gold/main.go index 876ee9b..853fe1a 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -10,6 +10,22 @@ import ( "github.com/charmbracelet/gold" ) +func readerFromArgument(s string) (io.ReadCloser, error) { + if s == "-" { + return os.Stdin, nil + } + + if isGitHubURL(s) { + resp, err := findGitHubREADME(s) + if err != nil { + return nil, err + } + return resp.Body, nil + } + + return os.Open(s) +} + func main() { s := flag.String("s", "", "style json path") flag.Parse() @@ -19,26 +35,12 @@ func main() { os.Exit(1) } - var in io.Reader - if isGitHubURL(args[0]) { - resp, err := findGitHubREADME(args[0]) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - defer resp.Body.Close() - in = resp.Body - } else { - f, err := os.Open(args[0]) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - defer f.Close() - in = f + in, err := readerFromArgument(args[0]) + if err != nil { + fmt.Println(err) + os.Exit(1) } + defer in.Close() b, _ := ioutil.ReadAll(in) out, err := gold.RenderBytes(b, *s) From b58f777e919685d5f9a560f25fcf8dd8932ab31c Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 22 Nov 2019 03:28:26 +0100 Subject: [PATCH 025/911] Support reading from stdin When you start gold with "-" as an argument it will read directly from stdin, instead of opening a file. Example calls: ./gold -s dark.json README.md or cat README.md | ./gold -s dark.json --- main.go | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/main.go b/main.go index 876ee9b..853fe1a 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,22 @@ import ( "github.com/charmbracelet/gold" ) +func readerFromArgument(s string) (io.ReadCloser, error) { + if s == "-" { + return os.Stdin, nil + } + + if isGitHubURL(s) { + resp, err := findGitHubREADME(s) + if err != nil { + return nil, err + } + return resp.Body, nil + } + + return os.Open(s) +} + func main() { s := flag.String("s", "", "style json path") flag.Parse() @@ -19,26 +35,12 @@ func main() { os.Exit(1) } - var in io.Reader - if isGitHubURL(args[0]) { - resp, err := findGitHubREADME(args[0]) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - defer resp.Body.Close() - in = resp.Body - } else { - f, err := os.Open(args[0]) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - defer f.Close() - in = f + in, err := readerFromArgument(args[0]) + if err != nil { + fmt.Println(err) + os.Exit(1) } + defer in.Close() b, _ := ioutil.ReadAll(in) out, err := gold.RenderBytes(b, *s) From 2774bf7e60d11b9719fbb08a0f0e3ffc0d90fa1e Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 22 Nov 2019 04:44:54 +0100 Subject: [PATCH 026/911] Use cobra to handle command line parameters --- cmd/gold/main.go | 45 +++++++++++++++++++++++++++++++++------------ go.mod | 1 + go.sum | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 12 deletions(-) diff --git a/cmd/gold/main.go b/cmd/gold/main.go index 853fe1a..90b2ab0 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -1,15 +1,31 @@ package main import ( - "flag" + "errors" "fmt" "io" "io/ioutil" "os" + "github.com/spf13/cobra" + "github.com/charmbracelet/gold" ) +var ( + rootCmd = &cobra.Command{ + Use: "gold SOURCE", + Short: "Render markdown on the CLI, with pizzazz!", + SilenceErrors: false, + SilenceUsage: false, + RunE: func(cmd *cobra.Command, args []string) error { + return execute(args) + }, + } + + style string +) + func readerFromArgument(s string) (io.ReadCloser, error) { if s == "-" { return os.Stdin, nil @@ -26,27 +42,32 @@ func readerFromArgument(s string) (io.ReadCloser, error) { return os.Open(s) } -func main() { - s := flag.String("s", "", "style json path") - flag.Parse() - args := flag.Args() +func execute(args []string) error { if len(args) != 1 { - fmt.Println("Missing Markdown file. Usage: ./gold -s STYLE.json FILE.md") - os.Exit(1) + return errors.New("missing markdown source") } in, err := readerFromArgument(args[0]) if err != nil { - fmt.Println(err) - os.Exit(1) + return err } defer in.Close() b, _ := ioutil.ReadAll(in) - out, err := gold.RenderBytes(b, *s) + out, err := gold.RenderBytes(b, style) if err != nil { - fmt.Println(err) - os.Exit(1) + return err } fmt.Printf("%s", string(out)) + return nil +} + +func main() { + if err := rootCmd.Execute(); err != nil { + os.Exit(-1) + } +} + +func init() { + rootCmd.Flags().StringVarP(&style, "style", "s", "dark.json", "style JSON path") } diff --git a/go.mod b/go.mod index 0d09c77..75a6a38 100644 --- a/go.mod +++ b/go.mod @@ -5,5 +5,6 @@ go 1.13 require ( github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect + github.com/spf13/cobra v0.0.5 gopkg.in/russross/blackfriday.v2 v2.0.0 ) diff --git a/go.sum b/go.sum index 58da90e..0f3396b 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,38 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 h1:im9kkmH0WWwxzegiv18gSUJbuXR9y028rXrWuPp6Jug= github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/russross/blackfriday.v2 v2.0.0 h1:+FlnIV8DSQnT7NZ43hcVKcdJdzZoeCmJj4Ql8gq5keA= gopkg.in/russross/blackfriday.v2 v2.0.0/go.mod h1:6sSBNz/GtOm/pJTuh5UmBK2ZHfmnxGbl2NZg1UliSOI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From 16048357a02701732d56e1f05709bca3c574e112 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 22 Nov 2019 04:44:54 +0100 Subject: [PATCH 027/911] Use cobra to handle command line parameters --- main.go | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/main.go b/main.go index 853fe1a..90b2ab0 100644 --- a/main.go +++ b/main.go @@ -1,15 +1,31 @@ package main import ( - "flag" + "errors" "fmt" "io" "io/ioutil" "os" + "github.com/spf13/cobra" + "github.com/charmbracelet/gold" ) +var ( + rootCmd = &cobra.Command{ + Use: "gold SOURCE", + Short: "Render markdown on the CLI, with pizzazz!", + SilenceErrors: false, + SilenceUsage: false, + RunE: func(cmd *cobra.Command, args []string) error { + return execute(args) + }, + } + + style string +) + func readerFromArgument(s string) (io.ReadCloser, error) { if s == "-" { return os.Stdin, nil @@ -26,27 +42,32 @@ func readerFromArgument(s string) (io.ReadCloser, error) { return os.Open(s) } -func main() { - s := flag.String("s", "", "style json path") - flag.Parse() - args := flag.Args() +func execute(args []string) error { if len(args) != 1 { - fmt.Println("Missing Markdown file. Usage: ./gold -s STYLE.json FILE.md") - os.Exit(1) + return errors.New("missing markdown source") } in, err := readerFromArgument(args[0]) if err != nil { - fmt.Println(err) - os.Exit(1) + return err } defer in.Close() b, _ := ioutil.ReadAll(in) - out, err := gold.RenderBytes(b, *s) + out, err := gold.RenderBytes(b, style) if err != nil { - fmt.Println(err) - os.Exit(1) + return err } fmt.Printf("%s", string(out)) + return nil +} + +func main() { + if err := rootCmd.Execute(); err != nil { + os.Exit(-1) + } +} + +func init() { + rootCmd.Flags().StringVarP(&style, "style", "s", "dark.json", "style JSON path") } From 2b0603a675cdf03f6333218fed3bc28744b06010 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 22 Nov 2019 04:51:44 +0100 Subject: [PATCH 028/911] Update gold usage in README --- cmd/gold/README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/cmd/gold/README.md b/cmd/gold/README.md index 28ad07d..d4092ee 100644 --- a/cmd/gold/README.md +++ b/cmd/gold/README.md @@ -4,12 +4,23 @@ Render markdown on the CLI, with _pizzazz_! ## Usage -Supply a JSON stylesheet with the `-s` flag. Use a markdown file as the argument. +Supply a JSON stylesheet with the `-s` flag. Use a markdown source as the argument. +Read from file: ``` ./gold -s dark.json README.md ``` +Read from stdin: +``` +./gold -s dark.json - +``` + +Fetch README from GitHub: +``` +./gold -s dark.json https://github.com/charmbracelet/gold +``` + ## Colors Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logrusorgru/aurora#Index). From 08b62ec55ec276c1f02a703ff8d30897ec1d13e2 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 22 Nov 2019 04:51:44 +0100 Subject: [PATCH 029/911] Update gold usage in README --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 28ad07d..d4092ee 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,23 @@ Render markdown on the CLI, with _pizzazz_! ## Usage -Supply a JSON stylesheet with the `-s` flag. Use a markdown file as the argument. +Supply a JSON stylesheet with the `-s` flag. Use a markdown source as the argument. +Read from file: ``` ./gold -s dark.json README.md ``` +Read from stdin: +``` +./gold -s dark.json - +``` + +Fetch README from GitHub: +``` +./gold -s dark.json https://github.com/charmbracelet/gold +``` + ## Colors Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logrusorgru/aurora#Index). From 354439e273b3a66f0eac1eb40dde429fe288e2ce Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 22 Nov 2019 14:06:12 +0100 Subject: [PATCH 030/911] Support fetching markdown from arbitrary HTTP sources --- cmd/gold/main.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/cmd/gold/main.go b/cmd/gold/main.go index 90b2ab0..994eede 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -5,7 +5,10 @@ import ( "fmt" "io" "io/ioutil" + "net/http" + "net/url" "os" + "strings" "github.com/spf13/cobra" @@ -31,11 +34,26 @@ func readerFromArgument(s string) (io.ReadCloser, error) { return os.Stdin, nil } - if isGitHubURL(s) { - resp, err := findGitHubREADME(s) + if u, err := url.ParseRequestURI(s); err == nil { + if !strings.HasPrefix(u.Scheme, "http") { + return nil, fmt.Errorf("%s is not a supported protocol", u.Scheme) + } + + if isGitHubURL(s) { + resp, err := findGitHubREADME(s) + if err != nil { + return nil, err + } + return resp.Body, nil + } + + resp, err := http.Get(u.String()) if err != nil { return nil, err } + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("HTTP status %d", resp.StatusCode) + } return resp.Body, nil } From 08dd80a9224f49346a6ddc98bf062bd191846e57 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 22 Nov 2019 14:06:12 +0100 Subject: [PATCH 031/911] Support fetching markdown from arbitrary HTTP sources --- main.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 90b2ab0..994eede 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,10 @@ import ( "fmt" "io" "io/ioutil" + "net/http" + "net/url" "os" + "strings" "github.com/spf13/cobra" @@ -31,11 +34,26 @@ func readerFromArgument(s string) (io.ReadCloser, error) { return os.Stdin, nil } - if isGitHubURL(s) { - resp, err := findGitHubREADME(s) + if u, err := url.ParseRequestURI(s); err == nil { + if !strings.HasPrefix(u.Scheme, "http") { + return nil, fmt.Errorf("%s is not a supported protocol", u.Scheme) + } + + if isGitHubURL(s) { + resp, err := findGitHubREADME(s) + if err != nil { + return nil, err + } + return resp.Body, nil + } + + resp, err := http.Get(u.String()) if err != nil { return nil, err } + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("HTTP status %d", resp.StatusCode) + } return resp.Body, nil } From b4f76ed085ea5c8ffb499b6c04d50ee067d849d4 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 00:33:24 +0100 Subject: [PATCH 032/911] Add goreleaser config to help automate builds for various platforms We're currently building the following targets: - Linux 386/x64/armv6/arm64 - Windows 386/x64 - macOS x64 --- .gitignore | 1 + cmd/gold/.goreleaser.yml | 47 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 cmd/gold/.goreleaser.yml diff --git a/.gitignore b/.gitignore index 1d90896..0d8c7fa 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ cmd/gold/gold +cmd/gold/dist/ diff --git a/cmd/gold/.goreleaser.yml b/cmd/gold/.goreleaser.yml new file mode 100644 index 0000000..20556ac --- /dev/null +++ b/cmd/gold/.goreleaser.yml @@ -0,0 +1,47 @@ +env: + - GO111MODULE=on +before: + hooks: + - go mod download +builds: + - + binary: gold + ldflags: -s -w -X main.Version={{ .Version }} -X main.CommitSHA={{ .Commit }} + goos: + - linux + - darwin + - windows + goarch: + - amd64 + - arm64 + - 386 + - arm + goarm: + - 6 + - 7 + ignore: + - goos: darwin + goarch: 386 + - goos: linux + goarch: arm + goarm: 7 +sign: + artifacts: checksum +archives: + - + replacements: + darwin: Darwin + linux: Linux + windows: Windows + 386: i386 + amd64: x86_64 +checksum: + name_template: 'checksums.txt' +snapshot: + name_template: "{{ .Tag }}-next" +changelog: + sort: asc + filters: + exclude: + - '^docs:' + - '^test:' From 47ac9b7afcf526f043e2587b33f20f1341bb4b59 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 00:33:24 +0100 Subject: [PATCH 033/911] Add goreleaser config to help automate builds for various platforms We're currently building the following targets: - Linux 386/x64/armv6/arm64 - Windows 386/x64 - macOS x64 --- .goreleaser.yml | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 .goreleaser.yml diff --git a/.goreleaser.yml b/.goreleaser.yml new file mode 100644 index 0000000..20556ac --- /dev/null +++ b/.goreleaser.yml @@ -0,0 +1,47 @@ +env: + - GO111MODULE=on +before: + hooks: + - go mod download +builds: + - + binary: gold + ldflags: -s -w -X main.Version={{ .Version }} -X main.CommitSHA={{ .Commit }} + goos: + - linux + - darwin + - windows + goarch: + - amd64 + - arm64 + - 386 + - arm + goarm: + - 6 + - 7 + ignore: + - goos: darwin + goarch: 386 + - goos: linux + goarch: arm + goarm: 7 +sign: + artifacts: checksum +archives: + - + replacements: + darwin: Darwin + linux: Linux + windows: Windows + 386: i386 + amd64: x86_64 +checksum: + name_template: 'checksums.txt' +snapshot: + name_template: "{{ .Tag }}-next" +changelog: + sort: asc + filters: + exclude: + - '^docs:' + - '^test:' From 8ce98625abd6b14489840c92e4f921ab6e932b1f Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 02:40:29 +0100 Subject: [PATCH 034/911] Cleanup/simplify main.go --- cmd/gold/main.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/cmd/gold/main.go b/cmd/gold/main.go index 994eede..330539e 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -21,15 +21,13 @@ var ( Short: "Render markdown on the CLI, with pizzazz!", SilenceErrors: false, SilenceUsage: false, - RunE: func(cmd *cobra.Command, args []string) error { - return execute(args) - }, + RunE: execute, } style string ) -func readerFromArgument(s string) (io.ReadCloser, error) { +func readerFromArg(s string) (io.ReadCloser, error) { if s == "-" { return os.Stdin, nil } @@ -60,12 +58,12 @@ func readerFromArgument(s string) (io.ReadCloser, error) { return os.Open(s) } -func execute(args []string) error { +func execute(cmd *cobra.Command, args []string) error { if len(args) != 1 { return errors.New("missing markdown source") } - in, err := readerFromArgument(args[0]) + in, err := readerFromArg(args[0]) if err != nil { return err } From 5c3ad999ea8db5cf62b51c7ce161a830ca7841b6 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 02:40:29 +0100 Subject: [PATCH 035/911] Cleanup/simplify main.go --- main.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/main.go b/main.go index 994eede..330539e 100644 --- a/main.go +++ b/main.go @@ -21,15 +21,13 @@ var ( Short: "Render markdown on the CLI, with pizzazz!", SilenceErrors: false, SilenceUsage: false, - RunE: func(cmd *cobra.Command, args []string) error { - return execute(args) - }, + RunE: execute, } style string ) -func readerFromArgument(s string) (io.ReadCloser, error) { +func readerFromArg(s string) (io.ReadCloser, error) { if s == "-" { return os.Stdin, nil } @@ -60,12 +58,12 @@ func readerFromArgument(s string) (io.ReadCloser, error) { return os.Open(s) } -func execute(args []string) error { +func execute(cmd *cobra.Command, args []string) error { if len(args) != 1 { return errors.New("missing markdown source") } - in, err := readerFromArgument(args[0]) + in, err := readerFromArg(args[0]) if err != nil { return err } From 9d14f27700f2911d64e13c34cff334d29709f68f Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 03:50:13 +0100 Subject: [PATCH 036/911] Fix rendering of list items --- gold.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gold.go b/gold.go index b35fd7c..a54a764 100644 --- a/gold.go +++ b/gold.go @@ -105,8 +105,8 @@ func NewElement(node *bf.Node) Element { case bf.Item: return Element{ Token: string(node.Literal), - Pre: "\n", - Post: "\n", + Pre: "• ", + Post: "", } case bf.Paragraph: if node.Next != nil { @@ -118,7 +118,7 @@ func NewElement(node *bf.Node) Element { } return Element{ Token: string(node.Literal), - Pre: "\n", + Pre: "", Post: "\n", } case bf.Heading: From 605848a4da646a8b2eb7adde8f98868772937d95 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 04:07:55 +0100 Subject: [PATCH 037/911] Fix line-break issues in markdown rendering Fixes #3. --- gold.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gold.go b/gold.go index a54a764..1a1b06b 100644 --- a/gold.go +++ b/gold.go @@ -100,7 +100,7 @@ func NewElement(node *bf.Node) Element { return Element{ Token: string(node.Literal), Pre: "\n", - Post: "\n", + Post: "", } case bf.Item: return Element{ @@ -113,7 +113,7 @@ func NewElement(node *bf.Node) Element { return Element{ Token: string(node.Literal), Pre: "\n", - Post: "\n\n", + Post: "\n", } } return Element{ @@ -124,7 +124,7 @@ func NewElement(node *bf.Node) Element { case bf.Heading: return Element{ Token: fmt.Sprintf("%s %s", strings.Repeat("#", node.HeadingData.Level), node.FirstChild.Literal), - Pre: "", + Pre: "\n", Post: "\n", } case bf.HorizontalRule: @@ -184,8 +184,8 @@ func NewElement(node *bf.Node) Element { } case bf.CodeBlock: return Element{ - Token: fmt.Sprintf("```\n%s\n```\n\n", string(node.Literal)), - Pre: "", + Token: string(node.Literal), + Pre: "\n", Post: "\n", } case bf.Softbreak: @@ -202,7 +202,7 @@ func NewElement(node *bf.Node) Element { } case bf.Code: return Element{ - Token: fmt.Sprintf("`%s`", string(node.Literal)), + Token: string(node.Literal), Pre: "", Post: "", } From 5bb6091094bd065b69c7fb22fb1153a276121928 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 04:20:05 +0100 Subject: [PATCH 038/911] Fix markdown rendering for first and last paragraphs --- gold.go | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/gold.go b/gold.go index 1a1b06b..8c9e345 100644 --- a/gold.go +++ b/gold.go @@ -109,22 +109,20 @@ func NewElement(node *bf.Node) Element { Post: "", } case bf.Paragraph: - if node.Next != nil { - return Element{ - Token: string(node.Literal), - Pre: "\n", - Post: "\n", - } - } return Element{ Token: string(node.Literal), - Pre: "", + Pre: "\n", Post: "\n", } case bf.Heading: + var pre string + if node.Prev != nil { + pre = "\n" + } + return Element{ Token: fmt.Sprintf("%s %s", strings.Repeat("#", node.HeadingData.Level), node.FirstChild.Literal), - Pre: "\n", + Pre: pre, Post: "\n", } case bf.HorizontalRule: @@ -249,7 +247,6 @@ func NewElement(node *bf.Node) Element { Post: "", } } - } func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { From d0d74077c872066f95cd88cf1839a813a5b6e5d8 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 04:43:37 +0100 Subject: [PATCH 039/911] Fix line-break before list items --- gold.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gold.go b/gold.go index 8c9e345..2008671 100644 --- a/gold.go +++ b/gold.go @@ -109,9 +109,14 @@ func NewElement(node *bf.Node) Element { Post: "", } case bf.Paragraph: + pre := "\n" + if node.Parent != nil && node.Parent.Type == bf.Item { + pre = "" + } + return Element{ Token: string(node.Literal), - Pre: "\n", + Pre: pre, Post: "\n", } case bf.Heading: From 296156296744bdcbf5774af9de3738ccc1484f07 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 05:06:01 +0100 Subject: [PATCH 040/911] Find README(.md) in current working dir when no arg was supplied --- cmd/gold/github.go | 2 -- cmd/gold/main.go | 22 +++++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/cmd/gold/github.go b/cmd/gold/github.go index d8a9731..fff8fde 100644 --- a/cmd/gold/github.go +++ b/cmd/gold/github.go @@ -23,9 +23,7 @@ func findGitHubREADME(s string) (*http.Response, error) { if err != nil { return nil, err } - u.Host = "raw.githubusercontent.com" - readmeNames := []string{"README.md", "README"} for _, r := range readmeNames { v := u diff --git a/cmd/gold/main.go b/cmd/gold/main.go index 330539e..411ab5c 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -16,6 +16,8 @@ import ( ) var ( + readmeNames = []string{"README.md", "README"} + rootCmd = &cobra.Command{ Use: "gold SOURCE", Short: "Render markdown on the CLI, with pizzazz!", @@ -23,7 +25,6 @@ var ( SilenceUsage: false, RunE: execute, } - style string ) @@ -55,15 +56,26 @@ func readerFromArg(s string) (io.ReadCloser, error) { return resp.Body, nil } + if len(s) == 0 { + for _, v := range readmeNames { + r, err := os.Open(v) + if err == nil { + return r, err + } + } + + return nil, errors.New("missing markdown source") + } + return os.Open(s) } func execute(cmd *cobra.Command, args []string) error { - if len(args) != 1 { - return errors.New("missing markdown source") + var arg string + if len(args) > 0 { + arg = args[0] } - - in, err := readerFromArg(args[0]) + in, err := readerFromArg(arg) if err != nil { return err } From 14bc95c272aad0a507037e36783026186ee64c87 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 05:06:01 +0100 Subject: [PATCH 041/911] Find README(.md) in current working dir when no arg was supplied --- github.go | 2 -- main.go | 22 +++++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/github.go b/github.go index d8a9731..fff8fde 100644 --- a/github.go +++ b/github.go @@ -23,9 +23,7 @@ func findGitHubREADME(s string) (*http.Response, error) { if err != nil { return nil, err } - u.Host = "raw.githubusercontent.com" - readmeNames := []string{"README.md", "README"} for _, r := range readmeNames { v := u diff --git a/main.go b/main.go index 330539e..411ab5c 100644 --- a/main.go +++ b/main.go @@ -16,6 +16,8 @@ import ( ) var ( + readmeNames = []string{"README.md", "README"} + rootCmd = &cobra.Command{ Use: "gold SOURCE", Short: "Render markdown on the CLI, with pizzazz!", @@ -23,7 +25,6 @@ var ( SilenceUsage: false, RunE: execute, } - style string ) @@ -55,15 +56,26 @@ func readerFromArg(s string) (io.ReadCloser, error) { return resp.Body, nil } + if len(s) == 0 { + for _, v := range readmeNames { + r, err := os.Open(v) + if err == nil { + return r, err + } + } + + return nil, errors.New("missing markdown source") + } + return os.Open(s) } func execute(cmd *cobra.Command, args []string) error { - if len(args) != 1 { - return errors.New("missing markdown source") + var arg string + if len(args) > 0 { + arg = args[0] } - - in, err := readerFromArg(args[0]) + in, err := readerFromArg(arg) if err != nil { return err } From b60105d5150a225b1947763d9e94dc1ee450227f Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 05:07:58 +0100 Subject: [PATCH 042/911] Fix new-line before first paragraph --- gold.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gold.go b/gold.go index 2008671..ad2bff7 100644 --- a/gold.go +++ b/gold.go @@ -110,7 +110,7 @@ func NewElement(node *bf.Node) Element { } case bf.Paragraph: pre := "\n" - if node.Parent != nil && node.Parent.Type == bf.Item { + if node.Prev == nil || (node.Parent != nil && node.Parent.Type == bf.Item) { pre = "" } From 0ef5821e6ae2090a50e8e6e0d0d2e1bebbacb27e Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 05:19:13 +0100 Subject: [PATCH 043/911] Add screenshot of dark theme --- cmd/gold/README.md | 7 +++++++ cmd/gold/gold_dark.png | Bin 0 -> 269951 bytes 2 files changed, 7 insertions(+) create mode 100644 cmd/gold/gold_dark.png diff --git a/cmd/gold/README.md b/cmd/gold/README.md index d4092ee..5aaf769 100644 --- a/cmd/gold/README.md +++ b/cmd/gold/README.md @@ -21,6 +21,13 @@ Fetch README from GitHub: ./gold -s dark.json https://github.com/charmbracelet/gold ``` +When `gold` is started without any markdown source, it will try to find a `README.md` +or `README` file in the current working directory. + ## Colors Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logrusorgru/aurora#Index). + +## Example Output + +![Gold Dark Theme](https://github.com/charmbracelet/gold/raw/master/cmd/gold/gold_dark.png) diff --git a/cmd/gold/gold_dark.png b/cmd/gold/gold_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..921dcb356a168eea6fb9ae25c51ae66bcdde9efe GIT binary patch literal 269951 zcmV)@K!LxBP)H*0Mj_yKDRNYOS@`mTg(K?A?`>NoC32 z>OOVe^LyXZLxQwv%O9S8?o(4;UER0uLG{1??>{tM|A=n?a=L%nt#8{0RzFWVaOk81 zd+q+!ZTrCZvs?cx{~R_}w?oqdhqezMN*nEZdt0{iz1@M;t<5{P*E^^Auns4Y^Q4U~ zKRj)#^BgQYr}@ThImx!ZcRSzK2kgZId(*tX%Xg)NYVFs9y4rr`{n%~&&HkO^X^~&71sY8w!?al{7kPoZFK8f`seES z^)2e1A>Y!Tu(ST%*LTJBKjk&Ve3CAmXJqyIMRd z?kvO3a(&k_?Fs8WtHX${d}2rrfr|^8h#Gj!_M_xt37T$ z?)2;9+nsSE&d2TaPq%v1>Naeohon6o`_p;S0bxGw4EgxgZ)Y1)mR@<<6W5Ol>+O(l>9BNWxi{wDeYkDmnAQIDPOfipe4@p0 zi+Q6>uV?+wVduX5)93xeL-zHn!-k)e_3`VS3%5Q}o@M=8uOHi|b1v4u@xXkL zhM&W2IIQW%ZL@Rz!115M#%fQ$`kA)Vk!d63BhxW)_3Z2Y>6qF2fwS@E`mzz%$Gh2h zj86|)Z^!j^T>mqyw|zc7pKUiCzuFkiHrri4cDGq?40~caetp;aJiBo`;chxOt{=;T z(?8P*^Rtg9ln17}9^*@%72aH!$Y6UH%s7t(JG#&Bj~0H}+*`$ZxyLeBsGKWRou`A^+3o{}Y|w+2otUM$Au|j`4VTabB)q>HKn;lC!1bn|u;^x`3DA z^AkC|Fqcnm4sLKldG_=x%L9FWh{KDN_s8isB;c2F`LLMZVRd9`v1EBFS7pg|88<-yZ-YfPIiXATo_}1NX-9J z=c`${LI#{XJvQQ^D#xVX!sU}R`4=BA#VgFZv)o?8(CL8zt?sR1>)x<2+!8KHfK`y| zxP36)R@m`Ddq*CA?&&9;d{|(sz_^0d);mu*cKRK!xL~+F=jE&0eNQ_~lqs-sILYkj z(cyq+y!ia|6oPA~*f0onnvv*sg;@pc@`c4UU?ooF%ZM3tcGZobcKt*v_%0|`ux6Vv zWw*X}8@N{XbUZkt&-Hm$x9tp(yMky(5E(PX6d)TkNaY@ZsHTqoLrupd-JeAwHR5CVA_lAUJ*TA%00m{9Q4<3-*WWAF(HT^T~>DC9YVA=X- zw?0MysDRoCP%DTwAy>hUUSBH{7)|&x?x;OJgHA$Tfu3DHZQLo>L3twCDach2t;Z!^ zu3`}vP&r26wV+SgnBak1>+OU@6P(?`P64|izaeq}acacN*ealNb@LfC`+Ts^uvKvL zzCQhP1gw)aoL&E1#QZD+Hr>~kJ${X7)BXfr<#HeJA>lLX73e890kVw-sUCX-s>+7T zfFo^>2z6er&M~9jm_GpIy2%T=e0XGds`kqjS*L8yF)0}3Q| z6eLQRDA-Xp(!qkBVC zulKC?7qGQy{V${7-3+JFO>kJksp)6Pz|jFdMr^nY{vx1l%m))YMx4sw0@dK)0C?Ky zlX(6jz^n#I%d-THQ{|jNztjeJSHD*yaQAqx!d!vc0_gL>@=~LQt^ABg=NbM?39a%; z)AtRZ|91SM;`LXW5z+Q#&B)RU`73l;|M~j!!(IQtsdoM2vBbm?#}GI3pApd0t82yh zGWc6W944p5HEn#-@nt8>I^Dk<0PAyJcHS@itw%rf(Ba2D^W4Ajx34*R>6rmb&L7Qg;gDX9>3`@^SXwWtDT8z6~LPI2=vUf>l&!-j0i0K6jYb^ z)VNb{Rf4eXP64moj^b10=5ToxK2<=cpIfeUyjo>wE89e|F=JUC9PrO}N1;`R-$h=Y zo2%QFCQ}7;Zh>cw89vIMHos#L|J=$a5pFf&%mPv)Fl#K}cqCsZ8M8)Bvc`;G6Wf|L z5>9Q)TfInZYl5o6PRWOKlgZII60smt=L)I{iWREWHTk z9Og2UN|>7|(p}J{3dIUU=D~trh1BuD`uwOfJdoVH{-`#8I78S7{Uaaw9-o3v$RT_N zyS`urpV=>$mrclvrxAu8t5itVFybEdl}WyL2@faeR)9{m{+B_+zEJo)MHxEKs~+Gl z0HpHr)qvL|!y53FUQllYMkH|?H7fO*oh4;!I0Cfwc1>hmQ=f^|8-9FJab)Xv|7d_E^TOMRI^MPaz(dYEHK`k^`*}=j->zGP*7E{Sl{*ckS$nDxkw*Aycpkzb0%dq%84k z#72jM+l*x=nf8kSuObzgWCSULc$w)7Y1-`+oZ9UaHk1sjpO*&)y-fmDpsjGL4rgp=r5NIs$EgEQcB zH$ds(z&w#0^7z#B87PGO1%`L|a=?<}5D(=^V)Vx^S76k9#;@`vZ5$S7=2ft%2S|1L zOKi}9%mdd3TsnkbO$RI+aryE9nuL#0pTR)SpufO7920;?8=%IhNngIC27uDc z!ThG7KLN1^ZyG^DdtAYSev4dYQvF;J7G48!$}r?wo&SjCmcJ$nM9}K=;GxSObL_`oeExM$KKDKkKimQx_Gg@)FzbWYm{oA?aKPTh zXABQ{)QxA8XYC+4NIzT6i*D0NPQ`TVP^aDOsmD ziO`&KHUX?tErd<*H10RZweY)L2B~S=u&NOZ=oH!jiekysMx22%fT@PI3A_r)DlG2^ zH#1-r*ec*P7x^liUa)L~*8_oCf#AN- zFeB5PUr!MR@N+jp3_uwxDcA-SEdNRA9!HHHAC~0BU7oteGUzXVeQYm9Uzj$M9zbA( z!*~}9PbpagNK?VM5v*zgtee(<9x*G(CF_3#Qn6?W3T5cD$cN%o4;*Z8XM^vn&0O)6 zL5l&XUiCnwjb>r%3tCf&2LiCEAmgaN-W%}%PZ%pyYJjFeu>{115eS->HL_i!AK)JX z0_CMp=KPx)iL(d;M7$L6jmY&%#`;5C|1*Uwo0%HK2Q7FtdIKXa=XXw{WHnztojzLw zkpS;911_)66O%UJwBtv={q38+^PSc05B}ihKm5a+|LBiaw?F>lTkdnpA((+isx{rZ z1AG7O|Gsg+tS^1Tg;a|sLiCh#PXGV?@7Mo_|8U!I8=&XE_*XaXU3{iEwB{MJKJ@UB z4j!z>Kl{8t`}0vYaM#za6rOdeG3!(#R9d@8wN4c+s+0hNUxhu*B&elVyK>l`0l{gH z?C&yuO>FBlv#r9sw%Kvj!e6yMVFJV=8a~v4e@%LT7VxpFyjEss1d25e5${ygLf8&s zfOO+wV!&DxuFC{x1)feb=Ss{P@KcD@xHJAD0fJXCV2LUqq0g{WXw(S+nIP8*h*hdr z1wl^q7vhb2fEJilFsLx5-H!5339Fh7Ugem=3IN4+1!NcCTO3+*C2VbX6pH2R3>vdW z?ZFbjDlm6T>jWkcwuX#HTkH=Rs!ryL!*26Nf~qZ)tT9unzA&j|EJk6g&y=dmy4A$9 z%0FAhBxMo;8UO(VeqNYYb61!b=s>A}xd|6b%u4wbbpjF4mOcXxuqZNf6=scvq9|aI zgsX@_DO44hNE(&4Cj)b3Cl4^X)$gJQ2*9ic`xx_wVn!I5iC>D6HDn@9=rj+tqR&GEpT*pT zV4Ig`iF)Fp5FR`|$%942X}ne(bJOQ!ZjJu7Y;b4LI)SKX@g9oUs99BlMPk+n{?%*z zZK&L+RRqTP)j$HQ!IqR=ScA^87NYrb~DWBS?6v({tgsy_NK?82#UxS`;t^PUfAMvn5 zhu`-8i~jE4yJoKq+D(R{)rt)(NBGzOGq*=e% zs7Gabg;jN!xW&2h!G!su(N3&5a@F+qS%h#p}P?h){k0Cw>+} z-D_j0r|PL*{~5N5(mIF@^gr+VpM9U}e`XT~#*5xenY4(5qfS$CGbI%W+SO{lwVE*t zzV-v7xBY1;>uP|i|NAdrJ3X-c+*dFE&ELB5UZ)&7X@#x|GuQ4feyri=splR|nDx-b zXU>is{a63yrgXdd3FjU->*!zn#cjiF@u)KgTy^m5(-V7o=#n!N&pHFoDp3GuU3KQL z=THCa*8Yss2c-D&H(w-}b*h!7#^%3Kz`CsoS5dW^pa6lS+d8$1fS4&)-RR#Mr|KeO z6;(hYRwELrL@kgYCep78W<@wa8QBZom3%9juBJ*|paQL0?WU64tAdZ=r3>&;MJ;Tl zj8!OAMg)i?KzP<91`rO_=NzkaOwzeh9uTvVHE96SPZ6+oqfe{AP$3H=_)Z~8h1x_I z)(8X>D>(`PfDRoXUALoVVUi(WtO*_T1IB|T%7mav)~L4~W>Nwxqei`VvdYQ(Q;XRLw(vNm8808rj4G%ZuEJXqMIPnElpDj*R{X*)s~kO|r~=UN%7nO)_J z4t42zMM}|hMU|>(SjC5%MsH5b$jY^QUc|5Kv2P{@%+y$4SVM0k0_rQT*ItB#*o49i z$N?aBq`!(5C_0=>V3voki<~GuUQD?%=~@9H22`dJ>6(NrLj#kP4G6%J-#3Dc33{6; zIk5t-^eHzwUchMwvDasFo2=8J3g~hA46+7fKAXr?vg{FTnFAaNy$Zl`TDeFkmP`_8 zDi_QeF;mVUX%V#r(-?!|rU7@T!k)bLDtRrDBK`~diM*Dv8mkjQu$i_yKv)K58F1Wa z-ZyOe)uN6gFie5h4lU&>>y2^ErfUUYS+Cy~4>14}vJx=mVL_cuMMii{vIf1)l(dnd z2Y6*p#SdluYsQqrdatFi3gDLc&%#5@8mmhsUp8&2K||`Gg$m6~iDiXXcG{geW?kL% z)MK|k?VR8Kog4qhU%2Y_r=9bwzjpmU{72W`{`7Mmyi9u5LmiCgA`h4!Ig&8zqpm+| ze)QP;dINa}$o-$(WTMtec*C z?y%=y{@RUc)_>V;$B0?m%6B!bnAB-yrRosHYQh1w0ZFG&tae~k4WF9Ctlfcfyr@pM zwSIsRS1p96R0xR0D()}&07b(}aG8%MDck7;fM~R*nsc3E{}fu)77rJAI^AEi0fBfF zB&*0+g>x14YRIsa)NF#Y6sqDOOF^jA1B47!yBv2lnHRJ=fh0gU#fj!7Cotf5`DdG9 ztNb$}$Ewb{5@ytCx|E2PsMPSXUTa%r%5N^^4#RzZav0z1md*{J^(q3M(*7?&0j(CO zwFUAnA{46=u&PNCAfZ?3pFRs%MVTr}R-cdb^MyoQx$ONPRRKAZ)#pIgrkC6wrC|j; z9d)arI_%QzBpj#H zgZ>7ArV%igkpkpC8It8dg$86-HJIkBN&T!mu+F*?>X*+Lb>?e9rRDRis9FQYi}VNw zEy$x+gP_*wDItB+{Co}iL(xQKF_O&p3MPxt< zI8HLVCZ#Lt?AQ(YuLx4*2`TfX0yt_^O0K%jx{|*L^~X`iI7F@SC9x`BP8xiLmWW?s z({xe#uetuK6hBI73o6C&jZ#42Td{tTjE|)Slgw_^FTS>y73J%IS^xcS-n3EAdiE7( zis?#Fj_er#*>C*&RcOFZyz;`NVZHP7S0v1O!Hs7R8^80rw~V=02M_()uirEP&}*M~ zP7H zO?B3lp<0DQ6>KWe0b-?+=l}u462dAVHNt2m1nM?ITaApBy#q3%4?2)_s#5|;qqbFy zt6)&WqbHo2{aEXvd<9z>9Z+0ZJIZtwvOJ*Gf&tO962b~>ZFf|@mGG(LTqQj~f>*_H z74tvEo5i53Zbu0NjJ+vl80sKP4JI^uN0Au>tPv(H=3aH067InJwmVA4#!YKD?k*uK47F#Bg6nqqM1TW`+?a1lM$=628}PDG%TNU_kZ#k@&l3So|Vqh)hm>+lSr#gqVQ^2B;o_|!7VRel;;sbmCP1gS{q zY(T+c{o9!RBx5Bx>MFP?VgM6D;;J#a2ikKwmOpBDKjX2Q6TntZpNuQZX-R0K^I2o1 zI`G;%Wlrm>C~LaD0x|(8sGwXmXqg0s0Y)|uGy*1~&0w?y=(=9z1_XtM7e;VJl}J%~ zXu-5euK1y^|5?#2@g_z|J*ZjW+5!POj;EC>R#2PeAf~5)qm|fO5v>t6j2^5jZa?d; zyDuLA>tmjA&U^2?c)+aBecAa}KmP0o>>kO)>Y=WHsvID2VDEEZUF8P+AOG~ahaEXO z0K|`d{_+8;-tx3_AAIP@pZw{HbG`7UV*|iC{fborz;NWjvrivQR3{()(?7d)*m=%1 zXGuH2-bH67AbaG}m4x7JAGm~i);b5E)kAzE1~Am@G-t9>W)SzQfYnT_7T*=T{D;I! zh1jej2_OJ9zALs{i6o%akK%Bj51DFuwF9{9bR|{LEdZS3GdF-~01{{wiZx1M-(Co303aoel~xg;){l1*Zr7ac(bvB3)>aNFb7cqDkE;Lwq9! zpk^RK6`+k-i!B7K3bE>OZwq@?D-i_nU@?TX-Q>HX)X!;<+7w^HXu9%Htfu_|^eXvR zo$;;+SIStu&J7TR8o+HdGetRgt4X!WEu#Y?1rjQ;8e^nLVH!ASto=^qLlrz~~m?FTtO#!aAYK^AA-T6bV=3 z>uNNI8Zo0c+Sa;ss%{xD2sl*TRQws{_TtuPl-y|E)W{4dY>0YK02v&r_$sFv>saMs z`3mkk{pPcDAkM{Nr8C0H0$5gqouUUIge4`9cWDY)eU{O`QV2@HZd*kN(NE+Xt4P`SNA|{x@$t>Ewb;Lut+;r#XuJ||q_QnBy ze)(Hhi3e-g_&a~^+N1;+j{NvtSEO=*fACA!4Lg7JU*CAw*RK4-Kf2XqT~W8%Y9QNI z<*o*;jv)0wNeS52eXUFnsOt&31Gdph!U47+Fdz#%g>sU6#pO;<#yOlECO<<*W#wu&(O3(4A6>R)tFdEWyNH7Y!I9Rm&D^ukf@lU3)y2|g>R9yz_veGZRWLGsMuRzsVjmm-E@;U~R zMjgReJCTFVy)qw)CR5DorW_;8;HP!a^+KWq5M?vzuAr0812n823~M1`G2d^1Q<>K$ z9xSF-opAl@^ng0JUIdy!*Iz~K@l`UbuPU$nCdXBylm8k2;477aiG!tjm94f+V|A6^3qn=(mePZzgth>tu>`V?(r{ML&Q)6M)E#hpQrsJ9`J}m zzxCTUe)O}KcKesV@-MIdYd?2YAyXj+Ac{>q>j2s=yX~BR@+;R5uysJFfA;6Mef+M= z2lP3B#Rn~qe(9T6rGBj8_Vxenst4~K85612u=Uv0XZ>%#yn0~bR!=$i^x@tMZ#?@q ze)Hzxp95fh#*5Dvo|UBl(*ri^%4h>R5V4&`rG{SZ^v-ST$3lSrf#RcTIk?Z-Rcun;Kb}bu|SxCB%$6D1audsZMMy9;}@LSf>bK?SNTZ zfK-WYrPNgnSn0^9O;<`ssb6^ym+%(O!FDS z8Z}}zD7HiYs(Dmb@vpK!BCkMrQ(x628ka8VUb?lIbw%~+7GhJkK#sPX=+%kd*=j!) zA*_ctD^;_K<0@t)tIwsZ(ib2iSI+%203ES1bGE}=1zw8mugOemm@6wTg#lq+Vgx*F zSeYTq3Nu}ECBr!897Q7@r~s(RUNMC(wE-(=R+TZRb;3VK@D!Lb!<7?%hGCgjf~Fef zM`#tyG@mI1=0nS%Sks!rN5x(#RvA~$4>or2n9v5sjd|TUY1~>-zw^dkZSo)DCVJKB zo$%x>Madde^+2J-nzE2oXuJpiD$YXDwz33^7}phWvkbapiF{tr9j#;vgSH>}N($fT z*wIjRM{m@XG9|!+psmwh>wLG!PRs5{IU9U!#*4{`nLR98c+%0GpGdT= z`MYkptThn1x|uSedR?91^vOe&>|yBMHP5<#nR>8>jp26EfxVO%FomnV#Y}k=2^?JA z5;R;~c*gnHo%N7)*s7$ow(IVIbFMk-z?ny-2#1ko!O4@Ud&o zN;=o+hR#(5NvBn7>$VQPBKaD%HeiaNfDT0IR7VOJ{F)%CM6tGbe*~>|AX8gNR68UC zP`4@;uF)N(B>`P!nc}_E{VLeOfK)=&7J&dAGq84S_f?4z*eL~91h_KakC|Q#J0>=3 zj0Fe~u*NY!KtWZpUeQVwGBA}KtBKY&2@n)9t8lI?FQvswcuj|Ke4N|j00PjU8v*P* z4x@jE7%ZomSGh*B6*gA&HW8v#ht4XG94ksx1EN(!Wyzvg7RN74x$71_N2N-@jQ*to zYYQKu;9tiE0ZIbcapn5r$`ZDTRxN70OzTxZqm?jWF%SL2TqOXAT0l|-8VyxFnyv!c zuneogtU-#&>aY9e10z(O+Jaeym5dcsm0>-Fqz;PGs3-eQ>sDp%&nbVSm8P^2Utp~_)3$yp{s!E1>sr~Hjpn$~e(p$aG@ z_Kj5&tfV?1hgB&As9LTgBP20^@)Ex(pY?~b{(1b&;zHzvs0Ri$kSPbS#DrH!r)Bq1 zCkB}I6Jyn)VAo``unnOk45S{c;iGgrW7aizT`{Qxay>~hK}VQ{^niouX4C$sXl?Cu z)oQ1at2~5_Rvhk657^VTRYZURtlL^4kkRel_KEufrdqwa4bD{%Dr>H$8pyW$Rh7Ut zvQ#Nu6=A@3A$m&RUTjx$dZB05%1bge>^0Jd>)b zpaAhvv7i-ISf!VhO|1cYBo;vERS^cXC6KiY=%q4Xf@FZMQUy>RAR+;2YL$t+hj_ru z_r*a)RV$B?1DH8b5adpg6OaIq+AR-|-R`KgaIa&onGCR{KX0fjn4sw@bFPa32UXCH zs}_zcs#jZZuJUDI3pH0V-)E+kd@9Q^jP*&#RqC}8oE6fvZe(Q!R+-ykKI?TRYk=1( z%sIm?07a(%j5qQ~JMy|2%hWRYesisW*InMhTDZz2-60Twf>Dm?g;MokI7q>o7Z3FSL8(_u>y@lt2uPOFlGW%;tAJT>lVJ*_t5FTFOH;ALd`7JfGPR=8bZ-ix z0!G`hVp5|o!EB0KiCi6=SPm9I*Z-%j|C#-tsL?T1 z1eb<FK=1ni)%+@;xofK>8wRnAKbiV*IuxQEhg=bwkY?i{auEFaHbDXq> zP>FLD+EtfRM*%3fQ8+Ag~6tS#R z9l1(Ev{eSIWnxt&|DTqBHV6ooZINjuw|1vktV(4-?zFc0TZJ* z=ogU6Yymp40`mMxoi>>Jn=}B{PysHhDpy0<8VLcxYt+S8zH&DB~_eMPd zG{?J5L9IdCpEtHaN-t~BCOMDAVEhxWq3Q27$6P2k^4LZRzR)ck^D z|Je!F|E%;#o6hH;YfU1)>jvGM#k2wDOjF}78&t&lnR)^AY#D>5*TJzhd>=9E3auVk zu8meJ@On~4PTN^0z-e+P{`b|*BF8ewZ zvP}Mu27{u4RR~wwtvX~{O*PD&f}o{(wIl{q7_>v&mERGHw2-V~y%KIUoq@?#474&i ztO4AlNv#s(%DT~rtble$v716#F!74i1%YN=#Of;^)ae{nDHq^|(>B;p`GQ3i;IzUu z>hKri(~`c{NmbJtw2YM*s|34It5+p4K*Ru&C$L7MCC!R8SE6T)+K(j~KGzrKRj66E z1`x0cz!kZwN4jc6VynZTpUJEqkAmV**{$dkUttv8XXtwsx)iigzyt?|>a&3*Pnh+q zj#EQZ>xPOrjgvulvyhF#c3yURW?Ti-6l}dd9xTGuam-o1A{{^s?ud;nXs|`3>w<-DG84TJhQ+%EO&n~N2)liwJ`~adfR>84BYZ98O@2b%X z2d9&;qE>wQ3buMJ9@qffP5W1GakD^GbHWk`uqjd?YTH)GXqEB+li2D|l;!)f3@E!V z@n>fJ=b|;vg?_;G57_FoGBs-MGgQ$i__`;HuMESM8=)s}9eSim#@d5?Hr&z7=z?=zo&RD|WgX{#BA$Bj)lkGpsF?tjw#5 zAV;TKs2cIlsm@aEG=z;>$r@Brm11E<6)-KXsbxyDYBgYOAq)_zHP==t#cHhz5HWzs zv`QNyR~57>mj9sgR`*(7?eAi#u}kjO)M;PuketC z ~X5UuL7__c*GO9;W^nIkww*Nq1QYC%A2pD- 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
K{yfQzp
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ηRhU>|T$E{6Cc6sjvI-WAqJ$t{bKv%quHSIW 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 T{Bj3i00000NkvXXu0mjf&LABg literal 0 HcmV?d00001 From 18f3a85900fddd8d49704ce7264996e05e14d60c Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 05:19:13 +0100 Subject: [PATCH 044/911] Add screenshot of dark theme --- README.md | 7 +++++++ gold_dark.png | Bin 0 -> 269951 bytes 2 files changed, 7 insertions(+) create mode 100644 gold_dark.png diff --git a/README.md b/README.md index d4092ee..5aaf769 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,13 @@ Fetch README from GitHub: ./gold -s dark.json https://github.com/charmbracelet/gold ``` +When `gold` is started without any markdown source, it will try to find a `README.md` +or `README` file in the current working directory. + ## Colors Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logrusorgru/aurora#Index). + +## Example Output + +![Gold Dark Theme](https://github.com/charmbracelet/gold/raw/master/cmd/gold/gold_dark.png) diff --git a/gold_dark.png b/gold_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..921dcb356a168eea6fb9ae25c51ae66bcdde9efe GIT binary patch literal 269951 zcmV)@K!LxBP)H*0Mj_yKDRNYOS@`mTg(K?A?`>NoC32 z>OOVe^LyXZLxQwv%O9S8?o(4;UER0uLG{1??>{tM|A=n?a=L%nt#8{0RzFWVaOk81 zd+q+!ZTrCZvs?cx{~R_}w?oqdhqezMN*nEZdt0{iz1@M;t<5{P*E^^Auns4Y^Q4U~ zKRj)#^BgQYr}@ThImx!ZcRSzK2kgZId(*tX%Xg)NYVFs9y4rr`{n%~&&HkO^X^~&71sY8w!?al{7kPoZFK8f`seES z^)2e1A>Y!Tu(ST%*LTJBKjk&Ve3CAmXJqyIMRd z?kvO3a(&k_?Fs8WtHX${d}2rrfr|^8h#Gj!_M_xt37T$ z?)2;9+nsSE&d2TaPq%v1>Naeohon6o`_p;S0bxGw4EgxgZ)Y1)mR@<<6W5Ol>+O(l>9BNWxi{wDeYkDmnAQIDPOfipe4@p0 zi+Q6>uV?+wVduX5)93xeL-zHn!-k)e_3`VS3%5Q}o@M=8uOHi|b1v4u@xXkL zhM&W2IIQW%ZL@Rz!115M#%fQ$`kA)Vk!d63BhxW)_3Z2Y>6qF2fwS@E`mzz%$Gh2h zj86|)Z^!j^T>mqyw|zc7pKUiCzuFkiHrri4cDGq?40~caetp;aJiBo`;chxOt{=;T z(?8P*^Rtg9ln17}9^*@%72aH!$Y6UH%s7t(JG#&Bj~0H}+*`$ZxyLeBsGKWRou`A^+3o{}Y|w+2otUM$Au|j`4VTabB)q>HKn;lC!1bn|u;^x`3DA z^AkC|Fqcnm4sLKldG_=x%L9FWh{KDN_s8isB;c2F`LLMZVRd9`v1EBFS7pg|88<-yZ-YfPIiXATo_}1NX-9J z=c`${LI#{XJvQQ^D#xVX!sU}R`4=BA#VgFZv)o?8(CL8zt?sR1>)x<2+!8KHfK`y| zxP36)R@m`Ddq*CA?&&9;d{|(sz_^0d);mu*cKRK!xL~+F=jE&0eNQ_~lqs-sILYkj z(cyq+y!ia|6oPA~*f0onnvv*sg;@pc@`c4UU?ooF%ZM3tcGZobcKt*v_%0|`ux6Vv zWw*X}8@N{XbUZkt&-Hm$x9tp(yMky(5E(PX6d)TkNaY@ZsHTqoLrupd-JeAwHR5CVA_lAUJ*TA%00m{9Q4<3-*WWAF(HT^T~>DC9YVA=X- zw?0MysDRoCP%DTwAy>hUUSBH{7)|&x?x;OJgHA$Tfu3DHZQLo>L3twCDach2t;Z!^ zu3`}vP&r26wV+SgnBak1>+OU@6P(?`P64|izaeq}acacN*ealNb@LfC`+Ts^uvKvL zzCQhP1gw)aoL&E1#QZD+Hr>~kJ${X7)BXfr<#HeJA>lLX73e890kVw-sUCX-s>+7T zfFo^>2z6er&M~9jm_GpIy2%T=e0XGds`kqjS*L8yF)0}3Q| z6eLQRDA-Xp(!qkBVC zulKC?7qGQy{V${7-3+JFO>kJksp)6Pz|jFdMr^nY{vx1l%m))YMx4sw0@dK)0C?Ky zlX(6jz^n#I%d-THQ{|jNztjeJSHD*yaQAqx!d!vc0_gL>@=~LQt^ABg=NbM?39a%; z)AtRZ|91SM;`LXW5z+Q#&B)RU`73l;|M~j!!(IQtsdoM2vBbm?#}GI3pApd0t82yh zGWc6W944p5HEn#-@nt8>I^Dk<0PAyJcHS@itw%rf(Ba2D^W4Ajx34*R>6rmb&L7Qg;gDX9>3`@^SXwWtDT8z6~LPI2=vUf>l&!-j0i0K6jYb^ z)VNb{Rf4eXP64moj^b10=5ToxK2<=cpIfeUyjo>wE89e|F=JUC9PrO}N1;`R-$h=Y zo2%QFCQ}7;Zh>cw89vIMHos#L|J=$a5pFf&%mPv)Fl#K}cqCsZ8M8)Bvc`;G6Wf|L z5>9Q)TfInZYl5o6PRWOKlgZII60smt=L)I{iWREWHTk z9Og2UN|>7|(p}J{3dIUU=D~trh1BuD`uwOfJdoVH{-`#8I78S7{Uaaw9-o3v$RT_N zyS`urpV=>$mrclvrxAu8t5itVFybEdl}WyL2@faeR)9{m{+B_+zEJo)MHxEKs~+Gl z0HpHr)qvL|!y53FUQllYMkH|?H7fO*oh4;!I0Cfwc1>hmQ=f^|8-9FJab)Xv|7d_E^TOMRI^MPaz(dYEHK`k^`*}=j->zGP*7E{Sl{*ckS$nDxkw*Aycpkzb0%dq%84k z#72jM+l*x=nf8kSuObzgWCSULc$w)7Y1-`+oZ9UaHk1sjpO*&)y-fmDpsjGL4rgp=r5NIs$EgEQcB zH$ds(z&w#0^7z#B87PGO1%`L|a=?<}5D(=^V)Vx^S76k9#;@`vZ5$S7=2ft%2S|1L zOKi}9%mdd3TsnkbO$RI+aryE9nuL#0pTR)SpufO7920;?8=%IhNngIC27uDc z!ThG7KLN1^ZyG^DdtAYSev4dYQvF;J7G48!$}r?wo&SjCmcJ$nM9}K=;GxSObL_`oeExM$KKDKkKimQx_Gg@)FzbWYm{oA?aKPTh zXABQ{)QxA8XYC+4NIzT6i*D0NPQ`TVP^aDOsmD ziO`&KHUX?tErd<*H10RZweY)L2B~S=u&NOZ=oH!jiekysMx22%fT@PI3A_r)DlG2^ zH#1-r*ec*P7x^liUa)L~*8_oCf#AN- zFeB5PUr!MR@N+jp3_uwxDcA-SEdNRA9!HHHAC~0BU7oteGUzXVeQYm9Uzj$M9zbA( z!*~}9PbpagNK?VM5v*zgtee(<9x*G(CF_3#Qn6?W3T5cD$cN%o4;*Z8XM^vn&0O)6 zL5l&XUiCnwjb>r%3tCf&2LiCEAmgaN-W%}%PZ%pyYJjFeu>{115eS->HL_i!AK)JX z0_CMp=KPx)iL(d;M7$L6jmY&%#`;5C|1*Uwo0%HK2Q7FtdIKXa=XXw{WHnztojzLw zkpS;911_)66O%UJwBtv={q38+^PSc05B}ihKm5a+|LBiaw?F>lTkdnpA((+isx{rZ z1AG7O|Gsg+tS^1Tg;a|sLiCh#PXGV?@7Mo_|8U!I8=&XE_*XaXU3{iEwB{MJKJ@UB z4j!z>Kl{8t`}0vYaM#za6rOdeG3!(#R9d@8wN4c+s+0hNUxhu*B&elVyK>l`0l{gH z?C&yuO>FBlv#r9sw%Kvj!e6yMVFJV=8a~v4e@%LT7VxpFyjEss1d25e5${ygLf8&s zfOO+wV!&DxuFC{x1)feb=Ss{P@KcD@xHJAD0fJXCV2LUqq0g{WXw(S+nIP8*h*hdr z1wl^q7vhb2fEJilFsLx5-H!5339Fh7Ugem=3IN4+1!NcCTO3+*C2VbX6pH2R3>vdW z?ZFbjDlm6T>jWkcwuX#HTkH=Rs!ryL!*26Nf~qZ)tT9unzA&j|EJk6g&y=dmy4A$9 z%0FAhBxMo;8UO(VeqNYYb61!b=s>A}xd|6b%u4wbbpjF4mOcXxuqZNf6=scvq9|aI zgsX@_DO44hNE(&4Cj)b3Cl4^X)$gJQ2*9ic`xx_wVn!I5iC>D6HDn@9=rj+tqR&GEpT*pT zV4Ig`iF)Fp5FR`|$%942X}ne(bJOQ!ZjJu7Y;b4LI)SKX@g9oUs99BlMPk+n{?%*z zZK&L+RRqTP)j$HQ!IqR=ScA^87NYrb~DWBS?6v({tgsy_NK?82#UxS`;t^PUfAMvn5 zhu`-8i~jE4yJoKq+D(R{)rt)(NBGzOGq*=e% zs7Gabg;jN!xW&2h!G!su(N3&5a@F+qS%h#p}P?h){k0Cw>+} z-D_j0r|PL*{~5N5(mIF@^gr+VpM9U}e`XT~#*5xenY4(5qfS$CGbI%W+SO{lwVE*t zzV-v7xBY1;>uP|i|NAdrJ3X-c+*dFE&ELB5UZ)&7X@#x|GuQ4feyri=splR|nDx-b zXU>is{a63yrgXdd3FjU->*!zn#cjiF@u)KgTy^m5(-V7o=#n!N&pHFoDp3GuU3KQL z=THCa*8Yss2c-D&H(w-}b*h!7#^%3Kz`CsoS5dW^pa6lS+d8$1fS4&)-RR#Mr|KeO z6;(hYRwELrL@kgYCep78W<@wa8QBZom3%9juBJ*|paQL0?WU64tAdZ=r3>&;MJ;Tl zj8!OAMg)i?KzP<91`rO_=NzkaOwzeh9uTvVHE96SPZ6+oqfe{AP$3H=_)Z~8h1x_I z)(8X>D>(`PfDRoXUALoVVUi(WtO*_T1IB|T%7mav)~L4~W>Nwxqei`VvdYQ(Q;XRLw(vNm8808rj4G%ZuEJXqMIPnElpDj*R{X*)s~kO|r~=UN%7nO)_J z4t42zMM}|hMU|>(SjC5%MsH5b$jY^QUc|5Kv2P{@%+y$4SVM0k0_rQT*ItB#*o49i z$N?aBq`!(5C_0=>V3voki<~GuUQD?%=~@9H22`dJ>6(NrLj#kP4G6%J-#3Dc33{6; zIk5t-^eHzwUchMwvDasFo2=8J3g~hA46+7fKAXr?vg{FTnFAaNy$Zl`TDeFkmP`_8 zDi_QeF;mVUX%V#r(-?!|rU7@T!k)bLDtRrDBK`~diM*Dv8mkjQu$i_yKv)K58F1Wa z-ZyOe)uN6gFie5h4lU&>>y2^ErfUUYS+Cy~4>14}vJx=mVL_cuMMii{vIf1)l(dnd z2Y6*p#SdluYsQqrdatFi3gDLc&%#5@8mmhsUp8&2K||`Gg$m6~iDiXXcG{geW?kL% z)MK|k?VR8Kog4qhU%2Y_r=9bwzjpmU{72W`{`7Mmyi9u5LmiCgA`h4!Ig&8zqpm+| ze)QP;dINa}$o-$(WTMtec*C z?y%=y{@RUc)_>V;$B0?m%6B!bnAB-yrRosHYQh1w0ZFG&tae~k4WF9Ctlfcfyr@pM zwSIsRS1p96R0xR0D()}&07b(}aG8%MDck7;fM~R*nsc3E{}fu)77rJAI^AEi0fBfF zB&*0+g>x14YRIsa)NF#Y6sqDOOF^jA1B47!yBv2lnHRJ=fh0gU#fj!7Cotf5`DdG9 ztNb$}$Ewb{5@ytCx|E2PsMPSXUTa%r%5N^^4#RzZav0z1md*{J^(q3M(*7?&0j(CO zwFUAnA{46=u&PNCAfZ?3pFRs%MVTr}R-cdb^MyoQx$ONPRRKAZ)#pIgrkC6wrC|j; z9d)arI_%QzBpj#H zgZ>7ArV%igkpkpC8It8dg$86-HJIkBN&T!mu+F*?>X*+Lb>?e9rRDRis9FQYi}VNw zEy$x+gP_*wDItB+{Co}iL(xQKF_O&p3MPxt< zI8HLVCZ#Lt?AQ(YuLx4*2`TfX0yt_^O0K%jx{|*L^~X`iI7F@SC9x`BP8xiLmWW?s z({xe#uetuK6hBI73o6C&jZ#42Td{tTjE|)Slgw_^FTS>y73J%IS^xcS-n3EAdiE7( zis?#Fj_er#*>C*&RcOFZyz;`NVZHP7S0v1O!Hs7R8^80rw~V=02M_()uirEP&}*M~ zP7H zO?B3lp<0DQ6>KWe0b-?+=l}u462dAVHNt2m1nM?ITaApBy#q3%4?2)_s#5|;qqbFy zt6)&WqbHo2{aEXvd<9z>9Z+0ZJIZtwvOJ*Gf&tO962b~>ZFf|@mGG(LTqQj~f>*_H z74tvEo5i53Zbu0NjJ+vl80sKP4JI^uN0Au>tPv(H=3aH067InJwmVA4#!YKD?k*uK47F#Bg6nqqM1TW`+?a1lM$=628}PDG%TNU_kZ#k@&l3So|Vqh)hm>+lSr#gqVQ^2B;o_|!7VRel;;sbmCP1gS{q zY(T+c{o9!RBx5Bx>MFP?VgM6D;;J#a2ikKwmOpBDKjX2Q6TntZpNuQZX-R0K^I2o1 zI`G;%Wlrm>C~LaD0x|(8sGwXmXqg0s0Y)|uGy*1~&0w?y=(=9z1_XtM7e;VJl}J%~ zXu-5euK1y^|5?#2@g_z|J*ZjW+5!POj;EC>R#2PeAf~5)qm|fO5v>t6j2^5jZa?d; zyDuLA>tmjA&U^2?c)+aBecAa}KmP0o>>kO)>Y=WHsvID2VDEEZUF8P+AOG~ahaEXO z0K|`d{_+8;-tx3_AAIP@pZw{HbG`7UV*|iC{fborz;NWjvrivQR3{()(?7d)*m=%1 zXGuH2-bH67AbaG}m4x7JAGm~i);b5E)kAzE1~Am@G-t9>W)SzQfYnT_7T*=T{D;I! zh1jej2_OJ9zALs{i6o%akK%Bj51DFuwF9{9bR|{LEdZS3GdF-~01{{wiZx1M-(Co303aoel~xg;){l1*Zr7ac(bvB3)>aNFb7cqDkE;Lwq9! zpk^RK6`+k-i!B7K3bE>OZwq@?D-i_nU@?TX-Q>HX)X!;<+7w^HXu9%Htfu_|^eXvR zo$;;+SIStu&J7TR8o+HdGetRgt4X!WEu#Y?1rjQ;8e^nLVH!ASto=^qLlrz~~m?FTtO#!aAYK^AA-T6bV=3 z>uNNI8Zo0c+Sa;ss%{xD2sl*TRQws{_TtuPl-y|E)W{4dY>0YK02v&r_$sFv>saMs z`3mkk{pPcDAkM{Nr8C0H0$5gqouUUIge4`9cWDY)eU{O`QV2@HZd*kN(NE+Xt4P`SNA|{x@$t>Ewb;Lut+;r#XuJ||q_QnBy ze)(Hhi3e-g_&a~^+N1;+j{NvtSEO=*fACA!4Lg7JU*CAw*RK4-Kf2XqT~W8%Y9QNI z<*o*;jv)0wNeS52eXUFnsOt&31Gdph!U47+Fdz#%g>sU6#pO;<#yOlECO<<*W#wu&(O3(4A6>R)tFdEWyNH7Y!I9Rm&D^ukf@lU3)y2|g>R9yz_veGZRWLGsMuRzsVjmm-E@;U~R zMjgReJCTFVy)qw)CR5DorW_;8;HP!a^+KWq5M?vzuAr0812n823~M1`G2d^1Q<>K$ z9xSF-opAl@^ng0JUIdy!*Iz~K@l`UbuPU$nCdXBylm8k2;477aiG!tjm94f+V|A6^3qn=(mePZzgth>tu>`V?(r{ML&Q)6M)E#hpQrsJ9`J}m zzxCTUe)O}KcKesV@-MIdYd?2YAyXj+Ac{>q>j2s=yX~BR@+;R5uysJFfA;6Mef+M= z2lP3B#Rn~qe(9T6rGBj8_Vxenst4~K85612u=Uv0XZ>%#yn0~bR!=$i^x@tMZ#?@q ze)Hzxp95fh#*5Dvo|UBl(*ri^%4h>R5V4&`rG{SZ^v-ST$3lSrf#RcTIk?Z-Rcun;Kb}bu|SxCB%$6D1audsZMMy9;}@LSf>bK?SNTZ zfK-WYrPNgnSn0^9O;<`ssb6^ym+%(O!FDS z8Z}}zD7HiYs(Dmb@vpK!BCkMrQ(x628ka8VUb?lIbw%~+7GhJkK#sPX=+%kd*=j!) zA*_ctD^;_K<0@t)tIwsZ(ib2iSI+%203ES1bGE}=1zw8mugOemm@6wTg#lq+Vgx*F zSeYTq3Nu}ECBr!897Q7@r~s(RUNMC(wE-(=R+TZRb;3VK@D!Lb!<7?%hGCgjf~Fef zM`#tyG@mI1=0nS%Sks!rN5x(#RvA~$4>or2n9v5sjd|TUY1~>-zw^dkZSo)DCVJKB zo$%x>Madde^+2J-nzE2oXuJpiD$YXDwz33^7}phWvkbapiF{tr9j#;vgSH>}N($fT z*wIjRM{m@XG9|!+psmwh>wLG!PRs5{IU9U!#*4{`nLR98c+%0GpGdT= z`MYkptThn1x|uSedR?91^vOe&>|yBMHP5<#nR>8>jp26EfxVO%FomnV#Y}k=2^?JA z5;R;~c*gnHo%N7)*s7$ow(IVIbFMk-z?ny-2#1ko!O4@Ud&o zN;=o+hR#(5NvBn7>$VQPBKaD%HeiaNfDT0IR7VOJ{F)%CM6tGbe*~>|AX8gNR68UC zP`4@;uF)N(B>`P!nc}_E{VLeOfK)=&7J&dAGq84S_f?4z*eL~91h_KakC|Q#J0>=3 zj0Fe~u*NY!KtWZpUeQVwGBA}KtBKY&2@n)9t8lI?FQvswcuj|Ke4N|j00PjU8v*P* z4x@jE7%ZomSGh*B6*gA&HW8v#ht4XG94ksx1EN(!Wyzvg7RN74x$71_N2N-@jQ*to zYYQKu;9tiE0ZIbcapn5r$`ZDTRxN70OzTxZqm?jWF%SL2TqOXAT0l|-8VyxFnyv!c zuneogtU-#&>aY9e10z(O+Jaeym5dcsm0>-Fqz;PGs3-eQ>sDp%&nbVSm8P^2Utp~_)3$yp{s!E1>sr~Hjpn$~e(p$aG@ z_Kj5&tfV?1hgB&As9LTgBP20^@)Ex(pY?~b{(1b&;zHzvs0Ri$kSPbS#DrH!r)Bq1 zCkB}I6Jyn)VAo``unnOk45S{c;iGgrW7aizT`{Qxay>~hK}VQ{^niouX4C$sXl?Cu z)oQ1at2~5_Rvhk657^VTRYZURtlL^4kkRel_KEufrdqwa4bD{%Dr>H$8pyW$Rh7Ut zvQ#Nu6=A@3A$m&RUTjx$dZB05%1bge>^0Jd>)b zpaAhvv7i-ISf!VhO|1cYBo;vERS^cXC6KiY=%q4Xf@FZMQUy>RAR+;2YL$t+hj_ru z_r*a)RV$B?1DH8b5adpg6OaIq+AR-|-R`KgaIa&onGCR{KX0fjn4sw@bFPa32UXCH zs}_zcs#jZZuJUDI3pH0V-)E+kd@9Q^jP*&#RqC}8oE6fvZe(Q!R+-ykKI?TRYk=1( z%sIm?07a(%j5qQ~JMy|2%hWRYesisW*InMhTDZz2-60Twf>Dm?g;MokI7q>o7Z3FSL8(_u>y@lt2uPOFlGW%;tAJT>lVJ*_t5FTFOH;ALd`7JfGPR=8bZ-ix z0!G`hVp5|o!EB0KiCi6=SPm9I*Z-%j|C#-tsL?T1 z1eb<FK=1ni)%+@;xofK>8wRnAKbiV*IuxQEhg=bwkY?i{auEFaHbDXq> zP>FLD+EtfRM*%3fQ8+Ag~6tS#R z9l1(Ev{eSIWnxt&|DTqBHV6ooZINjuw|1vktV(4-?zFc0TZJ* z=ogU6Yymp40`mMxoi>>Jn=}B{PysHhDpy0<8VLcxYt+S8zH&DB~_eMPd zG{?J5L9IdCpEtHaN-t~BCOMDAVEhxWq3Q27$6P2k^4LZRzR)ck^D z|Je!F|E%;#o6hH;YfU1)>jvGM#k2wDOjF}78&t&lnR)^AY#D>5*TJzhd>=9E3auVk zu8meJ@On~4PTN^0z-e+P{`b|*BF8ewZ zvP}Mu27{u4RR~wwtvX~{O*PD&f}o{(wIl{q7_>v&mERGHw2-V~y%KIUoq@?#474&i ztO4AlNv#s(%DT~rtble$v716#F!74i1%YN=#Of;^)ae{nDHq^|(>B;p`GQ3i;IzUu z>hKri(~`c{NmbJtw2YM*s|34It5+p4K*Ru&C$L7MCC!R8SE6T)+K(j~KGzrKRj66E z1`x0cz!kZwN4jc6VynZTpUJEqkAmV**{$dkUttv8XXtwsx)iigzyt?|>a&3*Pnh+q zj#EQZ>xPOrjgvulvyhF#c3yURW?Ti-6l}dd9xTGuam-o1A{{^s?ud;nXs|`3>w<-DG84TJhQ+%EO&n~N2)liwJ`~adfR>84BYZ98O@2b%X z2d9&;qE>wQ3buMJ9@qffP5W1GakD^GbHWk`uqjd?YTH)GXqEB+li2D|l;!)f3@E!V z@n>fJ=b|;vg?_;G57_FoGBs-MGgQ$i__`;HuMESM8=)s}9eSim#@d5?Hr&z7=z?=zo&RD|WgX{#BA$Bj)lkGpsF?tjw#5 zAV;TKs2cIlsm@aEG=z;>$r@Brm11E<6)-KXsbxyDYBgYOAq)_zHP==t#cHhz5HWzs zv`QNyR~57>mj9sgR`*(7?eAi#u}kjO)M;PuketC z ~X5UuL7__c*GO9;W^nIkww*Nq1QYC%A2pD- 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

K{yfQzp
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ηRhU>|T$E{6Cc6sjvI-WAqJ$t{bKv%quHSIW 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 T{Bj3i00000NkvXXu0mjf&LABg literal 0 HcmV?d00001 From d3fbd578395d5ddbacd2159200a5fc04a442d7a7 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Sun, 24 Nov 2019 13:35:01 -0600 Subject: [PATCH 045/911] Move Render and RenderBytes to TermRenderer --- cmd/gold/main.go | 3 ++- gold.go | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/cmd/gold/main.go b/cmd/gold/main.go index 411ab5c..1837a82 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -82,10 +82,11 @@ func execute(cmd *cobra.Command, args []string) error { defer in.Close() b, _ := ioutil.ReadAll(in) - out, err := gold.RenderBytes(b, style) + r, err := gold.NewTermRenderer(style) if err != nil { return err } + out := r.RenderBytes(b) fmt.Printf("%s", string(out)) return nil } diff --git a/gold.go b/gold.go index ad2bff7..a1b1dfe 100644 --- a/gold.go +++ b/gold.go @@ -46,7 +46,7 @@ func RenderBytes(in []byte, stylePath string) ([]byte, error) { if err != nil { return nil, err } - return bf.Run(in, bf.WithRenderer(r)), nil + return r.RenderBytes(in), nil } func NewTermRenderer(stylePath string) (*TermRenderer, error) { @@ -254,6 +254,14 @@ func NewElement(node *bf.Node) Element { } } +func (tr *TermRenderer) Render(in string) string { + return string(tr.RenderBytes([]byte(in))) +} + +func (tr *TermRenderer) RenderBytes(in []byte) []byte { + return bf.Run(in, bf.WithRenderer(tr)) +} + func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { // fmt.Fprintf(w, "%s %t", node.Type, entering) el := NewElement(node) From 9adff17b7069f7135c359fdaf98953d736a8daeb Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Sun, 24 Nov 2019 13:35:01 -0600 Subject: [PATCH 046/911] Move Render and RenderBytes to TermRenderer --- main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 411ab5c..1837a82 100644 --- a/main.go +++ b/main.go @@ -82,10 +82,11 @@ func execute(cmd *cobra.Command, args []string) error { defer in.Close() b, _ := ioutil.ReadAll(in) - out, err := gold.RenderBytes(b, style) + r, err := gold.NewTermRenderer(style) if err != nil { return err } + out := r.RenderBytes(b) fmt.Printf("%s", string(out)) return nil } From b600bc47ef5f8b448bb6f7500e71902ac9fa8e6c Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 07:38:18 +0100 Subject: [PATCH 047/911] Use ElementStyles to determine rendering style Since BlackFriday's Nodes are limiting us a bit in rendering flexibility, I've introduced Gold's own ElementStyles (a bit of code repetition here, but alas). Nodes can now be divided into multiple fragments, which means we are able to display the link's URL and text in different styles. Updated the dark theme to demo the newly gained flexibility. --- cmd/gold/dark.json | 7 + gold.go | 421 ++++++++++++++++++++++++++++++--------------- 2 files changed, 293 insertions(+), 135 deletions(-) diff --git a/cmd/gold/dark.json b/cmd/gold/dark.json index 75d3550..f876eb6 100644 --- a/cmd/gold/dark.json +++ b/cmd/gold/dark.json @@ -3,6 +3,13 @@ "color": "123", "underline": true }, + "link_text": { + "color": "123", + "bold": true + }, + "image": { + "color": "8" + }, "heading": { "bold": true, "color": "3" diff --git a/gold.go b/gold.go index a1b1dfe..a82832d 100644 --- a/gold.go +++ b/gold.go @@ -13,6 +13,36 @@ import ( bf "gopkg.in/russross/blackfriday.v2" ) +type StyleType int + +const ( + Document StyleType = iota + BlockQuote + List + Item + Paragraph + Heading + HorizontalRule + Emph + Strong + Del + Link + LinkText + Image + Text + HTMLBlock + CodeBlock + Softbreak + Hardbreak + Code + HTMLSpan + Table + TableCell + TableHead + TableBody + TableRow +) + type ElementStyle struct { Color string `json:"color"` BackgroundColor string `json:"background_color"` @@ -27,14 +57,21 @@ type ElementStyle struct { Blink bool `json:"blink"` } -type Element struct { +type Fragment struct { Token string Pre string Post string + Style StyleType +} + +type Element struct { + Pre string + Post string + Fragments []Fragment } type TermRenderer struct { - style map[bf.NodeType]*ElementStyle + style map[StyleType]*ElementStyle } func Render(in string, stylePath string) ([]byte, error) { @@ -63,13 +100,13 @@ func NewTermRenderer(stylePath string) (*TermRenderer, error) { } func NewTermRendererFromBytes(b []byte) (*TermRenderer, error) { - e := make(map[string]*ElementStyle, 0) + e := make(map[string]*ElementStyle) err := json.Unmarshal(b, &e) if err != nil { return nil, err } tr := &TermRenderer{} - tr.style = make(map[bf.NodeType]*ElementStyle) + tr.style = make(map[StyleType]*ElementStyle) for k, v := range e { t, err := keyToType(k) @@ -86,27 +123,39 @@ func NewElement(node *bf.Node) Element { switch node.Type { case bf.Document: return Element{ - Token: "", - Pre: "", - Post: "", + Pre: "", + Post: "", + Fragments: []Fragment{{ + Token: "", + Style: Document, + }}, } case bf.BlockQuote: return Element{ - Token: string(node.Literal), - Pre: "\n", - Post: "\n", + Pre: "\n", + Post: "\n", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: BlockQuote, + }}, } case bf.List: return Element{ - Token: string(node.Literal), - Pre: "\n", - Post: "", + Pre: "\n", + Post: "", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: List, + }}, } case bf.Item: return Element{ - Token: string(node.Literal), - Pre: "• ", - Post: "", + Pre: "• ", + Post: "", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: Item, + }}, } case bf.Paragraph: pre := "\n" @@ -115,9 +164,12 @@ func NewElement(node *bf.Node) Element { } return Element{ - Token: string(node.Literal), - Pre: pre, - Post: "\n", + Pre: pre, + Post: "\n", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: Paragraph, + }}, } case bf.Heading: var pre string @@ -126,130 +178,209 @@ func NewElement(node *bf.Node) Element { } return Element{ - Token: fmt.Sprintf("%s %s", strings.Repeat("#", node.HeadingData.Level), node.FirstChild.Literal), - Pre: pre, - Post: "\n", + Pre: pre, + Post: "\n", + Fragments: []Fragment{{ + Token: fmt.Sprintf("%s %s", strings.Repeat("#", node.HeadingData.Level), node.FirstChild.Literal), + Style: Heading, + }}, } case bf.HorizontalRule: return Element{ - Token: "---", - Pre: "\n", - Post: "\n", + Pre: "\n", + Post: "\n", + Fragments: []Fragment{{ + Token: "---", + Style: HorizontalRule, + }}, } case bf.Emph: return Element{ - Token: string(node.FirstChild.Literal), - Pre: "", - Post: "", + Pre: "", + Post: "", + Fragments: []Fragment{{ + Token: string(node.FirstChild.Literal), + Style: Emph, + }}, } case bf.Strong: return Element{ - Token: string(node.FirstChild.Literal), - Pre: "", - Post: "", + Pre: "", + Post: "", + Fragments: []Fragment{{ + Token: string(node.FirstChild.Literal), + Style: Strong, + }}, } case bf.Del: return Element{ - Token: string(node.Literal), - Pre: "", - Post: "", + Pre: "", + Post: "", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: Del, + }}, } case bf.Link: + f := []Fragment{} + if len(node.LastChild.Literal) > 0 { + f = append(f, Fragment{ + Token: string(node.LastChild.Literal), + Style: LinkText, + }) + } + if len(node.LinkData.Destination) > 0 { + f = append(f, Fragment{ + Token: string(node.LinkData.Destination), + Pre: " (", + Post: ")", + Style: Link, + }) + } + return Element{ - Token: fmt.Sprintf("[%s](%s)", string(node.LastChild.Literal), string(node.LinkData.Destination)), - Pre: "", - Post: "", + Pre: "", + Post: "", + Fragments: f, } case bf.Image: + f := []Fragment{} + if len(node.LastChild.Literal) > 0 { + f = append(f, Fragment{ + Token: string(node.LastChild.Literal), + Style: Image, + }) + } + if len(node.LinkData.Destination) > 0 { + f = append(f, Fragment{ + Token: string(node.LinkData.Destination), + Pre: " [Image: ", + Post: "]", + Style: Link, + }) + } + return Element{ - Token: string(node.Literal), - Pre: "", - Post: "", + Pre: "", + Post: "", + Fragments: f, } case bf.Text: - if node.Parent != nil && node.Parent.Type != bf.Link { - return Element{ - Token: string(node.Literal), - Pre: "", - Post: "", - } - } return Element{ - Token: "", - Pre: "", - Post: "", + Pre: "", + Post: "", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: Text, + }}, } case bf.HTMLBlock: return Element{ - Token: string(node.Literal), - Pre: "\n", - Post: "\n", + Pre: "\n", + Post: "\n", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: HTMLBlock, + }}, } case bf.CodeBlock: return Element{ - Token: string(node.Literal), - Pre: "\n", - Post: "\n", + Pre: "\n", + Post: "\n", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: CodeBlock, + }}, } case bf.Softbreak: return Element{ - Token: string(node.Literal), - Pre: "", - Post: "\n", + Pre: "", + Post: "\n", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: Softbreak, + }}, } case bf.Hardbreak: return Element{ - Token: string(node.Literal), - Pre: "\n", - Post: "\n", + Pre: "\n", + Post: "\n", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: Hardbreak, + }}, } case bf.Code: return Element{ - Token: string(node.Literal), - Pre: "", - Post: "", + Pre: "", + Post: "", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: Code, + }}, } case bf.HTMLSpan: return Element{ - Token: string(node.Literal), - Pre: "", - Post: "", + Pre: "", + Post: "", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: HTMLSpan, + }}, } case bf.Table: return Element{ - Token: string(node.Literal), - Pre: "\n", - Post: "\n", + Pre: "\n", + Post: "\n", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: Table, + }}, } case bf.TableCell: return Element{ - Token: string(node.Literal), - Pre: "", - Post: "", + Pre: "", + Post: "", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: TableCell, + }}, } case bf.TableHead: return Element{ - Token: string(node.Literal), - Pre: "", - Post: "", + Pre: "", + Post: "", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: TableHead, + }}, } case bf.TableBody: return Element{ - Token: string(node.Literal), - Pre: "", - Post: "", + Pre: "", + Post: "", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: TableBody, + }}, } case bf.TableRow: return Element{ - Token: string(node.Literal), - Pre: "\n", - Post: "\n", + Pre: "\n", + Post: "\n", + Fragments: []Fragment{{ + Token: string(node.Literal), + Style: TableRow, + }}, } + default: return Element{ - Token: string(node.Literal), - Pre: "", - Post: "", + Pre: "", + Post: "", + Fragments: []Fragment{{ + Token: string(node.Literal), + }}, } } } @@ -262,30 +393,14 @@ func (tr *TermRenderer) RenderBytes(in []byte) []byte { return bf.Run(in, bf.WithRenderer(tr)) } -func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { - // fmt.Fprintf(w, "%s %t", node.Type, entering) - el := NewElement(node) - if entering && el.Pre != "" { - fmt.Fprintf(w, "%s", el.Pre) - } - if !entering && el.Post != "" { - fmt.Fprintf(w, "%s", el.Post) - } - if isChild(node) { - return bf.GoToNext - } - if !entering { - return bf.GoToNext - } - if el.Token == "" { - return bf.GoToNext - } - rules := tr.style[node.Type] +func (tr *TermRenderer) renderFragment(w io.Writer, f Fragment) { + rules := tr.style[f.Style] if rules == nil { - fmt.Fprintf(w, "%s", el.Token) - return bf.GoToNext + fmt.Fprintf(w, "%s", f.Token) + return } - out := aurora.Reset(el.Token) + + out := aurora.Reset(f.Token) if rules.Color != "" { i, err := strconv.Atoi(rules.Color) if err == nil && i >= 0 && i <= 255 { @@ -319,7 +434,40 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf if rules.Blink { out = out.Blink() } + w.Write([]byte(aurora.Sprintf("%s", out))) +} + +func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { + // fmt.Fprintf(w, "%s %t", node.Type, entering) + e := NewElement(node) + if entering && e.Pre != "" { + fmt.Fprintf(w, "%s", e.Pre) + } + if !entering && e.Post != "" { + fmt.Fprintf(w, "%s", e.Post) + } + if isChild(node) { + return bf.GoToNext + } + if !entering { + return bf.GoToNext + } + + for _, f := range e.Fragments { + if f.Token == "" { + continue + } + + if f.Pre != "" { + fmt.Fprintf(w, "%s", f.Pre) + } + tr.renderFragment(w, f) + if f.Post != "" { + fmt.Fprintf(w, "%s", f.Post) + } + } + return bf.GoToNext } @@ -334,64 +482,67 @@ func isChild(node *bf.Node) bool { return false } switch node.Parent.Type { - case bf.Heading, bf.Link, bf.Emph, bf.Strong: + case bf.Heading, bf.Link, bf.Image, bf.Emph, bf.Strong: return true default: return false } } -func keyToType(key string) (bf.NodeType, error) { +func keyToType(key string) (StyleType, error) { switch key { case "document": - return bf.Document, nil + return Document, nil case "block_quote": - return bf.BlockQuote, nil + return BlockQuote, nil case "list": - return bf.List, nil + return List, nil case "item": - return bf.Item, nil + return Item, nil case "paragraph": - return bf.Paragraph, nil + return Paragraph, nil case "heading": - return bf.Heading, nil + return Heading, nil case "hr": - return bf.HorizontalRule, nil + return HorizontalRule, nil case "emph": - return bf.Emph, nil + return Emph, nil case "strong": - return bf.Strong, nil + return Strong, nil case "del": - return bf.Del, nil + return Del, nil case "link": - return bf.Link, nil + return Link, nil + case "link_text": + return LinkText, nil case "image": - return bf.Image, nil + return Image, nil case "text": - return bf.Text, nil + return Text, nil case "html_block": - return bf.HTMLBlock, nil + return HTMLBlock, nil case "code_block": - return bf.CodeBlock, nil + return CodeBlock, nil case "softbreak": - return bf.Softbreak, nil + return Softbreak, nil case "hardbreak": - return bf.Hardbreak, nil + return Hardbreak, nil case "code": - return bf.Code, nil + return Code, nil case "html_span": - return bf.HTMLSpan, nil + return HTMLSpan, nil case "table": - return bf.Table, nil + return Table, nil case "table_cel": - return bf.TableCell, nil + return TableCell, nil case "table_head": - return bf.TableHead, nil + return TableHead, nil case "table_body": - return bf.TableBody, nil + return TableBody, nil case "table_row": - return bf.TableRow, nil + return TableRow, nil + default: - return 0, fmt.Errorf("Invalid element type: %s", key) + return 0, fmt.Errorf("Invalid style element type: %s", key) } } From dca563ea25d08122673ecc14544beb2d75bfca5b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 24 Nov 2019 07:38:18 +0100 Subject: [PATCH 048/911] Use ElementStyles to determine rendering style Since BlackFriday's Nodes are limiting us a bit in rendering flexibility, I've introduced Gold's own ElementStyles (a bit of code repetition here, but alas). Nodes can now be divided into multiple fragments, which means we are able to display the link's URL and text in different styles. Updated the dark theme to demo the newly gained flexibility. --- dark.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dark.json b/dark.json index 75d3550..f876eb6 100644 --- a/dark.json +++ b/dark.json @@ -3,6 +3,13 @@ "color": "123", "underline": true }, + "link_text": { + "color": "123", + "bold": true + }, + "image": { + "color": "8" + }, "heading": { "bold": true, "color": "3" From b289f59056223bd259f4f07202ece5d1f077504b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 02:39:12 +0100 Subject: [PATCH 049/911] Handle nested content inside links --- gold.go | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/gold.go b/gold.go index a82832d..284ee65 100644 --- a/gold.go +++ b/gold.go @@ -221,13 +221,21 @@ func NewElement(node *bf.Node) Element { Style: Del, }}, } + case bf.Link: f := []Fragment{} - if len(node.LastChild.Literal) > 0 { - f = append(f, Fragment{ - Token: string(node.LastChild.Literal), - Style: LinkText, - }) + + if node.LastChild != nil { + if node.LastChild.Type == bf.Image { + el := NewElement(node.LastChild) + f = el.Fragments + } + if len(node.LastChild.Literal) > 0 { + f = append(f, Fragment{ + Token: string(node.LastChild.Literal), + Style: LinkText, + }) + } } if len(node.LinkData.Destination) > 0 { f = append(f, Fragment{ @@ -243,6 +251,7 @@ func NewElement(node *bf.Node) Element { Post: "", Fragments: f, } + case bf.Image: f := []Fragment{} if len(node.LastChild.Literal) > 0 { @@ -265,6 +274,7 @@ func NewElement(node *bf.Node) Element { Post: "", Fragments: f, } + case bf.Text: return Element{ Pre: "", From c604c99640b415aaf7b285c2f16e021dfb787def Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 04:25:58 +0100 Subject: [PATCH 050/911] Use a plain-text renderer when not printing to Terminal --- cmd/gold/main.go | 13 +++++++++---- go.mod | 1 + go.sum | 4 ++++ gold.go | 4 ++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/cmd/gold/main.go b/cmd/gold/main.go index 1837a82..2ab8192 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -10,6 +10,7 @@ import ( "os" "strings" + "github.com/mattn/go-isatty" "github.com/spf13/cobra" "github.com/charmbracelet/gold" @@ -80,12 +81,16 @@ func execute(cmd *cobra.Command, args []string) error { return err } defer in.Close() - b, _ := ioutil.ReadAll(in) - r, err := gold.NewTermRenderer(style) - if err != nil { - return err + + r := gold.NewPlainTermRenderer() + if isatty.IsTerminal(os.Stdout.Fd()) { + r, err = gold.NewTermRenderer(style) + if err != nil { + return err + } } + out := r.RenderBytes(b) fmt.Printf("%s", string(out)) return nil diff --git a/go.mod b/go.mod index 75a6a38..034b419 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.13 require ( github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 + github.com/mattn/go-isatty v0.0.10 github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/spf13/cobra v0.0.5 gopkg.in/russross/blackfriday.v2 v2.0.0 diff --git a/go.sum b/go.sum index 0f3396b..88608a7 100644 --- a/go.sum +++ b/go.sum @@ -11,6 +11,8 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 h1:im9kkmH0WWwxzegiv18gSUJbuXR9y028rXrWuPp6Jug= github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -31,6 +33,8 @@ github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljT github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/russross/blackfriday.v2 v2.0.0 h1:+FlnIV8DSQnT7NZ43hcVKcdJdzZoeCmJj4Ql8gq5keA= diff --git a/gold.go b/gold.go index 284ee65..7d84822 100644 --- a/gold.go +++ b/gold.go @@ -86,6 +86,10 @@ func RenderBytes(in []byte, stylePath string) ([]byte, error) { return r.RenderBytes(in), nil } +func NewPlainTermRenderer() *TermRenderer { + return &TermRenderer{} +} + func NewTermRenderer(stylePath string) (*TermRenderer, error) { if stylePath == "" { return NewTermRendererFromBytes([]byte("{}")) From f09d2907bd0baf2849af2abfb6a969ad2a919d59 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 04:25:58 +0100 Subject: [PATCH 051/911] Use a plain-text renderer when not printing to Terminal --- main.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index 1837a82..2ab8192 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,7 @@ import ( "os" "strings" + "github.com/mattn/go-isatty" "github.com/spf13/cobra" "github.com/charmbracelet/gold" @@ -80,12 +81,16 @@ func execute(cmd *cobra.Command, args []string) error { return err } defer in.Close() - b, _ := ioutil.ReadAll(in) - r, err := gold.NewTermRenderer(style) - if err != nil { - return err + + r := gold.NewPlainTermRenderer() + if isatty.IsTerminal(os.Stdout.Fd()) { + r, err = gold.NewTermRenderer(style) + if err != nil { + return err + } } + out := r.RenderBytes(b) fmt.Printf("%s", string(out)) return nil From 8b2817be1f2539a04eb1a24a55f7121492f1098a Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 04:55:09 +0100 Subject: [PATCH 052/911] Support github URLs without protocol --- cmd/gold/github.go | 14 +++++++++----- cmd/gold/main.go | 16 ++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/cmd/gold/github.go b/cmd/gold/github.go index fff8fde..2a7661a 100644 --- a/cmd/gold/github.go +++ b/cmd/gold/github.go @@ -8,13 +8,17 @@ import ( ) // isGitHubURL tests a string to determine if it is a well-structured GitHub URL -func isGitHubURL(s string) bool { - u, err := url.ParseRequestURI(s) - if err != nil { - return false +func isGitHubURL(s string) (string, bool) { + if strings.HasPrefix(s, "github.com/") { + s = "https://" + s } - return strings.ToLower(u.Host) == "github.com" + u, err := url.ParseRequestURI(s) + if err != nil { + return "", false + } + + return u.String(), strings.ToLower(u.Host) == "github.com" } // findGitHubREADME tries to find the correct README filename in a repository diff --git a/cmd/gold/main.go b/cmd/gold/main.go index 2ab8192..0578d2b 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -34,19 +34,19 @@ func readerFromArg(s string) (io.ReadCloser, error) { return os.Stdin, nil } + if u, ok := isGitHubURL(s); ok { + resp, err := findGitHubREADME(u) + if err != nil { + return nil, err + } + return resp.Body, nil + } + if u, err := url.ParseRequestURI(s); err == nil { if !strings.HasPrefix(u.Scheme, "http") { return nil, fmt.Errorf("%s is not a supported protocol", u.Scheme) } - if isGitHubURL(s) { - resp, err := findGitHubREADME(s) - if err != nil { - return nil, err - } - return resp.Body, nil - } - resp, err := http.Get(u.String()) if err != nil { return nil, err From 1baefbbec13451ab1ddacd3caf4c84cf8996887b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 04:55:09 +0100 Subject: [PATCH 053/911] Support github URLs without protocol --- github.go | 14 +++++++++----- main.go | 16 ++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/github.go b/github.go index fff8fde..2a7661a 100644 --- a/github.go +++ b/github.go @@ -8,13 +8,17 @@ import ( ) // isGitHubURL tests a string to determine if it is a well-structured GitHub URL -func isGitHubURL(s string) bool { - u, err := url.ParseRequestURI(s) - if err != nil { - return false +func isGitHubURL(s string) (string, bool) { + if strings.HasPrefix(s, "github.com/") { + s = "https://" + s } - return strings.ToLower(u.Host) == "github.com" + u, err := url.ParseRequestURI(s) + if err != nil { + return "", false + } + + return u.String(), strings.ToLower(u.Host) == "github.com" } // findGitHubREADME tries to find the correct README filename in a repository diff --git a/main.go b/main.go index 2ab8192..0578d2b 100644 --- a/main.go +++ b/main.go @@ -34,19 +34,19 @@ func readerFromArg(s string) (io.ReadCloser, error) { return os.Stdin, nil } + if u, ok := isGitHubURL(s); ok { + resp, err := findGitHubREADME(u) + if err != nil { + return nil, err + } + return resp.Body, nil + } + if u, err := url.ParseRequestURI(s); err == nil { if !strings.HasPrefix(u.Scheme, "http") { return nil, fmt.Errorf("%s is not a supported protocol", u.Scheme) } - if isGitHubURL(s) { - resp, err := findGitHubREADME(s) - if err != nil { - return nil, err - } - return resp.Body, nil - } - resp, err := http.Get(u.String()) if err != nil { return nil, err From 66e19cac3c8c16916975e5eabc9e948dd22b68f2 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 04:58:59 +0100 Subject: [PATCH 054/911] Link to cmd/gold instead of main.go --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c8b0a0a..9d5f1aa 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ color and terminal codes instead of CSS properties and hex colors. ## Usage -See [cmd/gold](cmd/gold/main.go). +See [cmd/gold](cmd/gold/). ## Colors From 4e4fca4e34afca7b1c39ebc8634ed373e619aa34 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 05:03:26 +0100 Subject: [PATCH 055/911] Update README --- cmd/gold/README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cmd/gold/README.md b/cmd/gold/README.md index 5aaf769..dde04e4 100644 --- a/cmd/gold/README.md +++ b/cmd/gold/README.md @@ -18,7 +18,12 @@ Read from stdin: Fetch README from GitHub: ``` -./gold -s dark.json https://github.com/charmbracelet/gold +./gold -s dark.json github.com/charmbracelet/gold +``` + +Fetch markdown from an HTTP source: +``` +./gold -s dark.json https://host.tld/file.md ``` When `gold` is started without any markdown source, it will try to find a `README.md` From e40b04218e926b33880f865e94c21a90e89faa40 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 05:03:26 +0100 Subject: [PATCH 056/911] Update README --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5aaf769..dde04e4 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,12 @@ Read from stdin: Fetch README from GitHub: ``` -./gold -s dark.json https://github.com/charmbracelet/gold +./gold -s dark.json github.com/charmbracelet/gold +``` + +Fetch markdown from an HTTP source: +``` +./gold -s dark.json https://host.tld/file.md ``` When `gold` is started without any markdown source, it will try to find a `README.md` From 31d8ca634662726d201040846e117a42eee57e76 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 05:14:25 +0100 Subject: [PATCH 057/911] Check for supported HTTP/HTTPS protocols explicitly --- cmd/gold/main.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cmd/gold/main.go b/cmd/gold/main.go index 0578d2b..eba0ce4 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -8,7 +8,6 @@ import ( "net/http" "net/url" "os" - "strings" "github.com/mattn/go-isatty" "github.com/spf13/cobra" @@ -43,7 +42,7 @@ func readerFromArg(s string) (io.ReadCloser, error) { } if u, err := url.ParseRequestURI(s); err == nil { - if !strings.HasPrefix(u.Scheme, "http") { + if u.Scheme != "http" && u.Scheme != "https" { return nil, fmt.Errorf("%s is not a supported protocol", u.Scheme) } @@ -61,7 +60,7 @@ func readerFromArg(s string) (io.ReadCloser, error) { for _, v := range readmeNames { r, err := os.Open(v) if err == nil { - return r, err + return r, nil } } From 2bfaa5ece91071698eaba8a1587d429635077fdd Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 05:14:25 +0100 Subject: [PATCH 058/911] Check for supported HTTP/HTTPS protocols explicitly --- main.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 0578d2b..eba0ce4 100644 --- a/main.go +++ b/main.go @@ -8,7 +8,6 @@ import ( "net/http" "net/url" "os" - "strings" "github.com/mattn/go-isatty" "github.com/spf13/cobra" @@ -43,7 +42,7 @@ func readerFromArg(s string) (io.ReadCloser, error) { } if u, err := url.ParseRequestURI(s); err == nil { - if !strings.HasPrefix(u.Scheme, "http") { + if u.Scheme != "http" && u.Scheme != "https" { return nil, fmt.Errorf("%s is not a supported protocol", u.Scheme) } @@ -61,7 +60,7 @@ func readerFromArg(s string) (io.ReadCloser, error) { for _, v := range readmeNames { r, err := os.Open(v) if err == nil { - return r, err + return r, nil } } From 9291f45faa1eb21060c5a019c9dac84fd48684cc Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 05:18:49 +0100 Subject: [PATCH 059/911] Move style handling to style.go --- gold.go | 102 ---------------------------------------------------- style.go | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 102 deletions(-) create mode 100644 style.go diff --git a/gold.go b/gold.go index 7d84822..e3dad7d 100644 --- a/gold.go +++ b/gold.go @@ -13,50 +13,6 @@ import ( bf "gopkg.in/russross/blackfriday.v2" ) -type StyleType int - -const ( - Document StyleType = iota - BlockQuote - List - Item - Paragraph - Heading - HorizontalRule - Emph - Strong - Del - Link - LinkText - Image - Text - HTMLBlock - CodeBlock - Softbreak - Hardbreak - Code - HTMLSpan - Table - TableCell - TableHead - TableBody - TableRow -) - -type ElementStyle struct { - Color string `json:"color"` - BackgroundColor string `json:"background_color"` - Underline bool `json:"underline"` - Bold bool `json:"bold"` - Italic bool `json:"italic"` - CrossedOut bool `json:"crossed_out"` - Faint bool `json:"faint"` - Conceal bool `json:"conceal"` - Overlined bool `json:"overlined"` - Inverse bool `json:"inverse"` - Blink bool `json:"blink"` -} - type Fragment struct { Token string Pre string @@ -502,61 +458,3 @@ func isChild(node *bf.Node) bool { return false } } - -func keyToType(key string) (StyleType, error) { - switch key { - case "document": - return Document, nil - case "block_quote": - return BlockQuote, nil - case "list": - return List, nil - case "item": - return Item, nil - case "paragraph": - return Paragraph, nil - case "heading": - return Heading, nil - case "hr": - return HorizontalRule, nil - case "emph": - return Emph, nil - case "strong": - return Strong, nil - case "del": - return Del, nil - case "link": - return Link, nil - case "link_text": - return LinkText, nil - case "image": - return Image, nil - case "text": - return Text, nil - case "html_block": - return HTMLBlock, nil - case "code_block": - return CodeBlock, nil - case "softbreak": - return Softbreak, nil - case "hardbreak": - return Hardbreak, nil - case "code": - return Code, nil - case "html_span": - return HTMLSpan, nil - case "table": - return Table, nil - case "table_cel": - return TableCell, nil - case "table_head": - return TableHead, nil - case "table_body": - return TableBody, nil - case "table_row": - return TableRow, nil - - default: - return 0, fmt.Errorf("Invalid style element type: %s", key) - } -} diff --git a/style.go b/style.go new file mode 100644 index 0000000..0a951ba --- /dev/null +++ b/style.go @@ -0,0 +1,107 @@ +package gold + +import ( + "fmt" +) + +type StyleType int + +const ( + Document StyleType = iota + BlockQuote + List + Item + Paragraph + Heading + HorizontalRule + Emph + Strong + Del + Link + LinkText + Image + Text + HTMLBlock + CodeBlock + Softbreak + Hardbreak + Code + HTMLSpan + Table + TableCell + TableHead + TableBody + TableRow +) + +type ElementStyle struct { + Color string `json:"color"` + BackgroundColor string `json:"background_color"` + Underline bool `json:"underline"` + Bold bool `json:"bold"` + Italic bool `json:"italic"` + CrossedOut bool `json:"crossed_out"` + Faint bool `json:"faint"` + Conceal bool `json:"conceal"` + Overlined bool `json:"overlined"` + Inverse bool `json:"inverse"` + Blink bool `json:"blink"` +} + +func keyToType(key string) (StyleType, error) { + switch key { + case "document": + return Document, nil + case "block_quote": + return BlockQuote, nil + case "list": + return List, nil + case "item": + return Item, nil + case "paragraph": + return Paragraph, nil + case "heading": + return Heading, nil + case "hr": + return HorizontalRule, nil + case "emph": + return Emph, nil + case "strong": + return Strong, nil + case "del": + return Del, nil + case "link": + return Link, nil + case "link_text": + return LinkText, nil + case "image": + return Image, nil + case "text": + return Text, nil + case "html_block": + return HTMLBlock, nil + case "code_block": + return CodeBlock, nil + case "softbreak": + return Softbreak, nil + case "hardbreak": + return Hardbreak, nil + case "code": + return Code, nil + case "html_span": + return HTMLSpan, nil + case "table": + return Table, nil + case "table_cel": + return TableCell, nil + case "table_head": + return TableHead, nil + case "table_body": + return TableBody, nil + case "table_row": + return TableRow, nil + + default: + return 0, fmt.Errorf("Invalid style element type: %s", key) + } +} From 51ffc0d1ade953e7e22265dd8edf908c873987b9 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 02:56:15 +0100 Subject: [PATCH 060/911] Enable code highlighting with chroma --- go.mod | 1 + go.sum | 42 ++++++++++++++++++++++++++++++++++++++++++ gold.go | 9 +++++++++ 3 files changed, 52 insertions(+) diff --git a/go.mod b/go.mod index 034b419..3d31c23 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/charmbracelet/gold go 1.13 require ( + github.com/alecthomas/chroma v0.7.0 github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 github.com/mattn/go-isatty v0.0.10 github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect diff --git a/go.sum b/go.sum index 88608a7..319a11e 100644 --- a/go.sum +++ b/go.sum @@ -1,23 +1,58 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= +github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= +github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= +github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= +github.com/alecthomas/chroma v0.7.0 h1:z+0HgTUmkpRDRz0SRSdMaqOLfJV4F+N1FPDZUZIDUzw= +github.com/alecthomas/chroma v0.7.0/go.mod h1:1U/PfCsTALWWYHDnsIQkxEBM0+6LLe0v8+RSVMOwxeY= +github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo= +github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= +github.com/alecthomas/kong v0.1.17-0.20190424132513-439c674f7ae0/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= +github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= +github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MRgZdU3vrFd05IQ89AxUZ0aYdF39BYoNFa324SodPCA= +github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= +github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= +github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= +github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dlclark/regexp2 v1.1.6 h1:CqB4MjHw0MFCDj+PHHjiESmHX+N7t0tJzKvC6M97BRg= +github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gorilla/csrf v1.6.0/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= +github.com/gorilla/handlers v1.4.1/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 h1:im9kkmH0WWwxzegiv18gSUJbuXR9y028rXrWuPp6Jug= github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -28,10 +63,17 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a h1:1n5lsVfiQW3yfsRGu98756EH1YthsFqr/5mxHduZW2A= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20191008105621-543471e840be h1:QAcqgptGM8IQBC9K/RC4o+O9YmqEm0diQn9QmZw/0mU= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/gold.go b/gold.go index e3dad7d..d766264 100644 --- a/gold.go +++ b/gold.go @@ -9,6 +9,7 @@ import ( "strconv" "strings" + "github.com/alecthomas/chroma/quick" "github.com/logrusorgru/aurora" bf "gopkg.in/russross/blackfriday.v2" ) @@ -425,6 +426,14 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf } for _, f := range e.Fragments { + if node.Type == bf.CodeBlock { + err := quick.Highlight(w, f.Token, string(node.CodeBlockData.Info), "terminal16m", "monokai") + if err == nil { + continue + } + // if chroma failed, render the fragment as text below + } + if f.Token == "" { continue } From 67685a4ebe3f6e4da4128eaa45f5e95806130ee3 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 05:57:43 +0100 Subject: [PATCH 061/911] Let user pick a syntax color theme in Gold's style config --- cmd/gold/dark.json | 3 ++- gold.go | 9 ++++++++- style.go | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/cmd/gold/dark.json b/cmd/gold/dark.json index f876eb6..b853212 100644 --- a/cmd/gold/dark.json +++ b/cmd/gold/dark.json @@ -18,7 +18,8 @@ "color": "200" }, "code_block": { - "color": "200" + "color": "200", + "theme": "solarized-dark" }, "emph": { "italic": true diff --git a/gold.go b/gold.go index d766264..61a5384 100644 --- a/gold.go +++ b/gold.go @@ -427,7 +427,14 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf for _, f := range e.Fragments { if node.Type == bf.CodeBlock { - err := quick.Highlight(w, f.Token, string(node.CodeBlockData.Info), "terminal16m", "monokai") + theme := "monokai" + if rules, ok := tr.style[f.Style]; ok { + if len(rules.Theme) > 0 { + theme = rules.Theme + } + } + + err := quick.Highlight(w, f.Token, string(node.CodeBlockData.Info), "terminal16m", theme) if err == nil { continue } diff --git a/style.go b/style.go index 0a951ba..3afe646 100644 --- a/style.go +++ b/style.go @@ -46,6 +46,7 @@ type ElementStyle struct { Overlined bool `json:"overlined"` Inverse bool `json:"inverse"` Blink bool `json:"blink"` + Theme string `json:"theme"` } func keyToType(key string) (StyleType, error) { From a6d648d863ed941025535b6c766ba51e3cff52a5 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 05:57:43 +0100 Subject: [PATCH 062/911] Let user pick a syntax color theme in Gold's style config --- dark.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dark.json b/dark.json index f876eb6..b853212 100644 --- a/dark.json +++ b/dark.json @@ -18,7 +18,8 @@ "color": "200" }, "code_block": { - "color": "200" + "color": "200", + "theme": "solarized-dark" }, "emph": { "italic": true From 10da623e26df001095cb9c06a46c9b791e128a01 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 06:42:34 +0100 Subject: [PATCH 063/911] Word-wrap text at 100 chars per default The default can be overwritten by the user: ./gold -w 80 --- cmd/gold/main.go | 6 +++++- go.mod | 1 + go.sum | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/cmd/gold/main.go b/cmd/gold/main.go index eba0ce4..9b88cc6 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -10,6 +10,7 @@ import ( "os" "github.com/mattn/go-isatty" + "github.com/mitchellh/go-wordwrap" "github.com/spf13/cobra" "github.com/charmbracelet/gold" @@ -25,7 +26,9 @@ var ( SilenceUsage: false, RunE: execute, } + style string + width uint ) func readerFromArg(s string) (io.ReadCloser, error) { @@ -91,7 +94,7 @@ func execute(cmd *cobra.Command, args []string) error { } out := r.RenderBytes(b) - fmt.Printf("%s", string(out)) + fmt.Printf("%s", wordwrap.WrapString(string(out), width)) return nil } @@ -103,4 +106,5 @@ func main() { func init() { rootCmd.Flags().StringVarP(&style, "style", "s", "dark.json", "style JSON path") + rootCmd.Flags().UintVarP(&width, "width", "w", 100, "word-wrap at width") } diff --git a/go.mod b/go.mod index 3d31c23..6f0344f 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/alecthomas/chroma v0.7.0 github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 github.com/mattn/go-isatty v0.0.10 + github.com/mitchellh/go-wordwrap v1.0.0 github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/spf13/cobra v0.0.5 gopkg.in/russross/blackfriday.v2 v2.0.0 diff --git a/go.sum b/go.sum index 319a11e..4dd0521 100644 --- a/go.sum +++ b/go.sum @@ -43,6 +43,8 @@ github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= From 240eb4f2f8157f32b3cc67d907e5db0a591af046 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 06:42:34 +0100 Subject: [PATCH 064/911] Word-wrap text at 100 chars per default The default can be overwritten by the user: ./gold -w 80 --- main.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index eba0ce4..9b88cc6 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,7 @@ import ( "os" "github.com/mattn/go-isatty" + "github.com/mitchellh/go-wordwrap" "github.com/spf13/cobra" "github.com/charmbracelet/gold" @@ -25,7 +26,9 @@ var ( SilenceUsage: false, RunE: execute, } + style string + width uint ) func readerFromArg(s string) (io.ReadCloser, error) { @@ -91,7 +94,7 @@ func execute(cmd *cobra.Command, args []string) error { } out := r.RenderBytes(b) - fmt.Printf("%s", string(out)) + fmt.Printf("%s", wordwrap.WrapString(string(out), width)) return nil } @@ -103,4 +106,5 @@ func main() { func init() { rootCmd.Flags().StringVarP(&style, "style", "s", "dark.json", "style JSON path") + rootCmd.Flags().UintVarP(&width, "width", "w", 100, "word-wrap at width") } From f8cc1b7e020a290d3a34a1766ea54400b9c6ebbe Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 05:30:18 +0100 Subject: [PATCH 065/911] Strip HTML tags and render plain-text content only --- go.mod | 1 + go.sum | 4 ++++ gold.go | 11 ++++++++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6f0344f..3ad010d 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/alecthomas/chroma v0.7.0 github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 github.com/mattn/go-isatty v0.0.10 + github.com/microcosm-cc/bluemonday v1.0.2 github.com/mitchellh/go-wordwrap v1.0.0 github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/spf13/cobra v0.0.5 diff --git a/go.sum b/go.sum index 4dd0521..20fd3d9 100644 --- a/go.sum +++ b/go.sum @@ -42,6 +42,8 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= @@ -74,6 +76,8 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3 h1:eH6Eip3UpmR+yM/qI9Ijluzb1bNv/cAU/n+6l8tRSis= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a h1:1n5lsVfiQW3yfsRGu98756EH1YthsFqr/5mxHduZW2A= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/gold.go b/gold.go index 61a5384..ab2f7f2 100644 --- a/gold.go +++ b/gold.go @@ -11,9 +11,14 @@ import ( "github.com/alecthomas/chroma/quick" "github.com/logrusorgru/aurora" + "github.com/microcosm-cc/bluemonday" bf "gopkg.in/russross/blackfriday.v2" ) +var ( + stripper = bluemonday.StrictPolicy() +) + type Fragment struct { Token string Pre string @@ -247,10 +252,10 @@ func NewElement(node *bf.Node) Element { } case bf.HTMLBlock: return Element{ - Pre: "\n", - Post: "\n", + Pre: "", + Post: "", Fragments: []Fragment{{ - Token: string(node.Literal), + Token: strings.TrimSpace(stripper.Sanitize(string(node.Literal))) + "\n", Style: HTMLBlock, }}, } From 9589289d6002b775a07c48bde2b25d987de03716 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 06:55:50 +0100 Subject: [PATCH 066/911] Basic GitLab support --- cmd/gold/gitlab.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ cmd/gold/main.go | 7 +++++++ 2 files changed, 53 insertions(+) create mode 100644 cmd/gold/gitlab.go diff --git a/cmd/gold/gitlab.go b/cmd/gold/gitlab.go new file mode 100644 index 0000000..2c5676e --- /dev/null +++ b/cmd/gold/gitlab.go @@ -0,0 +1,46 @@ +package main + +import ( + "errors" + "net/http" + "net/url" + "strings" +) + +// isGitLabURL tests a string to determine if it is a well-structured GitLab URL +func isGitLabURL(s string) (string, bool) { + if strings.HasPrefix(s, "gitlab.com/") { + s = "https://" + s + } + + u, err := url.ParseRequestURI(s) + if err != nil { + return "", false + } + + return u.String(), strings.ToLower(u.Host) == "gitlab.com" +} + +// findGitLabREADME tries to find the correct README filename in a repository +func findGitLabREADME(s string) (*http.Response, error) { + u, err := url.ParseRequestURI(s) + if err != nil { + return nil, err + } + + for _, r := range readmeNames { + v := u + v.Path += "/raw/master/" + r + + resp, err := http.Get(v.String()) + if err != nil { + return nil, err + } + + if resp.StatusCode == http.StatusOK { + return resp, nil + } + } + + return nil, errors.New("can't find README in GitLab repository") +} diff --git a/cmd/gold/main.go b/cmd/gold/main.go index 9b88cc6..cce9761 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -43,6 +43,13 @@ func readerFromArg(s string) (io.ReadCloser, error) { } return resp.Body, nil } + if u, ok := isGitLabURL(s); ok { + resp, err := findGitLabREADME(u) + if err != nil { + return nil, err + } + return resp.Body, nil + } if u, err := url.ParseRequestURI(s); err == nil { if u.Scheme != "http" && u.Scheme != "https" { From 9ffa4d5b16407d48c044b8453d565c6ceba66065 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 06:55:50 +0100 Subject: [PATCH 067/911] Basic GitLab support --- gitlab.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ main.go | 7 +++++++ 2 files changed, 53 insertions(+) create mode 100644 gitlab.go diff --git a/gitlab.go b/gitlab.go new file mode 100644 index 0000000..2c5676e --- /dev/null +++ b/gitlab.go @@ -0,0 +1,46 @@ +package main + +import ( + "errors" + "net/http" + "net/url" + "strings" +) + +// isGitLabURL tests a string to determine if it is a well-structured GitLab URL +func isGitLabURL(s string) (string, bool) { + if strings.HasPrefix(s, "gitlab.com/") { + s = "https://" + s + } + + u, err := url.ParseRequestURI(s) + if err != nil { + return "", false + } + + return u.String(), strings.ToLower(u.Host) == "gitlab.com" +} + +// findGitLabREADME tries to find the correct README filename in a repository +func findGitLabREADME(s string) (*http.Response, error) { + u, err := url.ParseRequestURI(s) + if err != nil { + return nil, err + } + + for _, r := range readmeNames { + v := u + v.Path += "/raw/master/" + r + + resp, err := http.Get(v.String()) + if err != nil { + return nil, err + } + + if resp.StatusCode == http.StatusOK { + return resp, nil + } + } + + return nil, errors.New("can't find README in GitLab repository") +} diff --git a/main.go b/main.go index 9b88cc6..cce9761 100644 --- a/main.go +++ b/main.go @@ -43,6 +43,13 @@ func readerFromArg(s string) (io.ReadCloser, error) { } return resp.Body, nil } + if u, ok := isGitLabURL(s); ok { + resp, err := findGitLabREADME(u) + if err != nil { + return nil, err + } + return resp.Body, nil + } if u, err := url.ParseRequestURI(s); err == nil { if u.Scheme != "http" && u.Scheme != "https" { From b25fcb31fb582a68067c77b0d94d8cb2a50c5b24 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 07:15:24 +0100 Subject: [PATCH 068/911] HTML-sanitize all text elements --- gold.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gold.go b/gold.go index ab2f7f2..1b07f14 100644 --- a/gold.go +++ b/gold.go @@ -246,7 +246,7 @@ func NewElement(node *bf.Node) Element { Pre: "", Post: "", Fragments: []Fragment{{ - Token: string(node.Literal), + Token: stripper.Sanitize(string(node.Literal)), Style: Text, }}, } @@ -300,7 +300,7 @@ func NewElement(node *bf.Node) Element { Pre: "", Post: "", Fragments: []Fragment{{ - Token: string(node.Literal), + Token: strings.TrimSpace(stripper.Sanitize(string(node.Literal))) + "\n", Style: HTMLSpan, }}, } From 959958d28040135872031137212240367006e37b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 07:28:17 +0100 Subject: [PATCH 069/911] Unescape sanitized HTML --- gold.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gold.go b/gold.go index 1b07f14..0bb6f75 100644 --- a/gold.go +++ b/gold.go @@ -3,6 +3,7 @@ package gold import ( "encoding/json" "fmt" + "html" "io" "io/ioutil" "os" @@ -246,7 +247,7 @@ func NewElement(node *bf.Node) Element { Pre: "", Post: "", Fragments: []Fragment{{ - Token: stripper.Sanitize(string(node.Literal)), + Token: html.UnescapeString(stripper.Sanitize(string(node.Literal))), Style: Text, }}, } @@ -255,7 +256,7 @@ func NewElement(node *bf.Node) Element { Pre: "", Post: "", Fragments: []Fragment{{ - Token: strings.TrimSpace(stripper.Sanitize(string(node.Literal))) + "\n", + Token: html.UnescapeString(strings.TrimSpace(stripper.Sanitize(string(node.Literal)))) + "\n", Style: HTMLBlock, }}, } @@ -300,7 +301,7 @@ func NewElement(node *bf.Node) Element { Pre: "", Post: "", Fragments: []Fragment{{ - Token: strings.TrimSpace(stripper.Sanitize(string(node.Literal))) + "\n", + Token: html.UnescapeString(strings.TrimSpace(stripper.Sanitize(string(node.Literal)))) + "\n", Style: HTMLSpan, }}, } From 501f4e3b6a3c3cd32d9b922d0921f668124f05ae Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 07:56:54 +0100 Subject: [PATCH 070/911] Disable syntax highlighting when output is no terminal --- gold.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/gold.go b/gold.go index 0bb6f75..f8dd8b5 100644 --- a/gold.go +++ b/gold.go @@ -433,18 +433,19 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf for _, f := range e.Fragments { if node.Type == bf.CodeBlock { - theme := "monokai" + theme := "" if rules, ok := tr.style[f.Style]; ok { if len(rules.Theme) > 0 { theme = rules.Theme } } - - err := quick.Highlight(w, f.Token, string(node.CodeBlockData.Info), "terminal16m", theme) - if err == nil { - continue + if len(theme) > 0 { + err := quick.Highlight(w, f.Token, string(node.CodeBlockData.Info), "terminal16m", theme) + if err == nil { + continue + } + // if chroma failed, render the fragment as text below } - // if chroma failed, render the fragment as text below } if f.Token == "" { From b7fc18e6e075bb6d5f05703c13ff24c4d4aefc4f Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 10:03:33 +0100 Subject: [PATCH 071/911] Fix word-wrapping in colored output --- cmd/gold/main.go | 2 +- go.mod | 2 +- go.sum | 4 ++-- gold.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/gold/main.go b/cmd/gold/main.go index cce9761..b5244a8 100644 --- a/cmd/gold/main.go +++ b/cmd/gold/main.go @@ -10,7 +10,7 @@ import ( "os" "github.com/mattn/go-isatty" - "github.com/mitchellh/go-wordwrap" + "github.com/muesli/go-wordwrap" "github.com/spf13/cobra" "github.com/charmbracelet/gold" diff --git a/go.mod b/go.mod index 3ad010d..8d9a62c 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 github.com/mattn/go-isatty v0.0.10 github.com/microcosm-cc/bluemonday v1.0.2 - github.com/mitchellh/go-wordwrap v1.0.0 + github.com/muesli/go-wordwrap v1.0.1-0.20191125090158-10bc5504e2a8 github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/spf13/cobra v0.0.5 gopkg.in/russross/blackfriday.v2 v2.0.0 diff --git a/go.sum b/go.sum index 20fd3d9..4207938 100644 --- a/go.sum +++ b/go.sum @@ -45,9 +45,9 @@ github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcME github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/muesli/go-wordwrap v1.0.1-0.20191125090158-10bc5504e2a8 h1:pkJGPjqhekH0hq/lJABlh5EhzU7eU/+VdFq9ZMOae2E= +github.com/muesli/go-wordwrap v1.0.1-0.20191125090158-10bc5504e2a8/go.mod h1:isHWaQQfvQ38DUiq7ugbuPZowGJ+9gPmACGc3tDUN4M= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/gold.go b/gold.go index f8dd8b5..0299b01 100644 --- a/gold.go +++ b/gold.go @@ -433,7 +433,7 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf for _, f := range e.Fragments { if node.Type == bf.CodeBlock { - theme := "" + var theme string if rules, ok := tr.style[f.Style]; ok { if len(rules.Theme) > 0 { theme = rules.Theme From 5766f35363f0f76831fa51b7aa0eaa2eb7277a96 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 10:03:33 +0100 Subject: [PATCH 072/911] Fix word-wrapping in colored output --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index cce9761..b5244a8 100644 --- a/main.go +++ b/main.go @@ -10,7 +10,7 @@ import ( "os" "github.com/mattn/go-isatty" - "github.com/mitchellh/go-wordwrap" + "github.com/muesli/go-wordwrap" "github.com/spf13/cobra" "github.com/charmbracelet/gold" From e8152b914fc1032c8dcf0475a0344701003c5662 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 25 Nov 2019 22:24:22 +0100 Subject: [PATCH 073/911] Use pixterm to render images --- go.mod | 3 +++ go.sum | 11 +++++++++++ gold.go | 20 +++++++++++++++++--- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8d9a62c..3c829f2 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,10 @@ go 1.13 require ( github.com/alecthomas/chroma v0.7.0 + github.com/disintegration/imaging v1.6.2 // indirect + github.com/eliukblau/pixterm v1.2.4 github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 + github.com/lucasb-eyer/go-colorful v0.0.0-20170903184257-231272389856 github.com/mattn/go-isatty v0.0.10 github.com/microcosm-cc/bluemonday v1.0.2 github.com/muesli/go-wordwrap v1.0.1-0.20191125090158-10bc5504e2a8 diff --git a/go.sum b/go.sum index 4207938..5f0ac0b 100644 --- a/go.sum +++ b/go.sum @@ -24,8 +24,12 @@ github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= +github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/dlclark/regexp2 v1.1.6 h1:CqB4MjHw0MFCDj+PHHjiESmHX+N7t0tJzKvC6M97BRg= github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/eliukblau/pixterm v1.2.4 h1:EQ8KuWLeDNdm/AWZlylR9hX0elAve+MXLoIFh9Ssrjo= +github.com/eliukblau/pixterm v1.2.4/go.mod h1:SLrMnkvTqu64HiEUZ+UEQOAh81M4FlxDwxU69KmWJuQ= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gorilla/csrf v1.6.0/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= github.com/gorilla/handlers v1.4.1/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= @@ -37,6 +41,10 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 h1:im9kkmH0WWwxzegiv18gSUJbuXR9y028rXrWuPp6Jug= github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lucasb-eyer/go-colorful v0.0.0-20170903184257-231272389856 h1:r+WvXmgROttp7pckv7TPN7OCUEPXmvhRklOOsL2iPPc= +github.com/lucasb-eyer/go-colorful v0.0.0-20170903184257-231272389856/go.mod h1:NXg0ArsFk0Y01623LgUqoqcouGDB+PwCCQlrwrG6xJ4= +github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= +github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -75,7 +83,10 @@ github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljT github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9 h1:mKdxBk7AujPs8kU4m80U72y/zjbZ3UcXC7dClwKbUI0= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U= +golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/net v0.0.0-20181220203305-927f97764cc3 h1:eH6Eip3UpmR+yM/qI9Ijluzb1bNv/cAU/n+6l8tRSis= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/gold.go b/gold.go index 0299b01..0912f11 100644 --- a/gold.go +++ b/gold.go @@ -11,7 +11,9 @@ import ( "strings" "github.com/alecthomas/chroma/quick" + "github.com/eliukblau/pixterm/ansimage" "github.com/logrusorgru/aurora" + "github.com/lucasb-eyer/go-colorful" "github.com/microcosm-cc/bluemonday" bf "gopkg.in/russross/blackfriday.v2" ) @@ -230,9 +232,9 @@ func NewElement(node *bf.Node) Element { if len(node.LinkData.Destination) > 0 { f = append(f, Fragment{ Token: string(node.LinkData.Destination), - Pre: " [Image: ", - Post: "]", - Style: Link, + // Pre: " [Image: ", + // Post: "]", + Style: Image, }) } @@ -377,6 +379,18 @@ func (tr *TermRenderer) renderFragment(w io.Writer, f Fragment) { return } + if f.Style == Image { + sm := ansimage.ScaleMode(2) + dm := ansimage.DitheringMode(0) + mc, _ := colorful.Hex("#000000") + pix, err := ansimage.NewScaledFromURL(f.Token, 62, 80, mc, sm, dm) + if err != nil { + return + } + fmt.Fprintf(w, "%s", pix.Render()) + return + } + out := aurora.Reset(f.Token) if rules.Color != "" { i, err := strconv.Atoi(rules.Color) From 8eabf0f4036efd861679d3a064870c1466e11c01 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 26 Nov 2019 00:08:06 +0100 Subject: [PATCH 074/911] Handle relative URLs in markdown, when a BaseURL is provided --- github.go | 4 ++-- gitlab.go | 4 ++-- main.go | 37 +++++++++++++++++++++++++------------ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/github.go b/github.go index 2a7661a..1b04da7 100644 --- a/github.go +++ b/github.go @@ -22,7 +22,7 @@ func isGitHubURL(s string) (string, bool) { } // findGitHubREADME tries to find the correct README filename in a repository -func findGitHubREADME(s string) (*http.Response, error) { +func findGitHubREADME(s string) (*Source, error) { u, err := url.ParseRequestURI(s) if err != nil { return nil, err @@ -39,7 +39,7 @@ func findGitHubREADME(s string) (*http.Response, error) { } if resp.StatusCode == http.StatusOK { - return resp, nil + return &Source{resp.Body, v.String()}, nil } } diff --git a/gitlab.go b/gitlab.go index 2c5676e..7c6dfa5 100644 --- a/gitlab.go +++ b/gitlab.go @@ -22,7 +22,7 @@ func isGitLabURL(s string) (string, bool) { } // findGitLabREADME tries to find the correct README filename in a repository -func findGitLabREADME(s string) (*http.Response, error) { +func findGitLabREADME(s string) (*Source, error) { u, err := url.ParseRequestURI(s) if err != nil { return nil, err @@ -38,7 +38,7 @@ func findGitLabREADME(s string) (*http.Response, error) { } if resp.StatusCode == http.StatusOK { - return resp, nil + return &Source{resp.Body, v.String()}, nil } } diff --git a/main.go b/main.go index b5244a8..dffb5cc 100644 --- a/main.go +++ b/main.go @@ -8,6 +8,7 @@ import ( "net/http" "net/url" "os" + "path/filepath" "github.com/mattn/go-isatty" "github.com/muesli/go-wordwrap" @@ -31,24 +32,29 @@ var ( width uint ) -func readerFromArg(s string) (io.ReadCloser, error) { +type Source struct { + reader io.ReadCloser + URL string +} + +func readerFromArg(s string) (*Source, error) { if s == "-" { - return os.Stdin, nil + return &Source{reader: os.Stdin}, nil } if u, ok := isGitHubURL(s); ok { - resp, err := findGitHubREADME(u) + src, err := findGitHubREADME(u) if err != nil { return nil, err } - return resp.Body, nil + return src, nil } if u, ok := isGitLabURL(s); ok { - resp, err := findGitLabREADME(u) + src, err := findGitLabREADME(u) if err != nil { return nil, err } - return resp.Body, nil + return src, nil } if u, err := url.ParseRequestURI(s); err == nil { @@ -63,21 +69,22 @@ func readerFromArg(s string) (io.ReadCloser, error) { if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("HTTP status %d", resp.StatusCode) } - return resp.Body, nil + return &Source{resp.Body, u.String()}, nil } if len(s) == 0 { for _, v := range readmeNames { r, err := os.Open(v) if err == nil { - return r, nil + return &Source{reader: r}, nil } } return nil, errors.New("missing markdown source") } - return os.Open(s) + r, err := os.Open(s) + return &Source{reader: r}, err } func execute(cmd *cobra.Command, args []string) error { @@ -85,12 +92,12 @@ func execute(cmd *cobra.Command, args []string) error { if len(args) > 0 { arg = args[0] } - in, err := readerFromArg(arg) + src, err := readerFromArg(arg) if err != nil { return err } - defer in.Close() - b, _ := ioutil.ReadAll(in) + defer src.reader.Close() + b, _ := ioutil.ReadAll(src.reader) r := gold.NewPlainTermRenderer() if isatty.IsTerminal(os.Stdout.Fd()) { @@ -100,6 +107,12 @@ func execute(cmd *cobra.Command, args []string) error { } } + u, err := url.ParseRequestURI(src.URL) + if err == nil { + u.Path = filepath.Dir(u.Path) + r.BaseURL = u.String() + "/" + } + out := r.RenderBytes(b) fmt.Printf("%s", wordwrap.WrapString(string(out), width)) return nil From 532fceed223c17f9d2f29734774157ba52825491 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 26 Nov 2019 00:34:15 +0100 Subject: [PATCH 075/911] Calculate baseURL for local files --- main.go | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/main.go b/main.go index dffb5cc..3ec8b6d 100644 --- a/main.go +++ b/main.go @@ -58,25 +58,28 @@ func readerFromArg(s string) (*Source, error) { } if u, err := url.ParseRequestURI(s); err == nil { - if u.Scheme != "http" && u.Scheme != "https" { - return nil, fmt.Errorf("%s is not a supported protocol", u.Scheme) - } + if u.Scheme != "" { + if u.Scheme != "http" && u.Scheme != "https" { + return nil, fmt.Errorf("%s is not a supported protocol", u.Scheme) + } - resp, err := http.Get(u.String()) - if err != nil { - return nil, err + resp, err := http.Get(u.String()) + if err != nil { + return nil, err + } + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("HTTP status %d", resp.StatusCode) + } + return &Source{resp.Body, u.String()}, nil } - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("HTTP status %d", resp.StatusCode) - } - return &Source{resp.Body, u.String()}, nil } if len(s) == 0 { for _, v := range readmeNames { r, err := os.Open(v) if err == nil { - return &Source{reader: r}, nil + u, _ := filepath.Abs(v) + return &Source{r, u}, nil } } @@ -84,7 +87,8 @@ func readerFromArg(s string) (*Source, error) { } r, err := os.Open(s) - return &Source{reader: r}, err + u, _ := filepath.Abs(s) + return &Source{r, u}, err } func execute(cmd *cobra.Command, args []string) error { From 1f5aa2793479125f20ed26d1b5dd2e82e930bbd2 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 26 Nov 2019 21:03:46 +0100 Subject: [PATCH 076/911] Embed default dark style into binary --- README.md | 27 +++++++++++++++++++-------- main.go | 32 ++++++++++++++++++++++++++++++-- statik/statik.go | 12 ++++++++++++ dark.json => styles/dark.json | 0 4 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 statik/statik.go rename dark.json => styles/dark.json (100%) diff --git a/README.md b/README.md index dde04e4..71ffec3 100644 --- a/README.md +++ b/README.md @@ -4,30 +4,41 @@ Render markdown on the CLI, with _pizzazz_! ## Usage -Supply a JSON stylesheet with the `-s` flag. Use a markdown source as the argument. +Use a markdown source as the argument: Read from file: ``` -./gold -s dark.json README.md +./gold README.md ``` Read from stdin: ``` -./gold -s dark.json - +./gold - ``` Fetch README from GitHub: ``` -./gold -s dark.json github.com/charmbracelet/gold +./gold github.com/charmbracelet/gold ``` Fetch markdown from an HTTP source: ``` -./gold -s dark.json https://host.tld/file.md +./gold https://host.tld/file.md ``` -When `gold` is started without any markdown source, it will try to find a `README.md` -or `README` file in the current working directory. +When `gold` is started without any markdown source, it will try to find a +`README.md` or `README` file in the current working directory. + +You can supply a JSON stylesheet with the `-s` flag: +``` +./gold -s mystyle.json +``` + +Style definitions located in `styles/` can be embedded into the binary by +running [statik](https://github.com/rakyll/statik). +``` +statik -f -src styles +``` ## Colors @@ -35,4 +46,4 @@ Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logr ## Example Output -![Gold Dark Theme](https://github.com/charmbracelet/gold/raw/master/cmd/gold/gold_dark.png) +![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/gold_dark.png) diff --git a/main.go b/main.go index 3ec8b6d..c282da7 100644 --- a/main.go +++ b/main.go @@ -12,9 +12,11 @@ import ( "github.com/mattn/go-isatty" "github.com/muesli/go-wordwrap" + "github.com/rakyll/statik/fs" "github.com/spf13/cobra" "github.com/charmbracelet/gold" + _ "github.com/charmbracelet/gold/cmd/gold/statik" ) var ( @@ -91,6 +93,27 @@ func readerFromArg(s string) (*Source, error) { return &Source{r, u}, err } +func loadStyle(f string) ([]byte, error) { + var r io.ReadCloser + var err error + + r, err = os.Open(f) + if err != nil { + statikFS, err := fs.New() + if err != nil { + return nil, err + } + + r, err = statikFS.Open("/" + f + ".json") + if err != nil { + return nil, err + } + } + + defer r.Close() + return ioutil.ReadAll(r) +} + func execute(cmd *cobra.Command, args []string) error { var arg string if len(args) > 0 { @@ -105,7 +128,12 @@ func execute(cmd *cobra.Command, args []string) error { r := gold.NewPlainTermRenderer() if isatty.IsTerminal(os.Stdout.Fd()) { - r, err = gold.NewTermRenderer(style) + json, err := loadStyle(style) + if err != nil { + return err + } + + r, err = gold.NewTermRendererFromBytes(json) if err != nil { return err } @@ -129,6 +157,6 @@ func main() { } func init() { - rootCmd.Flags().StringVarP(&style, "style", "s", "dark.json", "style JSON path") + rootCmd.Flags().StringVarP(&style, "style", "s", "dark", "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 100, "word-wrap at width") } diff --git a/statik/statik.go b/statik/statik.go new file mode 100644 index 0000000..8e70a85 --- /dev/null +++ b/statik/statik.go @@ -0,0 +1,12 @@ +// Code generated by statik. DO NOT EDIT. + +package statik + +import ( + "github.com/rakyll/statik/fs" +) + +func init() { + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xa9\xacyO\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\x8fI\xdc]|\x8f\xdd\n\x830\x0cF\xef\xfb\x14!\xd7\x0e\x9c\xde\x0c_Fj\x1b\xb4\x18\x9bQ+\x8c\x0d\xdf}\x94\xfdt\x13\xb7\xbb\x10\xce9\xf0\xdd\x14\x00\xb2\xf3#6\x90n\x004\xc2\x12\xb0\x01 Date: Tue, 26 Nov 2019 22:42:14 +0100 Subject: [PATCH 077/911] Move listitem styling to style JSON --- statik/statik.go | 2 +- styles/dark.json | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/statik/statik.go b/statik/statik.go index 8e70a85..c00293b 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xa9\xacyO\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\x8fI\xdc]|\x8f\xdd\n\x830\x0cF\xef\xfb\x14!\xd7\x0e\x9c\xde\x0c_Fj\x1b\xb4\x18\x9bQ+\x8c\x0d\xdf}\x94\xfdt\x13\xb7\xbb\x10\xce9\xf0\xdd\x14\x00\xb2\xf3#6\x90n\x004\xc2\x12\xb0\x01\xf0\x86\x0c$5\xbb>Cw\x9db\xa7\xd5YS^\x1f\x85\xab\xb2|d\xda\xcexu\xb4<\x91\x97~\x1c\xc8\xa6\x18\xce\xde\xc8\xc0_\xa4\xdf\xb4\x0cc\x0e\x91\x9d\x86\x9c\xe0(\x0d\xab\xfd\xd49\x06\xffdF~\x8eH6\x13S\xa0O^\xd3\xdd\xbf\x9f_8]\x13\x9b\xf8\x0f\x00\x00\xff\xffPK\x07\x08\x0d\x8c \x95\xb6\x00\x00\x00\xae\x01\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x02\xadzO\x0d\x8c \x95\xb6\x00\x00\x00\xae\x01\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xb5\x9b\xdd]PK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00@\x00\x00\x00\xf6\x00\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index b853212..e0c8ba0 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -26,5 +26,8 @@ }, "strong": { "bold": true + }, + "item": { + "prefix": "• " } } From d6c1b7fa732614397b7f7d7cd69626d7adcb46e0 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 28 Nov 2019 02:20:58 +0100 Subject: [PATCH 078/911] Render each paragraph individually and reflow text only inside paragraphs --- main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index c282da7..17de092 100644 --- a/main.go +++ b/main.go @@ -11,7 +11,6 @@ import ( "path/filepath" "github.com/mattn/go-isatty" - "github.com/muesli/go-wordwrap" "github.com/rakyll/statik/fs" "github.com/spf13/cobra" @@ -138,6 +137,7 @@ func execute(cmd *cobra.Command, args []string) error { return err } } + r.WordWrap = int(width) u, err := url.ParseRequestURI(src.URL) if err == nil { @@ -146,7 +146,7 @@ func execute(cmd *cobra.Command, args []string) error { } out := r.RenderBytes(b) - fmt.Printf("%s", wordwrap.WrapString(string(out), width)) + fmt.Printf("%s", string(out)) return nil } From 6afd336852d6709df53f6f04f78e190467956c18 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 28 Nov 2019 02:30:46 +0100 Subject: [PATCH 079/911] Updates to default dark style --- statik/statik.go | 2 +- styles/dark.json | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/statik/statik.go b/statik/statik.go index c00293b..f4a877d 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\x02\xadzO\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xb5\x9b\xdd]|\x90]j\x840\x14F\xdf\xb3\x8a\xcb}\xb6`\xf5\xa5\xb8\x19\x89\xc9\xad^\xcc\x8f\xc4\x08\xd2\"t-]ZWR2\x7f\x99\x11g\xdeD\xce9\x97/\xdf\x02\x00\x0d\xbb\x11\x1bH\xdf\x00\xa8\xbc\xf1\x01\x1b\xc0\xf7\xaa\xc6\xe2\xfcoq\x9a\x82aG\xd8@\x0c\x0b \x80\xad\xb8\xaam\xa45\xbe\xf6;o\xf4^e+{:\xd0>\xf0\x86\x0c$5\xbb>Cw\x9db\xa7\xd5YS^\x1f\x85\xab\xb2|d\xda\xcexu\xb4<\x91\x97~\x1c\xc8\xa6\x18\xce\xde\xc8\xc0_\xa4\xdf\xb4\x0cc\x0e\x91\x9d\x86\x9c\xe0(\x0d\xab\xfd\xd49\x06\xffdF~\x8eH6\x13S\xa0O^\xd3\xdd\xbf\x9f_8]\x13\x9b\xf8\x0f\x00\x00\xff\xffPK\x07\x08\x0d\x8c \x95\xb6\x00\x00\x00\xae\x01\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x02\xadzO\x0d\x8c \x95\xb6\x00\x00\x00\xae\x01\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xb5\x9b\xdd]PK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00@\x00\x00\x00\xf6\x00\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xa3\x0b|O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xe3\"\xdf]|\x90[JC1\x10\x86\xdf\xb3\x8aa\x9e\x14\x8eP\xdb\x17\xc9\x0e\\\x83HI\x93i\xcf\xd0\\JN\x0e\x14\xa5\xe0Z\\\x9a+\x91h\xea\xd8\xdby\x0b\xc3\xf7_\xf2\xbf+\x00\xf4\x1c\xb7\xa8\xa1\xbe\x01\xd0&\x9f2j\xc0\xc7\xf9\x02\xbb\xdf\xdb\x18\x1de\xcf\x91PC\xc9#\xb5\xf3.\xd3\x9a\xf7\x95\xbd;\x92\xc3\xb8n\xa7{T\x00\x87\xee\x18\xb0,\xb4/\xd3)\xab\xe4]\x0b\xf8\x93r0\x1b\x9a\x96I\x8b\x97\xe7Jk\xb8,\xf3\x8a\xa7\x8e\xb7\xda< \xd7\x93q\x1c7\x02\xfd\xab\xd7\x9d\xc9\x16\"\xb3\xc9]\xeb;\x9f\xcdN\x99\xe5\xca'{m\xf6J6\xff\xd2S\xa8f8$o2\xbf\x91{p&o\xc5\x88\xc2\xae\x17\x0b.\xc6\xb3=_p(9\xdd\xf8\x86lR(\x08!\x83~}|\xc2O\x9a:\xa8\xef\x00\x00\x00\xff\xffPK\x07\x08[\xf7\xa4\xb8\xd8\x00\x00\x00+\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xa3\x0b|O[\xf7\xa4\xb8\xd8\x00\x00\x00+\x02\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xe3\"\xdf]PK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00@\x00\x00\x00\x18\x01\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index e0c8ba0..319d13e 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -1,13 +1,20 @@ { "link": { "color": "123", - "underline": true + "underline": true, + "prefix": "(", + "suffix": ")" }, "link_text": { "color": "123", "bold": true }, "image": { + "color": "123", + "prefix": "[Image: ", + "suffix": "]" + }, + "image_text": { "color": "8" }, "heading": { From bb0385f0b36514a9803743cb01ab2f17261d7ff4 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 28 Nov 2019 07:03:14 +0100 Subject: [PATCH 080/911] Move screenshot to styles/ --- README.md | 4 ++-- gold_dark.png => styles/gold_dark.png | Bin 2 files changed, 2 insertions(+), 2 deletions(-) rename gold_dark.png => styles/gold_dark.png (100%) diff --git a/README.md b/README.md index 71ffec3..172a74d 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ You can supply a JSON stylesheet with the `-s` flag: Style definitions located in `styles/` can be embedded into the binary by running [statik](https://github.com/rakyll/statik). ``` -statik -f -src styles +statik -f -src styles -include "*.json" ``` ## Colors @@ -46,4 +46,4 @@ Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logr ## Example Output -![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/gold_dark.png) +![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/gold_dark.png) diff --git a/gold_dark.png b/styles/gold_dark.png similarity index 100% rename from gold_dark.png rename to styles/gold_dark.png From af92548528899a628adf5f2567cff4994ed61e1b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 28 Nov 2019 07:03:44 +0100 Subject: [PATCH 081/911] Update screenshot for default style --- styles/gold_dark.png | Bin 269951 -> 79098 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/styles/gold_dark.png b/styles/gold_dark.png index 921dcb356a168eea6fb9ae25c51ae66bcdde9efe..a5f72db6aef994d98570c91c4d69f46f76cb792d 100644 GIT binary patch literal 79098 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�%cT3juB=yWF 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 literal 269951 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 z ~X5UuL7__c*GO9;W^nIkww*Nq1QYC%A2pD- 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

K{yfQzp
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ηRhU>|T$E{6Cc6sjvI-WAqJ$t{bKv%quHSIW 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 T{Bj3i00000NkvXXu0mjf&LABg From 810cdf1a2b4b807718cb7e5028dc5350192d2a86 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 28 Nov 2019 07:11:17 +0100 Subject: [PATCH 082/911] Add gallery generation script --- README.md | 19 ++++++++++++------- gallery.sh | 8 ++++++++ styles/gold_dark.png | Bin 79098 -> 69072 bytes 3 files changed, 20 insertions(+), 7 deletions(-) create mode 100755 gallery.sh diff --git a/README.md b/README.md index 172a74d..b6286b4 100644 --- a/README.md +++ b/README.md @@ -34,16 +34,21 @@ You can supply a JSON stylesheet with the `-s` flag: ./gold -s mystyle.json ``` -Style definitions located in `styles/` can be embedded into the binary by -running [statik](https://github.com/rakyll/statik). -``` -statik -f -src styles -include "*.json" -``` +## Example Output + +![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/gold_dark.png) ## Colors Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logrusorgru/aurora#Index). -## Example Output +## Development -![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/gold_dark.png) +Style definitions located in `styles/` can be embedded into the binary by +running [statik](https://github.com/rakyll/statik): +``` +statik -f -src styles -include "*.json" +``` + +You can re-generate screenshots of all available styles by running `gallery.sh`. +This requires `termshot` and `pngcrush` installed on your system! diff --git a/gallery.sh b/gallery.sh new file mode 100755 index 0000000..a57d3cb --- /dev/null +++ b/gallery.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +for style in ./styles/*.json; do + echo "Generating screenshot for ${style}" + filename="gold_`basename -s .json ${style}`.png" + termshot -o ./styles/ -f "$filename" ./gold -s ${style} + pngcrush -ow "./styles/$filename" +done diff --git a/styles/gold_dark.png b/styles/gold_dark.png index a5f72db6aef994d98570c91c4d69f46f76cb792d..237fd254d1c4bc757505ee2ba31a97fc95575c5a 100644 GIT binary patch literal 69072 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 Rj_?9JEj7K%RhVlL{|EEji{=0T literal 79098 zcmd43by!tx*DpE&B_$LP6c9u~8Yw}P22oP!Zs~48N~A?pKtL4flu+rGlu$aPL!`U= zjOp{f-+s?N`}}dPbFTC4_2?twV$Hekd)#A;UyK#fN%NEA&ARO1X(aZ z5W!dkp|F2n{^&0J1GbT@v?Owh{+C#l5eeVHv%jzDgdhZ@=x+?<-Fr&-CXVw1c`2M} z0%~jwJk>|5%kV7{V?za31VJx|{zh=&H}Pwy-afb*@<38d#eHaL^ofQ_-zm=8ZfyZ4 z{UJT(m(sVMQ$(Rw99gMprCzGNN?&_*Qj~ZOW|T~g9)#SpTnS}bA;`;0WlF{j`SP7H zla6k9|CsBEu@My+L;UXIlb_QgPCtcqN1SGfc6ppuRIx=912wcTZ{HTRwUsZrFNr?* z#nbMCeVl*^inss2leq9?t;9Fg7x%l!@iU$8RthJ5o@{_I< z(YCimLe_tOJfDLZ*L;xVz5@1hM9>+@(|MGOAt7PVcF|x#rS{h)dk2ilD%DdyI;Q)d zf0jA<>gc(6d3lK{e=QCQ4~EBFAA?;V{@gE8^C7a%9;`p@7zaCNWn_FsPLQc77Q2a2 zH$UYJ-{Zs6pA}BhWiKo4teqVCe&#B0<1BE^U7+FR!Meza{rh>c}R-@f}q$puUP9TLN#sx$V5p}>W;z`KgRmQs*Rqd;_tSr?rOfY6E@$)fjw`&y zF(0a=?y1$V5E0epYKI;uMtjTu-GaUhL+elOEFGg2z9}hFQ$n{j*R>S$7qIj6&T5sY zRSLV{yU)^03>DS1t&X4GxsM<;G>tzRG&NOAKE&b0zU$v1IgdV$OU!jDGfOet+b%W| zmU71#t(;6XhDy7sJ#M?0sC*+)J-=pCMr7v3^)s;o=R3QV*nHOfrno-t@2i%0&4f-h zO}H+Twds~4KjH^=Uj2Q=s-fS=S`$@mhX`xJ*tM9P9rk18-4%@bKny>>+7#(fx~WMC zIu@BnCz~Cj!^NR9FU~b`Vn_r=jrYS(q*IiYGQB0h_l*!%y8DEQ@ty)&9)KfgZi)a46#jYH& z>HT;*dUzzO#} zs#|z)XsGz{!M19i&(_?dLhD~&iYtzlV&miMhleXhzAU`dcBwi&IlQl+(DeG6Gzl$j z1g+1}BNnP#)|9twhEyiYQ|^U}%gEqg5%PFmSjhWH^Xs3q2;KNwHfysVeco#KS3Yqn zv>UIM^M-4jCnw+TJ`gahJF_%WwwV_3<7;FE#DI}t=zSGPTm z2dBTkf37nL>#mT{pxa=otx%V$$zI^lMO?L~gkzyOFd*PS2yPN-LwwQdOIHn!<~SV68?q0oFI{tJuCtWj)v*xh_qX3pEUfUS=FZ^6@~qBbJ^c==!Vt@ z5y$*`TU5mN=SO@{e)R$Vg9i_~2if#0DHRkHX1ourjg9^HH)m7C{IN@&=Py(rZOH!q z^9K{DK0Wc2i@!zK*x0Cad{rWlj-Q|6aCfzN@UyYQ;f@Wu`lA(Y&5dCc>n%4vGWF%Z zC@#Jwe6nZkJlBcgwmKG2QzHUzKvg(Bdj8kf8;tVro?{bUrn`BQ1et(0_2$imte4Tz zDByE)7rh-aGP2CV<=t@~TG<$m#^vD> z3`86^dW@A*LbbUNHhJ%0F&_hgx3#y`qZr-)QP71YkdO)+N(;pKHAY5keXs3kr4MSk zT0%WsSY#O8{NqpkCngN!J_^&odC@2|KcA;lM&B35V@9N-qk|yc-rh2c#Fu$-?W*_F zmBx0Khd=wAo^US;7n!tNm{*Tz3a6@XZpQf$&o6Cj%OQMvwIX@Ci`FFhEq-niUdv}Vg2G)M?k0TE&iDgb@ArtuyRzCSkDdJs;(7ofeptl{X zWcJuuVunV*Xnm^DX!FmHy2eJS7gvO|;LH=)*w|o*3J3~@j*RH6L-2*c`wMM}yb<>O z`+W;tPEO9(uU^p!I?vH*6nmJ>)Te?^MI6;6nhsJ za`k*Ya)?w_Eq=HXn|84r`WAkDH48gBdfJsPPlX{m2azybViy)ddIR6g%xvA~bk}EU zZL+?*oZoJY%+=LZX8G*dvmul9L9+RFqvZ^hRaF6BzkUsV@q)}Bhgi)*C*h^MsHm^K zgTwi2(l5#2O(jD>u+a2mzp1LKLf5y{`?!2lXrh*Zd9i=?cq?D5Zf*i)Hi&#}rUQ&Wv$b%TQ%7NZ$6 z+QruA;e;E<8Bfp8GgDJjOBxs?4pw_rsO&gf-@SWRa(87^N<}4#^0s5DitXda4AI0i zf+~VwPQ{J+UE%@@~!uGAe}(a-m{S;E62 zBO~uCDyo+UAI@idYWRC*`1|{RZ)ssx&WG|uer343d91E3d1T|WadYUn_o2MGxw*<<6GVAqf39}h?=}-| z^h~pQrAH~aEcBj7PZT6MPURgav1;Y=jDH_4GTqLJ#3Dx|%@MTC0R$AO7FT_Z1Yf>= zdl604%&Y6u%`zfw6c;bbhLTuFH>ST2Pk5<6l~PtS&ihWm?A z3G|yC4*4%~a#$hJWfh*xw8eCN(&UMLX(6APxyr%8QBY7IYHwel;yu*>P3Sur;*r_IaDR`QQ#Vud4Sg-jtluwPQ&re`0>QpRa%X_@KIF@N_uKAx&SPdDtFKh8BF zp(?rkS63z0c82Yyb4$jQ-d#ygO7e3XdxC?7ea^S6?DqQ)AJVc+(%AK@sohpazPXKi zsi({7>(kzGTWP2ZAZYvG>b^Y0mu7R}{P`@Nw4CQ~44T|79sHBh^USZHPnI-sF08`sL)c9 zm&bACuKU`^q1WljF*ikPT8VCacTW#mhvBdu#`V{DY_n*U*ycKO9ontaM_9;wcUXHPLy`C^;lKwn>9d=c4;Y#I-TCFCR}xAGtT zd31?Y?Gu8uzvCl7Ud6-&Vc`%NOx6W-6#7X75gE3}a=mIX>Fn?4*z8Tp)h;pm_UtU@ zb_=5-pUn`OxCNeUT!*8^W!&__Ql#nzq$5C5S9$sPK0n=eWIlz|e3OSqqQVv6vu?Sw z7*xo#4Ja;?u+7h)yFnV2ZFF>X)8dnjjg7e=bAQsSx(r8299pi|v9TK04!yP)ROc2J z>e|`}e5dYBK;pi7{d#Is(=AR;;zo*n09% z>q*TS4J|Drh#a(YgMOjyQ%{lv&eN0qSxR2>SKZ;ezEkPrc%+OIJ&GcY&{3{+Nz;C- zug8kv(0#M;bnP3Cd1oRqjP=po+O5JK9OEJYwGC3TgJ?Oaz^SG0GV?$A(?m7%Te%gjtBopNV9XiH^g zSk?0+;Q%M6q@2HaF|aL$Gez;EFz4f0Vp`#I5)u+4hblWW@BPNC+d@y$nZC__QJ~l&IwO{OKxA-tOXTG<;KMDD;8B$)slTA~|I&^pL zQ29sKw6yXd;px5g>6sG|40i3}hCJPhRxdptRpX7y=BI$7^6?kFC z@3=0BK7D!@njf^WL3{%O&WcM&OioQbL;G{6aitE^fn@d+pt7rc zbZuG+&YgbZ2H_c~5XsQLvxt0{wRqEFQuphZ=G^?es)n?>x_W78DekpvDKQ?(&(qV> zA)fp?ySkoST^`8QR)-Z)*T_ptV}QoOawbp;>g&Ql{%PHguClVSfPerl7M8!6)_8xv zT5rC-{(OsgHlq;WwS|QP@i9d$i0tudue#peLN(jpU44DzP;kU$WpkQ_-t*ff>`jGn zJ`W5GM0>OH@^a4OyUwnz-iE7<8M8(<)SQ2dTDp(%o8#?g!79HeCJ^Y?q1PR7Rkv)1 zttqe_6HL~uNkz#|gnRDD zv&_wo?s{smTm0W2_j({ES|2Ft$W3Z*-m_KEp5h@2kMcIMGMR5|lW>nydM!-r9Ud z=!x__%%&zF0c(efLLGtE`-VBOJ>a)F>&IDh1|Q$jb1($Gb<2o*wj8hCUBKiIsj@Hv`;F@crs;c9bPQ7KIo~z`WdVZ}E24k?+|kij$Fi?HB&1k! z@z~ZQxJ!dcrJX(t6{}=k-m^4`nmkfI5)!8zkZwwSXx&e}q{e;rl8S@gqZiHG!9%8w zp5SV02dm}MiHnmxQH)HwD(PG}wJl96)*hRrqo?_f7mr?GZ*|7|n2w0{#PdnrnP7<^ zx=)`}tT^d0ljY-UV)FHa%m*K?do-QH^*OC+8!8D3e)0S!zxs75s^H4IxL#g;haJ$- z{PWn-mv!Xlp9tqC8{cwUOpje9MudfHKO2ksWBX>@comuQol4*#S8h`?&S0e`m(=W& zPudxK#Uk|LT%&V~`F=v4CmaJkSd8*YTR*}%&9W)-@>k}^sR8ikd{s~mY!(8)MzCnRNH-FZj9#s z{fEDc%rU41Q{CAkRjd3)bY`ghwzvJ7BTn@=Sd>Q0Zo1`7iJ#7XB9F$zY zofu2Bwb>C$Wjo_Y$4VfhRrv5O^Y=E{_1_;Bf`gG_+q1T#m`cjz5$Coy4l173B8@#> zD?E#;}RTJ91Yv~v1|LLUT-9k=(NAA9r zxm5n=k8g3Y(YuEh<>jFnlrBq|u?JX4eIWA{vxVstoq>L}^Ap#vC*DgyD-|T}>^C)^ z2!-4e@At7|kwqZvijU4GW@YU?o;+}A^uloZ!(>ZxlHr3*^3TCuNISl;mfV|z^WsuU zEWPt#@f5RIR#wp{E4nGkKKbgx|L~Q`3tgGZME?++ZH@mMk(ntNh?tldrI1Hq)P5s{ z{={^INZxXFUpb#uzd=Lrd6oeYk1ZyxVr$Le(e&Bg|A|&q9Uk?3yuCb3u?-y2vMu`d zPVh0EU0jl&c0FF0n-kU6t|&fKTRgeVq1rVt5R{&7YU3845Sfv21Dl9igHc~X0t*`( zyJ)mZ{cV0eCr~a*f2#+5rU1=-b#)5pCMC?xnd<85Zd!C-PlMzpv3GcA4CM{QtvTeP zP)-e@<=O+JTHtf)UAa5v$&$Y~KObUPA9$6H4*B?W0}t*##TmA|Vd(y%!yzpyDq7U^ zw@Py1!ZX;3+NP#^Gsj9ZvE>yN#z062IR3^3Sa?QTTRVC<;U8WtP}u7LW%0h6b#N$W zsOG2*7Fv+*EdBE5A9I(;T9Qg20En=*xhVli{Iln-t@U`d?tJ_PJU)(~QfZ>)D#?!h&us0Ptb;!2;_ioiZhhLm|(d2D_T$Kol`s?lJ>u!fVle zX54F+hKO3=;h(1(MV91Rh30;Mz^}pW0RN;Gcf1O?8G6zb%PI;uuyemcpyv()XiR`$ z`a<8BrBPtuS9k=Q7z!*YKHyVBJ3G$Hx2&0>F-RsSCyn|)Y1Xy0JV5W@lXi(hR^=BH z8yog?xj1_CNn`HQgbuqax|8$sS>5FT%+8nCjbEg><4OihlF_d(kBwj*i~w*beE`NP z3}7Dt4i3&Fz%YgP0!h71&{0CWow~Qt#woQrRwV^pe(D!sceza4DGdz_=yq1eIfak6 zdbkg(tbcJ&!iJl6B(QI6Zb|{+9yLUSi%SAn+35H8*YsRmk9whjLr6r9*8C~CjGilb z0&qg9qLeK`c6NCb2|xoE46pv#aYiP(xhUIMO>-P@jFh$YCl%-m)q&N?xoZp2bP=di zBRGSA-u2Mn1;`>Z13dP{cz(N!=mlYa=miC}%&n|)D(#|alz|vIPfN=Q{1_7(8ym_C z=Jf4Y5aXU6DcAYaYYDf4Tzr4nxmV;0E@z7zD%i4tTw;qgayd0fa+@RIBcLa zIO(rl3jn$fWy@~ex&^FW{z!RtDqK1Y*yC&!x7H|TdOA8$galAmvPDmNGH`=ab6qJj z{rtCXUA%q!w#*Ya7o@;2&-4@H<6rn{`s0FGM*=x1qufIltKQ7l_vPiu9m{lDE8N$U z$<7GezKwEfX#|}gy$>D$gqA=^&>w-rcM*;{JrmP?;JCvSh4&=^cFQ86bcxP4H~+-j zg%%XtjBft?#aK;sT!j#m<#LI>&#@}-`MD$9fFw~05T!zP<=ov%=SC}bd8+hJp2&@k zj7Y+on)iSD#q*I2kTAu`$;sml8i*SBHXvk7UrkbPQf0tJc|S-Xq}nC6K+FLQOr2P%^~0)bZk8V6hqIi<6$%&!A0H*FLC=Xk zD20VG6aM)xO_VSG_rq_X5~0{1Xlopl^nxtu01zJW4GSZHup^|_V4p+e^B5P*!omV{y}D;-30}Q=<%_1)rC(qBhDy3;J9}m_nnAKTi_&mFU8|ga zoNd^w)Q8S|ZsrXZNc|jJTU)7e0JcELde8=}YCXh00l>O*w8GRuL^RJpPs1l5K%qBK zSSg_7boBalrAQke?XB;PpPmH8#!`ZMRNCaKz!*6RRD;GB6TG9NqlZdL&)^TsA}+TT zoz(PndR|^KNR5&n9)buR4-YATPx3ss(-TybVV%*`(t@Leg^*BC1VMgIf!&`QtGYu( zEBpc#GaDLuzgMffwr4NIlVEbkEyb05NJt>MbEm?wjhmaBF0$pO`3go^>xnLhw*U4#nbkWhV0kF7aBVB)T^vlHG>c<&n&gagUX z(qx?Vj;ZQ4J1Z*z=%}3o1312pb{=`{>GJV6eNLVN-5)jl@n8HK=TYoEY3XU;oBPVS z_AF>~b92)ktB!LPJ>k&M)cmVuLYfN&TA>yy^8E2$WwSHnQ7Dz)oP=nywo2dfrvtKo zY+J|(ttN#85dxdl2rR4p<{x>e380r^LYt$M##wWO64%mdY8Rowde$L)cn%5P9EyexfCfXE6_D^M;ao8>G1Y>~_8b^HRP1ABW-fJEe5+EEn25l_ zH6Ls*0{@2#>Jn7-3lIZXiMSllb*0`YL@7exg)?_J$;q>pVpaP}q$92vLj5Rxy3Y;# z>SqWXOB>J8au<7hdo(~u$jQ$-IXSUu72*OBiHXR)7dVfG9uN{2E?k&^yz!Fe4m}Ug zW?4iQFhB|kcSE3t)+F&MCZElxKDTF&;L_07^N_@hJjZ0Vf6(zR=zPZ869w zC{iFeP;Lx(q>qQOpio`_!8Z8i%O+@o4Q*_~LC`jWbz>>{?6Rna3J;(Gp$uvlFpL(K zimE>;U%4$544Zu%A#6@g%PQBY8je9XYW%8C`JAI?#M zEX(eJ0Sdy)yqP;5+3B!)1f-;q6y0E?Z~>{^D`18@P7cy*O}B&Rqbz7DRL7T=mJ;^U z)ev!x7y>i1S^VZPDD1qzG-)ZW0(HMIKaWR2L6MfxqryMGuz(LO5oEz_xy70#rzB`- zr+|}#_bAayfQ$REe6oh|WmaBZ9!eYCyLYdnuo{YS!Pl>>Zl@;Pzj&%B{?W2xvp<^n zRM91?Ye4J%8M;}yIPSB=SMG{JLRo@R2bqi`A#x7H#Y%X zGRUt^;qsgiyUC{)u`%Fjl9HD9wu8QsqGpvYAI$#_w+9L`|ARNmS0OPlGJ=}$V`$}G z(II1GOJZ7@>agx#Adb1FPC`OP_8b(0)YMcu4h|wH)tpO4!$5CC@ygxtfC#P2QqHgk zJwxEmoq?51)vtCurtP(`rER~ZB_-*Eg|EOW~b-M6fyJa`V))Ya@iQuxbvO1g` zJwe+wjKn5o=v5nmx6LU6!9M!_g9qm!BL{5FKY7FA#RFL$GSJN1B8#4T@9((f_3!%s z?VsR(54@D(=0$;M9<1>ZK~?UV787n1IpN~reFH>eU~HUHsDSPtRQcxt0fy*7b97W< zp%rvy0#=uVk`fmRwo1^)kF?NPo`p8#lWxUDKR>_Do}S27fJc+Fvq8{QquL;7qIb{$ zjvgKyH0aA#12B!vR&C02<$?+kNU9WsZ--w||U|(!k5@LBrGu zJ%QyiKLQmUMK@QkUWMaiQsx4EYJgsqhiZilinNvVA3yU2D+5^3#-;Ax4~{A^@1h4C z^DL@W{7euE15#QX&=QLs6nzM4E|A>NS_pj_%jU*L-IvF0YcnzWM%xR0fCiO{1WWD4 zg`Yov4)ik)E)mf^d;6PEd(#|&e%(7bFxuak*@LGS0E~i7Mi4mN4u9G&=~Q`;LxBo- z`H~0#$FqZ%f%HVA1}TL z50_F1=1j4M(u)X+wWR}uH&4DsGi4F===4buAc>~R%f-BC;ZSgXneTi z&Vhm9o~^BI9JUGfCBTP%46<))J35FN7#O~Hbi}ms@bDN~T57T0L3^fBP+R}iGo`2< zDAR!2I9TP$50)PFzs4%aVzJ!%Px8T8);x2b@+wY&vjk})dm~B9vT_~iOS334j@`#RCFjPF2+tQeKY{wFVsxWvXrB9 z#dhN_9j2S2%UTXTf|!Kk>3KM`!hz3wxY7R;=xF^phCnuAD zv;>mS{P6LoPi&~q2NZm$&=>LX@n5}ti%md4fB>QVKWS5(HnX5gq33(t=adFYay`5* z_znDF(}u3NF|cbDib5L>{SM=dZmB)S=4?kZn(X%04BrcRUi|2_qZ#KC!>%0&H{7?w zfigy2tdiJ`KQLI}@_rD=7f4ATJ$#s`qE_SWb=PAH7m5c{#re2%Q29h19l19)HuMe@ zEG;a)LG0k+;W05YKbar)xdMhEXa+=GU2j1sw?zTgh`D|7Z~2JMQX>)l`&EARkk2_H zbYad{sr>JxMEv_++Ih}mxX8;}RgC|=->nzF`*f2GBN^wqQ*ipd4{gGo6Ln{Q&IuVH zTU*9*Mp{kO^`}h5Dmx-tD0zZR-jJtvMS58@=Wh^W#N=gzJLZBB%PsNR% z3<<`_B%2_jwc|AjHZbtwUZv~l6b&JX<+srauo?U{EFrB9{%mqyUS7JGQ=#9`RPCLd zo)Cw)t@aPP_cxTHvC!qCUGxkgRaVx})Q;IN9&2sFuEHUDo=`3PW@RiOtL(M{wczu; zQUSy_dwqj zQBF80yp&nwv+Ke3IXb!X=~M2yR@>WBcd#7_{))IVS&~TCu3JfI19V|o`BwP_d-uDX#4D+T^4j}>I=qAy?z4=S-34=FcQTq;Ilxs z1MWyQyGlPjEbPq6A9%D+eV;wUv?juT=I}uXZ-cHfT z0lmmKEg~y!=D&*B={a@lqGe+`!AFHZOd&q8(HLfLHKM_MS{KK&wlqow$@_ab3X2u; z^16$cmzGtBD7+*jwwA_eBb*!!EKLKsA{i%_S|aB}OzwwAP@#KqyqigV#@x~}xv1g} zgbV8o)#XcKvf5N7dHT)ATh7-Tny-m)62q1wNQYjPJulli{*>fbZ{EMq$HJQIE8#TZ z){Gu5{PNi^t%%Rn?$@*S7w4$)2^*^#8Z4I$Xh=!-d`^Yl9`9XiZ~t+AE#mg>JIC8v zWfih5BX!~yhuHV-mBvIpkDW8;wHzWFf(G1nv8z7l=1p#;*02}Bq7@1s?6aQfW4x=} zc~@v7ZDtm|yC|l1k>kUipw#DQbjqCZ;ARZWt#yq5wJo|Via3^C#q75Cq^_>!haF~o zp%tpDO1-{y`6fcl&13l3*njx*XQi@$XmW26FD3+0L(DRo4#C&0 zr1Vfphi!&D#v?a0i1^Ax7JM}C*^Uasi|k6y2;f1 z?EUwFh-s}k;|yN3I;v;aICY=dRC(OI$=krM|1^n=>F&=KKf^4$<{8J^;JRqlVT-xJ ze**_te7-L!6}N1jSxq;Y_kT%iT`V*oz9^Eb70_Y!qi*)Aso}t%AJGbUmP3`djqJug zy*?3+ct_2Tc5er(kMJ>dsQ8`*M61Th6mKtJh|@7&O_Gay^g(d$jyVa(d!evi&)tc+ zDa?w4?X(RmpCiAQ2??FOy=M^jt%ZR2t}Y-vKYeiu!NY_5j7o1Q<+aZ2b#?hYGc#GT zy|}&-%hjnqiTP`!`vRlO;#7xrNor-z`Sa!*2aBEE{c71cxhei)tCd(Zy1GZ+3o1Wo zXqdboIN0=NYAyEu{#TBO0H2rGYIWFPJpX6d-!vKB%1Zk$5Di~wg&TfkGM#fjv@sd2 zi2!>LTs=6^7m?I0d-ip5GIKl;85XH|jQ1%x84u4))oJP0g$Yu2@Xz!VC=86I&MZr&}At5U}I#p8+d%>6J?%(fZyY(BoKcTeL3y>Ms27 zJN5b}AoJ5U6cQ5bt-8(3%1h*0ikvXg z>*iRO=r;CE#>dA(@1US7SB zo$r{Tv&*yD_Qc(1HY~PxAepjPCb7 zXgJY(>|0*{m+Yo4U3AiH@XvR*x&HfS2R3ESVt~a0Lif|MZKX5RqoUEX=xSsAP)eR=i9GeWvm*4T*y#!RDuBixh z8wi%i8+^RHufQJ{Y1a5_-pbz$8up@YmNLr}!dPrb7hQJj-0; z$B)kf5sz9^%|}YPP$tWBMCA|2Xwa;xX(}>Ce(UTkkn@Jz1a7u)z_ES*es#(J51?d) zrAsGtzo3CVgXlp`gJ5n=qpO1s56C+6;bL~z)v<7(uu@>0L8&Y}oDg7V0GP}S!A=Dv zTTCnJuZK|x13<*!lWbJi_X+?ZDSLz;9cqZ@CkFi*)VuoB2a!>&U_J{4Ad>`^D%^AD z8i4wXZq+Wb3;<|l44U4|iB}H=JFaXXo!o?R0qVQ%B(iVWm^T;0 zbvT-VRRlF?k8PFkpDiRsl^HPnQy`L&jPeceic%d3LT3>SQ8v9w4Qp`f0*nm?$QK5U zcM=Q&M1!MC$9Z*37d7>u{$uc2X0^Aq$$|$kn21IYOcPom;Is+`5?^LUH4Q|+zs_c0 zfC-3+iBX;8w_};g7^sdwrZLsk*TeWh2_>IpR4+duY}AN|Lfy%wCAO2*(-TE%;ino} z{D9`r`(e{9SAp@A5ODQ`0);*K=TExQI56Vcs4|5La7)X}QXm#Yx9WQ?^L@7LWBCl! zD|$^(RGFjWAkKj0K+VR$wKf2Kf#S^W1JwHqK5L-clu=4K8a0YT#NgT4*`fCVSh5jd zbu_5MbHTs@hXSFPb9d~&hOR7MlZinaUkpy&^FVT=M)hbG=mA@u? zrhrA^C=mnCS6bLF6c_{0kZFT~mmD<`M3mRE_r4C;Y)8KQhXFd>`d^mi?l1pgS$=p1 z14J96!2&}gAVV>I1zeY6=epCvWZ<<1^kHD427)ZV;3qi5;4eOLM=*L40^umz20khv z9x|927}7@QY6k|?wO~FXzY*wE%flc4@}o2~Y~f$G5bO-1^$rH+qxSoET=1PKel@hR zB7hqH^z?Z5UlhX?5$|(^;WcI#K(<7OhTyE$B?x&Yg8mwPTR>m}mblvy`ddpaC8Y~1 z<2Cw>;{XG}%^&?XfCRkv&*S6cqttbD*wQlE(spyXdCY!32Wv2du|J^pDKNq-mv!)Q zalnprF9J<2$`LcLHwczmXn`ZTRgD3-{ndcao=t*PXX4-hq7OyE*u+=B4>!V12qgS_ z0S8Pt0Di#zfD-cR<44YDGgH&QW;53n!2EFhR9n9m76Kr@7hdSIIwn+kxKaVcP(84y z4ghSy+m-^9ajOde>D%fbQ9N!b6_;PB{z(G^L5Fq_Ixv3X5K-5nzF(W#hK4i1%GAGQ z*M6v>fh!^+0yhD_kXn$-Z-PLJ3IkSFH3b<&(PrQaa9_+VF|e^AL;&{(!NUFga7R65 zxCIafyaEsymyh-wU_6VIf>W=-?4ws8Fo00#-Ph<2w&wkTy@I zP-75S(cv*k$uplmeX@LdN(hrVUWcxr5U(^6-$I+{DsGd9Bh-n2q)EZFjcU>s!h#5@ zy#eoE2mD5>tt6v_KQX*B;sbg|mhGuJ}u!m0I%j(!a6of6JU6 z8eRXv-2VGs{x3K?o8}C!b@!REYtsE1I72QgFBEG|E}xA1L4XQ1$~bZ(i3$E#P4aQiHZv3q0koTMH&M;;8ThsizXuC5s?Yp^5w?M>`mBHWk&Xv5 zbfU`2q`9M`4#IbJn8!Q6<7y2JmAV`Yu4H6fyDEGIfYsBcZ6>GG%hUVmMPe$6zr*^rh zsHoaZ1)94aYl+=9@7~2eq0-j?Sd zJkwF+kF&G%4IF`bd!lHTJYU5U^{1)ymgN}&)*S9=>%~5-=b}pD;&I$5f-aqIopd?^ zo)@!rSH5*Mo^{<`l$}94cp4$0q^vAFWNogGfIlS#`f82GvlmD&7#Nu20)#|-W$OcF zZ2rm{kG3r^_m<}C_Og@>O{`zc<)}xqRNZ#JN$-71v-{>vEAK-fb(Uyoy3)NoHGT~y z>Kz}T@aPTcg;xphLZJy3C@Y=FbsH12a&rT|WIBe{M^eu=Pw9@$P>FPg?PzD2r`vl0 zXIz91{NiihuwEqa;;|1E`sG#$!Kt_3ju2TZ2+jH%xRNTumyr2KB7)`R0IgKs`4cn! z*&grs&J;B6o-N17J6=CXN4UR=2~Vvnl6P|69PV*Bs+I=*o%s#U zPT!KP{px7%D85;20}$$U)GJ>Y5K?)!srdI^IrYQO{G$|YElixg2lut4WU49Uzum|G zR*?e55cF1Fzcc)Y4*dV)DQoyJEtLtHfQ?(qh_|M;wgg9vx(2v!U|jeCdY`9>7~n-D ztcRrh>dhPaH1H>>=Olq=AsJfTzLi?w=1~>fY|O8;Q~*^h`1r_Qzka>8zW#`%#&HH8 z6-`Any<9SSXfvv3nMz?9Zt!GY1RKJYk3kzi($672SK3Ep%(F`21QC~ zsMNu@=<>$)wiL9;*`pZHp#w-1+9ZN{lW5%h5*#XZFrTvyW-u1rPgL+t@ZofOSHZlD z%%YX0WgSS?&^1ez*p9Yt*#N2mMN$mZ6|jg9ft=Y`Yhj+4m?(-bh<%O{DbvYwex09_ zgL?az!xtlOC}tP=T)X$87DoBdfdF)rqvNguUlv>#?LENq(p6}o3_Xf5jC(#_fLKZd zv3aH#tYs(`dfPJ4+35??R3Teri-Ea$rsH@aB(|I!?cu-mZYw{%+nFv-E)di-V$iBI zzM2wRTU$r9ssmtw=Fb4CISM+U@kmp#H8FYKA#zF$;AHTt88J-ZrmE!S=7z&0<}`H3 zsDA^-Y(83;fyVp{bdF>gjbX{}Nt303kw;@_v%y%yQSuY;#(5GFU(o15rci7Jv!bM- z;Z^9}QCc2cdbv$Ra$y(QLA48pW)fXKxPNp8Q0W6Xt6FVK3m)t!4_GWGW@gfO)4_35 z3-MQA`r|STMan!*NJxMuQ^F+38q5 zp^pB+FtD8jJuRPWC0gzD7?em7^Ye+}%rIM+AJNdFB0mfoeM8%6uv?)fE*M^V+v;<; z%zvGc5&b)~(@g;XQn?|vK>H*D1tj*C&E-GsasJS-F}WDQSHWRne<#O5F?X!Fnira$ z&In=}I>3vLT4sHMu@dlK@q56q3fLocv)WdzQJe;5o$RAUj$6}JjnWqhIboh4LUx928iu= zHG8xT2rw{Li{2+XL<1=!3A#$e7fx>-KmmA}Juo1lTMGY_btEeRr>Au*tq|r^P#F=1 z;3>IH?#FFFG)%*|4cZ}sXbEF)nJRg(e6+N*FzgeB_Y~&jZo&k-g(gRgF<>DX7x3W* zgQ6&xaQ6~`pcw_?F9ijA>SJbNke#-;??+Ay!;@+vT?^D`1oLBK{a4-Edrxu7H0@`^3(?QA^4>2%*J@6WiNPm{g}_@v=Yr7TB{-?)z+)0!bE)LZ z7jf{UA+=!Vf{fNZ_%+tT3qrluyPHDdz< z#LjLN-yea#9>$uOXM|uBwS4d6Z70(>7j)_oov7D3RHjkHde;r(dJbSAN^__JyA3K1 zvqN5$Jr$PEzS0BX#!R`;pGyVDJP;5V>H)9gADe8MMQ50PBi!m za5(gxN(i2zhr1}5k^s4Tk&CxS%!Z(yYA;tB27(Aa$9wnQ~;mXeHj@Ret|BSmfaPC z@mk4LqHOYie{PLpQS&$SmLR6E|2MEH{TuB57x3Pc6BE@{?ipHf3y*A@DH;v%fwqjD z^75rVSN_b)?(MKgncRIun3r!^V6MKtX7vdR6%I4>eF#riYozPb<#RrX*!-mKb+XUw z5`&YZ@x_vy&BnSl>eA&)Nm9ebGkN?zEf;$Ecs$c>`uTY3j~HYvokjGbKwnG*U6*CR z$E=;Q&|pw!NXNqR20SJ!;Jz3(eNU{*F&D&Z*KomXD* z03i?Vwxdu!P7d3K=ELRD2nsP27T#GN2?2pA zdiMwDUDXjSCX9kDkeTBDnBJBY{ly!u{x4e@&Vq@fS~Et zG+CuG9c5CXv8SXU?o8M|y(?Z~C;i|-h*7(oTxYc`g}^Oy->Ekj-rs#n2?B3Szt@lm zuvvwRy?AlEtHzu9(_>lM{3hucDgGHZKn+F>0DxD&rMoPy3EYsjOmW&>aj#NkMR|j{ zmozfXE^BL(0uFN|9>mnaf{cs;Uwmq|67sU`fFW6~aFv=K(DMf(%gA=5_8a)&9p?EA zkfo*N^RyH}{+_$ZrJ46L6`HnL)n7$^2q!T6IRO&;oWKXA6XcIP#LrgEot>n?cXFWugP~~|I#z$YkTr5as zuK?P?$W8Y_eu-rOoRGcc{M~ku44kU2&)4qBzYhkF#(P26bGx!8waJx{$fw6tYs zxVpMZJr8dwy?J9l*?vheC#+RbF?}SGP6=7`|A9>* zU#7?WleIN^fJe29>3FVT1&K?f*_Eq4QXNO=ggJ<~_-&&OZEVy`8CS-t!;dQOHjI?| z#ZvJ{VbURcHpd z!UlpY8stkg&k*pbpz^d0ILjdy9C;t`+Uiu{@502>cE0qzsg796yWd;uz>VT?hl8le zWr4}2zF1EP5rv#4vu^`)1C}!QJF7zhFA8~6uQM>8RYUAe#)WmN?J+LF@I$qS>b%jd zm40?GAKc;Q;kMteJ3FE%tIUGqD@{y0m9bha(HqTL`gA>6=@;;oX~qr*dk)}R!ZIc$ z&APkLN{-$TSiC>83sABT7YFnMHTgFXY1?NuZz&)?5;?$y1AjFQO@%Ks}T3Bql^`9TOZB(4wPk#KZHdRmm!?}^)dzKe55%GBL`QQQ2r^po( z)4JBCd-HYQ>ss+^J_@t5n>{v71{1|SmxYNgf1GIBp575^(D0d-OJE@$e??o?WIsV5Yfx!ztYpkD;s+B#g z(i!iktt}H9Q|*8GL>_slBIm}tc55P<$5T&zEkP4tlHW@k(ipgALo~C07qP(t|xSKi8Mu}8Da_UB--K- z!V`@$aQL-FG2CDj&r4$vYVE4+B(ZZ|3eNF4N^%?@20Iv3{DQXozP4T4*pWL zV*8jqI~V+2Hs%%Zr|)3Y+!F`qyXD#g?*D_jHvz}8-P=bWG9`s3qKF2CB10-;gEX6! zc}hi@DVb%c3`u2bFcd;1R3b8yP^8StEb}~%`@Cwc|M#u$TmQYkzsaHwBFv0GqE2Z&W(I;kudK1BGK}iWwQ?=V}5nlr8L>M8yOi~u()$! zm$r;*&JtvsAL*Im#}kyXE1meBb|Qxxu9l^)zqd>V+6%gmbGxD8DZCTF8O(1#GRklJ ztW~uh6C7whUDm>06cE_vm+NrsJ)$H>d77k?S3hj^!?Kbx1}h34H9%2@`N2$^MvgtM zQqY?Y&%D&6xVJs!?XP>g9BZ_kqZvP!wDYaEHeBtRLF9h=|4{2Vf6=(+Vq`R?L#x7_ z9nw_sBKW64|J=|P@%P;5u8pWV;OL+> z9dH#Rfk+^?1L?uS25BO>mxdKJulV1&%)fr5$9>*}M|vCWx3jPF(|@e|UeWh8(v7G9 zOFC`B9zHVuGTO=iT3fT(*Vi}sYUc_6$HG*)PUA{aE(+TV5?^OiQ=~puD6}N14{wm= zl5TchBQGxx;QdH$s)bFa{DJj3Gg818o;L7AY~Q4-8y%gn^Tcl|mi2&p zx|Xp3&M&05{mqDwkK zfp~_Ot}xXiWhnH~3M`H-NbEV3W?mrMm=wQ|*dgO8D1ABSfZBkzI=GLRi~X`En_t{h z|9tuxC?yA#&!3dKI=s5f8{x;2|4(okQFPE~5C;9PL;tDU@|6^V z3?l){9p1p5E4gK|v{wEz4d5z0JlmdtM1D-}`*Ez91o(h}hX6mgzv0~qXmIl3+iL0W z*J=EDy_FE{ko=ft0AK*ROhp+VYUYM(A{Q=b&>}bBTQbdnYZpmgL2n-i2YZ7I0R-?T zj;SH@FAZV^slj8Z>#N~yd^w;COB`?F-u)C%3$1`Bi7Fr>g9pw~f)V0VUe!24wFZDK zalkr0D7&YxZ|Oz0HITg^FPG4-96l#i%3x0|HY6-lb3g>8r>QXdIzxMu^E% z`3Z|J4G9^bv=FFeWF!wLM{t9Lu&^AIKk%^LMwA&FG0{Va0fmxUW9AtG8;AtQE&K1T z8?|hRY~Eh_Mh*Bw!N9;E+#nxnkw~}2{qU@$T&&G%ZLNJqYNM6~O^l2O5ss6NwnWz%2-zg0{sIiF+!XfQ}E56aaW+HXg8J zz=sK4)5cdlmu|%a4YOb;P%RRk02m0t5O(4AZ{NKm;h+7D@0mgDcpyen4N4?21T39P zaE0$VX5bpaMZuwv@KbWBt_zOvizGN3EX>a*<2ym?V*tVe)W?I}K2$Kf{TE@Ez`{Mq zcs!9>U}r; zPc1Agd`napxYF=;xf5txL@`C%Gzy)>K19GoDWreGzQ+Ih_u$~2m7IH90K$`m1bBag zOI@6u$@>r!1n7@tl zu?hg?2MyN%PZ}5?=H`&FO-G5%oGjvS#~~6+yGe8|5%=x9|4C&8XFHH@`N6K|1_=)Y z#YOP!Ka#K|I1&lqjDKg{xX~Y`)MF+Xs{{cfabmddB&HX$L#ekAKe5883n2IzTs`dj ztfEdlAr>ciu?831 zG+ax=ur3;4z9U)nZt3$=;Wr4s2W=t)14FK&?1C3=(uvNYtg%&yNRH_QmqqeRwJdN; zWM(?nFl`W_X@)ET92?x&yunMzE+KT-`rSIWkg!V3R4U={r4pAlI5cC>QvhvuNhH66 zwH8)Uy}B^S55ARcadvh-a^XT8hQi|qfFo!rP!{}q=a)9+ZWS)7w1bKT5e6)XLECYE zNeuNIl%M*hGXRO#+jf;FB)j&AnUt;tf4G@)3koGdettu$DtxftZ2FKV;Rn@SY!;}l z<+8FljB|T2psgqSHTPiT$EL#Ie*4D{HQcaRq^Aq{VohM6kem*ZKL8tG!u<0{*VXVg zvQP@K?h>h`H=K$HZCs5=Qxb;EN@$jR`S$+d$oIPqX;RPq~GK==N@i8(+97 zsvbGwC1!Ew&K=&JJC8#uMkNQb=@zUM!HsY}-h*v-Jw7vlI1LNoyek3@UiL%#&4qw4 zP$S+0*klg(s`jkq4{5Xps{-rJ;gVun@c?!O=Go%?AzDV&_(c(hjE4Hwp zkoNX=c?hLqI>8?=hqyL&tQ874ERN4kHDV#+-M?QGvfPl&0r-V|-Q6iY8;6>6a`0%I zL^mlyB8>mVxw+kI7lKeva4LcV_afQM=7w@YM$wOc}czboN=U}`Y7vSJ7 z=^Rab7)%^+;A>*%E?m5L6Z|U)W;N;ZlU?^e%T!Qncuz71@x>_a;CG-;-ISf34elk+ zYxx=jOUpp01FK8Y<8e>_H%7eEAC9MuJILy4Oh^M?zlp^o8WK=p5s^bsojtg75)h9f;8B8liR ze*!v8W(+~ z3`L@oS$vc@-%Bzx{~?`x@$w>(L7rgaCyA%GShrMSxem>?#kh(`Y&(fY&(A-EKuGW* z>V1d!k(@$ai0zFO8a-VN|5s@UdPqaqCjDePSTKYo=VImrg@pJZ-vVptGU(TZTplk1 z?Ej<4jA`!~99(twY%RarH)ZVduaZHa;TAr{u63z8u{x(W;e^m(J3BEffiLZhhe6fs z!Ma3o_wk_v*_>o2bW}qlWIU`EHBB^;L0Aq!!9i5H!#>SW;u>S3npiwudXE1Nawj|O zX5gO<_r#bW*vMPh?>9q?3A-Ti2*S0982X*n^&jj7T&G*7mDJ8t`tpo$of!4=IJFaMWM5er}~Rm|DY&|_yB1q0nmdw zkAG7j9&2Q!p^ANK=XnXyoIcFlcaRjY1=@hGU%$fd9Baq(1RE?;{87JAl$<4H407Gg zmQ+S~5xZCbU3|{cq9i2wF`VYegT5TIfb^yH$e%t45is5vRJwxs9+MHKos5y&fw%oXco(+O#zVdXk7mA6@OOvQsrin z>Oi(iD3Xxp5wm#$GF&8G$`I=Tb_l}NBQR#V|4qe%2FlM2;?y$_CUIP>yB+Uxb6sre5${Zmbn>ZiY>#k+WlY(`mx8%=tdRNmynQFaTp+hc@TvC0S&fHjX;(9T%aCK1 z*1u4B8UMea^4>Rm`(Aq!=Wg##fVB{BzDdiRd97NXZhHCh;gi~#O*mW^k06=g>C#IO zXe%Fyc}$fAiPv~seInWZ{dJDd(p2*^!|!qGHIaKSu7Wubwkcgv(Q^INm{P}0Qc_XT z%8N<>w+X)|o|aQ#)^?MdoWq+$bfu-8$3OF78SVU{pGt#czTTxse$Mxab=9w#`Pf2j z$}R}$+^PuORRDWx;uQtxO+J?fS93|gx0jsT%q==U58!G}r1PiaRPizW=HI=Iei~0~ zJus5u#je|*?e6dN9^Rs0_Hr2@UC2>4-j|tWc*w7#WM+E#g>&mpq%ORArfTx>J?MS5 zGm%HJ6^D!5|6u>^qarup=;-3fj1N#~ditF5DU`fcy34XQVGVKW0cF~$sI5Sss&X*T zPpLj#z37#-F?)3aapIYjW{-{?cH!g8dUYrnpTIvKmy>GU*WGiw8Y-u4`!kyC6*o!J zJ+b*ES>5v=m;2TXrk=RCxjQmPU+6|6{mTm2h2M<1xg?F=md6$C%3e9gk#zVvHCz{Fxkf$R_+?v?(2B_$qSMrkSNZhQEu)^3EEMWnr?eMd> z(}u8y64E$1io(ateYEXoCS~nV^(x&=YKn!t0=WqOsTCAEJNs{!b14wIZUGenz+av5 zE5FL8LYjdC_J=@sa-@GSnkx<%=GsI3tv0E(>GOSxS(gsU)Syn>zbXE&TXwfD%`#t0 zBR+WV-tZ|J^$Fz=hjls!D~~Qq&Hs?FlU~Rxsbhy7Fxj$pw@#pc;jndkOzNlo`_rwu zm~dpX9%PO zidfYNL!0f{eB(xP&+kZUfdd~-Ex|Nxc*TfXleQVPV^6fxm)MP5XJ!XkS^N{dfLFkxyCR>iHju%&=@MUrgL%ltY1iqi7J zpN;Q>B13P2cw@0`_fetHP%`&g9)+@=K-%ChgS((K;dqKfBN&?R28Z8%>oiq5KBQ;F zOMN!!<#1!$Rp@G~>ffvjxt7#%_C|BfYXxVWjaUipIu3DR!lO~m`t??(bu5jp3+pf| zrWeLdo6;TE4eEZ_F|mN_vf+|G)bP>CVZ6nov|S^(qwvW2m{^{%MHlda%B^D0N8g&& zu1b-xAbjvK#nVM0D>)OzE$~jh*=*}tLFN(O@Nxf@1gW{!!}vLR?Rb3Y=OS7xO~keU z4wcMZIG_(_-gp$a)bron%+qIEG}ip4#{T#XEFRUahO{EAaUBcx)=O%W&lHGXnoL#Q z=Vy{rQi?Av(~!4T4zg?2Q&UrGw~aqJ#fOxFum_Gd zRbRh6B2&L2ROl0kas%zxdhZ&Cx?4R|Kivt|zF=g=SY{JL8Jx-4#NPi#dXT6~Tk zWf!;R1!v3J*`^%HDi8d(krmBVY?Oz)}L!Dbv5#S*W=d?JU2$#F`z@K@IDO`H<^>WTe5V*ht3sg84cc8jPA>2UFbX}jYuyFc#mMi- zg1SN)utX;mE2-S65R1si#s)Tm>9V9`fAhPOAI`QVV0&hlwdcQ(vn0c~f-%OKL{n&K zw$@DabxvlW5W`-s6+Wq^{O>5M9nxQxQ{u`acAaJufd;87D#|Q?Q)y&wImJRJ(?^1y zxftaboH&6iW#`>NXrHi0(bs}Xuox;3>$XZBim&O(pwQihi}$uUj1L=zk0h8inVq=q z;&d-EFjxIWi>RxVWA@B;@L2HU-Euc6dr&j*mwp}&j?{m5r@m|-$#^~Ha_jkVe3 za>a-jSbfChNE4Cp_{$eG1}7s2-y~#YRHeN7nyxi7_c2`~Jj@@32!`Ok$v-Zl+r zh+7B=RO3j7GPZP+B#i6P&tA;Emi}j|+2Y*so=|rzmpc?eP4cVg=rA2NHcsDb;h)u{ zlP+#beUok_OR72NV*OS5fwSADM%vA!UAi=-1SiHHx$*DZsqEGe^? z9zMa~MvH9=>cNPRRPakotw{9OR{xZloU9aU{^0r3nML)0#xj+jxrB6f#fXu(U!m3{ zD(9P9B$Mx@mW+M-_D3VG6f7zcKon-!@_(6et6s@|V6DRBfa-@0VYvUdx|@@Z-k@MA zK%->;qyO;OU+qpyNpxSYA-$kO$93o~)go~bq- z9*#W!H(<@CY`XqL43`*=ihUz%H2)*JZNTEYKL4Dv)3>1sK%Fg6gbUv1hV=p%86HMq7R2sm#>v_^wMZ^@Pmv z40d#Qb#$Dkz*|BkCZ_j=d!?44aMlRbc=TBl-TfVvo)+)kr+{}Nkb;m)Gl{c=I6gah z5-#s=kSG7PfI;H7xAU70bnZgnp-ovfoX9pgAAeL=yRv0>k$(hNg&3)M3yOHM_J`X0L0J3&uM?f-ZLVWSG@NJ_VnC$nf`r{WbtMkv! zCoYFk0QTBXh!*w%Y`bOm?xa&s{_}T&KLv2wDheDj47$2S^2s=z6PJVfTbO%5i2Z3n z1Bm%V06PZutTkGdheK~**!q-qjC~q zKs+8>kj0iTkXZam#L>}_#DKZNCPO;IkXAS<8R!KF7+huW`aU$zAr0md79sa00f1F$ zFl7JROojJ}zZ7HNSvGSaJE-cK77%KJuE<4pAaRJ0u!3>oE>x&Q! z9cm3}{E_-#!ic;ab_WJU#R{{5NB@#vsL@cP8tjs$G4X!>y3CYE;?f1yZ!0PxP){*$ z+)E_~AJG{aIyy!QFF*f@y88O%|0czHm*B2lB<#WK=1o6<=gZ+OAyEn`Xql351k-DrQe5m7 zcoMwL5hJ6gB!vO3e~b_&cwzw5g(l$wo$+j713HY5?Bgcu*RLmW-yrn$NgpP1Yd~zC z?1Uq2HK^TnxT>|tdS!tepV+ea2d2P>Za(VI9{oT9?*0+9vCl0$-5iOAD?IX{Q0MGQh{O2bqi{D&y4< zV%*WnC>GS}2VPlOebc$%0B!Zp4Gmg|ER`qMnl)0)*#=T5A1*Kc*ZoqUdS3w^_ECEe z3j*)za%#4;OU?}X#g&1k{?kY=@+P4-Ft%?xptl}*R+pNyKbHP(9g9npX^xoqm{hvw zJ9=l~7Lq5`28@4QS}>x{YsD(oC?Ws$#a^@DRXAtMpmEDr4e5&<<3YVQjg#1}UQ{&B*vjpwo9`|2_wgL=0P z%i!Q3wLAGbq_-qk!+hYlb#-;Ova+P2F}Yo=K-w#7O`(bBTF4dnuMHoV^z~7iw+{D6 z$>$c05#jr>rf1)lx6#`=7rcs$=!*H@DJ!!iZzwBLn_r;+z%2#LSL!qb5&Tnu9YF9& zs(frp{2817AoteQn0|ZeUFz0>O6mv#|6@A;Q=mxe0hj_;lOU4&vbcwYNZmxDF9jyH zY}+PJ0(GiJVaHQnG!_PRO3aUhsze@>7cxwyJMJqIVziVi=gXtA`Dn+7(9$Rk79CVl zx(fn0I3#Cr_HxhD^1qC#fUXyM5GWcIGZi_V3Emu)YW>1OE897vDqa057c~oti#1@) zLW-SXZsWHU_}@i#@=v@zA2j4$32NE4LsGI#EVC zg+gFcZI+q1=T-NccZoTj6=NCtdb7Wq1wn>BROCQyg_Me-N0!;QAyEL7M@@`?gsJe# zRRy{I&s39TO7k1dL5IL`33H?|@@x0~4Wxgeb9UV$7GLi$U#f1OB}0a*t;uR#jPy-~ z=4+#rN;CaAtvsKdFqh0-U&|`6i!J(Gr|X|piNs7Js)i6L z8~-%N`x#28PNL?(mw*>=AKEK#K0V=x@}IDzuP0qI($k|5np(BTZE0aD_R$pL(+t2? zKpd0v=^e}mY0$tRcZd030_+tqT>>_R`u++8Yn*<4EKX$xOFY7QG>jXQe4)1?J32{a zLCwN%Th1>TiqX~5-o6Y@3Z_j5-Zn_QAoe{Hh&rVM9diGI8vIa#nyEA-n?y_Np-MQU zNo3vMwKTTS_RmOF@GxL%{&esoPAV|y4!CF%APYeZ1xvm1^(KDR>g(sw$3Xd8x;UJP zXi0Yznuv@(jK{@Bq7xoK*iYFP;(CK}fwCiRa2|d8#8aiA4FJE>j&(@oSJ|R-Vz-pz zuL>8rcR89z)ZTO;o(1_>h3-_#gb{>`BqRgWYNYjAf(LpoU`^q~d~@a5Bz5b1x35Gc zQxdyJc)CBQO1+De`~F`3>i1qdMefF`G=@7csD@?TbzPQ=*OUHuhZGf=N%S~;i-g4n z{TW=-jK0)+uhh9?%{2xm#&XC2;lBK@GLcx1^f*HlsU_v*g;)~JuH=AcVz?I`N1?b= zjvqOwhAt|DB4hWdinx8SC}9I)L;P#Cg(Te2aN#OoLVo+`bPbV9?1<(P=b%yRz`}qI z6=(mEk3&b1V^AJEeM{T~pMsvaQj1eLOFYo7KueKSGfSMq2+BqCkwC=Gz_h<`c^3T; z>Cly#sJ2M5F=DTHf=w=5;CC?{R$P+W4az`ROzen8NSjn3{LQH7Q;_gkuFUY zH9w>FC}PT%+abm6&8>K64)?Z4J5b{wL#h>&V0YvD*Hx$Ug7>@3ifu$lMULANTUDO@ zxf=ufU}d?vtiR><)ynC<9Eo&a?Mm-eS(RKA1G+W-`PvM5dx9HeyuP!09=v;y&iqmy z+hP3@8FKd_WWz{sj(Z*fDwHJUn^+t}I+kZ_Y^+_7@~qJ_6gp_U$R{EyO4byl|0gyC zJ}xUOyPy3{@aH7*2}t)v)FHvLNoW&@dXutNA`Bg*k9C@Z4Sk9NgfR3l9a|xI3)Rzu zIU2u^76nF5y=d`s?DsD{Z_9?npzc*^%g@0`}V7BQE zG)p?!&Kp3Uzf7^@zMN>OC}cn^)@T!GfF)0*{$FB?La&P%9y`VWj(Ugmu1-&8nOqb{ zv6dxR2uQBh&%*uA)5B~w2Q`0@iI$q08lxbrrKw5$@&7`BCw?t>4%K2M>JScY=9c>A zKB2xa=?Yi%@%ltxq{qkduURADr#OfQEvX*v7p;dXIPoT!+{H+(*ZEVzeC~;ft`Z+I=Z`y@G_<^_kXc3{CpOZ411l}4U z2SprC{X1Z*h30eTLhH*@|BmY4hV%e>L{={K|GchqrkE&|J1u@V2c_1-F#3 z*VCEoD)o2a6lL$LIAHuRCBTFsAay8OFqnPq8dl!hJD%O*eXzH8e(~0ePjAk~h4;+4 ze*F4kQ2N^bsmHcMwiUWxT_zZDmWMiq16mrABb_mN`XOw;(5pU0;GM(V#MPhxzF}=&q`Wu(}PXLFLT=ck%NhScF)|Eh0$D1mqp4 z)`^)UF_9ktO2#x4SXk!5oXW9fFk+{-d477W>0I>Nx8}{+n~>{F)B;Kx8ry5L@pm7r zg2p(Ihl!Xl>SZ}laRq)7SBV|CIYf)dJ@lnjI(s%Wfvfacoc+h$WrENEKvBS(vxFVb z2cLs->1fn@0nIAD!8(3Fh~u}(dBcX1!+yDTQo~^@aS~DM z(4%LT>SExGTlMZh+0EX(@^b(E2M&m+tE*@HRzG|8qO**?ks<*?%aK1}3i)CYzPj~C z^B-b3vF|~(9AuIhA76s(@-XB9Sk)&a?2(DAfS#v!z?%)@__mOY->WrJTyIiRShX); zX;;yo40&LA?*>FKwpLd0BQk5**-J2lCy$T5Ni)44@*BJGDJ)CCn6{*2bcTya~ahujT`N%yfyQTIn(1izz!XFZ4qzL2AYq4E0ZFm#jI| z6D{XKO?%v93ecONKo}3hf+6GK^SqprtloTga}+oaEtVmwg>>j34S7i+In=>YwK*d* zvjE5t&H%YM!}Uq-_hRAwCY#MF$H3#oa)=>8JN25B;@_WV6r+w(63znQFv|2$RaQ=T zZ#Uu~mDH$ksP{%Cv6o$D#~~4|rzyG9uUq}7b@JD2ZBgt$sBg!5OYzfkF9RM4XZAj;RgxWA z*K~X6g!(_do={=oc8avjI3~CEs{yk{{#qZMd4uVeqRi>3Xwe2n!GhIsI||pG^01O^ z$A|JA%U$-k*s=Vkj9q%V-1uRhq}=uD3(@Zn+OFlhmSf2(?7 zr?$)J)RY3+A^hlpQc`zFe{2BB4Jas<0*^lm3Sxyyu2&rQFos8!LJ^NQTCb7Iw5f8{ z;cpwvX=EP9(y0sPIfg|qV=GnKog9_def!jTviBm-ilr&&kg>SbYG&W#4~Di&pwEvv7Z-}QC*a2F0Z6=cJ`poD�%cT3juB=yWF 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 literal 0 HcmV?d00001 diff --git a/styles/light.json b/styles/light.json new file mode 100644 index 0000000..6b9d53d --- /dev/null +++ b/styles/light.json @@ -0,0 +1,40 @@ +{ + "link": { + "color": "245", + "underline": true, + "prefix": "(", + "suffix": ")" + }, + "link_text": { + "color": "235", + "bold": true + }, + "image": { + "color": "245", + "prefix": "[Image: ", + "suffix": "]" + }, + "image_text": { + "color": "235" + }, + "heading": { + "bold": true, + "color": "1" + }, + "code": { + "color": "235" + }, + "code_block": { + "color": "235", + "theme": "solarized-light" + }, + "emph": { + "italic": true + }, + "strong": { + "bold": true + }, + "item": { + "prefix": "• " + } + } From f1ee1e5c46e4ef5ce4586ddd8a62f2db9ca9aa31 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 28 Nov 2019 09:01:28 +0100 Subject: [PATCH 084/911] Show style parameter in gallery --- styles/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/styles/README.md b/styles/README.md index 835adb6..fe9e8c8 100644 --- a/styles/README.md +++ b/styles/README.md @@ -1,11 +1,13 @@ -# Gold Styles +# Gold Styles Gallery -## Gallery +## Dark -#### Dark +`gold -s dark` ![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/gold_dark.png) -#### Light +## Light + +`gold -s light` ![Gold Light Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/gold_light.png) From 2a3ea0ed0b1e3cb9471c63c4bb9245af1987e5cd Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 28 Nov 2019 09:07:08 +0100 Subject: [PATCH 085/911] Rename style previews --- README.md | 2 +- gallery.sh | 2 +- styles/README.md | 4 ++-- styles/dark.png | Bin 0 -> 75716 bytes styles/gold_dark.png | Bin 69072 -> 0 bytes styles/gold_light.png | Bin 69024 -> 0 bytes styles/light.png | Bin 0 -> 75889 bytes 7 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 styles/dark.png delete mode 100644 styles/gold_dark.png delete mode 100644 styles/gold_light.png create mode 100644 styles/light.png diff --git a/README.md b/README.md index c30a83f..af0f65a 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ You can supply a JSON stylesheet with the `-s` flag: ## Example Output -![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/gold_dark.png) +![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/dark.png) Check out the [Gold Style Gallery](https://github.com/charmbracelet/gold/blob/master/cmd/gold/styles/README.md)! diff --git a/gallery.sh b/gallery.sh index 0fe0a8d..1b84afc 100755 --- a/gallery.sh +++ b/gallery.sh @@ -2,7 +2,7 @@ for style in ./styles/*.json; do echo "Generating screenshot for ${style}" - filename="gold_`basename -s .json ${style}`.png" + filename="`basename -s .json ${style}`.png" light="" if [[ $style == *"light"* ]]; then diff --git a/styles/README.md b/styles/README.md index fe9e8c8..97b746b 100644 --- a/styles/README.md +++ b/styles/README.md @@ -4,10 +4,10 @@ `gold -s dark` -![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/gold_dark.png) +![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/dark.png) ## Light `gold -s light` -![Gold Light Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/gold_light.png) +![Gold Light Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/light.png) diff --git a/styles/dark.png b/styles/dark.png new file mode 100644 index 0000000000000000000000000000000000000000..aee870664c6158d2d9f601731267f078a5721da7 GIT binary patch literal 75716 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
Cz6b%U~$MF$BVfJcYl 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 diff --git a/styles/light.png b/styles/light.png new file mode 100644 index 0000000000000000000000000000000000000000..25a120e3dfb3c497d4ddb14d0d7d58f16e14f94f GIT binary patch literal 75889 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 Date: Sat, 30 Nov 2019 06:32:02 +0100 Subject: [PATCH 086/911] Support styled indents for block elements --- statik/statik.go | 2 +- styles/dark.json | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/statik/statik.go b/statik/statik.go index b3cfbb0..8571e91 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xfa\x0b|O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\x89#\xdf]|\x90[JC1\x10\x86\xdf\xb3\x8aa\x9e\x14\x8eP\xdb\x17\xc9\x0e\\\x83HI\x93i\xcf\xd0\\JN\x0e\x14\xa5\xe0Z\\\x9a+\x91h\xea\xd8\xdby\x0b\xc3\xf7_\xf2\xbf+\x00\xf4\x1c\xb7\xa8\xa1\xbe\x01\xd0&\x9f2j\xc0\xc7\xf9\x02\xbb\xdf\xdb\x18\x1de\xcf\x91PC\xc9#\xb5\xf3.\xd3\x9a\xf7\x95\xbd;\x92\xc3\xb8n\xa7{T\x00\x87\xee\x18\xb0,\xb4/\xd3)\xab\xe4]\x0b\xf8\x93r0\x1b\x9a\x96I\x8b\x97\xe7Jk\xb8,\xf3\x8a\xa7\x8e\xb7\xda< \xd7\x93q\x1c7\x02\xfd\xab\xd7\x9d\xc9\x16\"\xb3\xc9]\xeb;\x9f\xcdN\x99\xe5\xca'{m\xf6J6\xff\xd2S\xa8f8$o2\xbf\x91{p&o\xc5\x88\xc2\xae\x17\x0b.\xc6\xb3=_p(9\xdd\xf8\x86lR(\x08!\x83~}|\xc2O\x9a:\xa8\xef\x00\x00\x00\xff\xffPK\x07\x08[\xf7\xa4\xb8\xd8\x00\x00\x00+\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xee;|O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\xd0w\xdf]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xfa\x0b|O[\xf7\xa4\xb8\xd8\x00\x00\x00+\x02\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\x89#\xdf]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xee;|O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x18\x01\x00\x00light.jsonUT\x05\x00\x01\xd0w\xdf]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x008\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xd9,~O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01k\x00\xe2]|\x91Mj\xc30\x10\x85\xf7>\xc50\xab\x16\\\xc8O\x17\xc57\xe8\x19J ckb\x0b\xcb\x92\x19\xcb\x10Z\x02=K\x8f\xd6\x93\x14\xb5\x8e\x15;\x8ew\xe2\xf1\xbdyO3\x9f \x00\x1amk\xcc \xbc\x01\xb0p\xc6 f\x80\xdb\xdd\x1e\xd3\x7f\xad\xb7\x8a\xc5h\xcb\x98\x81\x97\x9e\x07\xb9\x15>\xeaS`\x1f.d\xd7\x1f\x07\xe9\x11\x13\x80sz 8x>\xf9\xf5\x94\xdc\x195\x04\x8cV\xddP\xc9\xeb\xb6\xd8\xe2\xed5\xd0\x19\xdc\x96y\xc7\xe9\xc4{m^\"W1)m\xcb\x08]\xd5Kg\xb6}\xb4y\xca\xcdUam\x15\xdb\x90\xf4<\x12- \x95Bm\xb5@mG\xaapj\xe9\xdf\xbb\xcd\x06'\xcc!7\xae\xa8\x97\x02\xe7%\x83u\xd0|\xc5M\x98\x8e\x9d3$\xfa\x83\xd5\x93\"\xa9\xe3dn&\xf5<\x19]\xccO\xd3yqw\xf6\x13\x97\xed\xb9\x89D\xbc\xd4\xcf\xd77\xfc\xa5%\xe7\xe47\x00\x00\xff\xffPK\x07\x08\xbb\x85,\x18\xf2\x00\x00\x00\x84\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xee;|O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\xd0w\xdf]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xd9,~O\xbb\x85,\x18\xf2\x00\x00\x00\x84\x02\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01k\x00\xe2]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xee;|O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x812\x01\x00\x00light.jsonUT\x05\x00\x01\xd0w\xdf]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00R\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index 319d13e..498a574 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -21,10 +21,17 @@ "bold": true, "color": "3" }, + "table": { + "indent": 4 + }, + "paragraph": { + "indent": 1 + }, "code": { "color": "200" }, "code_block": { + "indent": 4, "color": "200", "theme": "solarized-dark" }, From 6d3f74d425bef12dc9c6346e2e534db0dc2c17bb Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 30 Nov 2019 07:03:39 +0100 Subject: [PATCH 087/911] Fix background colors not being applied correctly --- statik/statik.go | 2 +- styles/dark.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/statik/statik.go b/statik/statik.go index 8571e91..7a2b99d 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xd9,~O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01k\x00\xe2]|\x91Mj\xc30\x10\x85\xf7>\xc50\xab\x16\\\xc8O\x17\xc57\xe8\x19J ckb\x0b\xcb\x92\x19\xcb\x10Z\x02=K\x8f\xd6\x93\x14\xb5\x8e\x15;\x8ew\xe2\xf1\xbdyO3\x9f \x00\x1amk\xcc \xbc\x01\xb0p\xc6 f\x80\xdb\xdd\x1e\xd3\x7f\xad\xb7\x8a\xc5h\xcb\x98\x81\x97\x9e\x07\xb9\x15>\xeaS`\x1f.d\xd7\x1f\x07\xe9\x11\x13\x80sz 8x>\xf9\xf5\x94\xdc\x195\x04\x8cV\xddP\xc9\xeb\xb6\xd8\xe2\xed5\xd0\x19\xdc\x96y\xc7\xe9\xc4{m^\"W1)m\xcb\x08]\xd5Kg\xb6}\xb4y\xca\xcdUam\x15\xdb\x90\xf4<\x12- \x95Bm\xb5@mG\xaapj\xe9\xdf\xbb\xcd\x06'\xcc!7\xae\xa8\x97\x02\xe7%\x83u\xd0|\xc5M\x98\x8e\x9d3$\xfa\x83\xd5\x93\"\xa9\xe3dn&\xf5<\x19]\xccO\xd3yqw\xf6\x13\x97\xed\xb9\x89D\xbc\xd4\xcf\xd77\xfc\xa5%\xe7\xe47\x00\x00\xff\xffPK\x07\x08\xbb\x85,\x18\xf2\x00\x00\x00\x84\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xee;|O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\xd0w\xdf]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xd9,~O\xbb\x85,\x18\xf2\x00\x00\x00\x84\x02\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01k\x00\xe2]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xee;|O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x812\x01\x00\x00light.jsonUT\x05\x00\x01\xd0w\xdf]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00R\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00a0~O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\x16\x06\xe2]|\x91]N\x83@\x10\xc7\xdf9\xc5d\x9e4\xc1\xa4\xad\x1a\x0d7\xf0\x0c\xc6\x90\x81\x9d\xc2\x86e\x97\x0cK\xd2h\x9ax\x16\x8f\xe6I\xcc*e\x0b\xd2\xbe\x91\xe1\xf7\xff\x98\x9d\x8f\x04\x00\x8d\xb6\x0df\x10\xbe\x01\xb0t\xc6 f\x80\xdb\xdd=\xa6\x7f\xb3\xc1*\x16\xa3-c\x06^\x06\x1e\xc7\x9d\xf0^\x1f\x02{s\"\xfba?\x8en1\x018\xa6\xa7\x80\xdc\xf3\xc1_O)\x9cQc\xc0$\xd5-U|]\x16[\xbc\xbe\x04:\x83\xffe\xdep\xeex\xa9\xcds\xe4j&\xa5m\x15\xa1\xb3z\xe9B\x16W\xa0\xb2\xa9\xc4\x0dV\xe5\xd3\xcf\xc7\xa7h\xea\xa90g\xebh\xab\xd8\x86\x1e\x0f\x13\xd1\x91P%\xd4\xd5+\xd4v\xa2J\xa7\xd6^e\xb7\xd9\xe0\x8c\xc9\x0b\xe3\xcaf-p\xb9B\x90\x8e3_s\x1b\xdc\xb1w\x86D\xbf\xb3\xbaS$Mt\xe6vV\xcf\x93\xd1\xe5\xf2p\xbd\x17w\xe1\xf5\xe2)<\xb7\x91\x88w\xfc\xfe\xfc\x82\xdf\xb4\xe4\x98\xfc\x04\x00\x00\xff\xffPK\x07\x08\xa9-\x98t\xfe\x00\x00\x00\xa2\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xee;|O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\xd0w\xdf]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00a0~O\xa9-\x98t\xfe\x00\x00\x00\xa2\x02\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\x16\x06\xe2]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xee;|O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>\x01\x00\x00light.jsonUT\x05\x00\x01\xd0w\xdf]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00^\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index 498a574..e0217fa 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -19,7 +19,8 @@ }, "heading": { "bold": true, - "color": "3" + "color": "3", + "background_color": "57" }, "table": { "indent": 4 From 974be22fa093064f8c088b78705a3d1eac548d90 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 30 Nov 2019 08:06:41 +0100 Subject: [PATCH 088/911] Make document indentable --- statik/statik.go | 2 +- styles/dark.json | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/statik/statik.go b/statik/statik.go index 7a2b99d..429d5d6 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00a0~O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\x16\x06\xe2]|\x91]N\x83@\x10\xc7\xdf9\xc5d\x9e4\xc1\xa4\xad\x1a\x0d7\xf0\x0c\xc6\x90\x81\x9d\xc2\x86e\x97\x0cK\xd2h\x9ax\x16\x8f\xe6I\xcc*e\x0b\xd2\xbe\x91\xe1\xf7\xff\x98\x9d\x8f\x04\x00\x8d\xb6\x0df\x10\xbe\x01\xb0t\xc6 f\x80\xdb\xdd=\xa6\x7f\xb3\xc1*\x16\xa3-c\x06^\x06\x1e\xc7\x9d\xf0^\x1f\x02{s\"\xfba?\x8en1\x018\xa6\xa7\x80\xdc\xf3\xc1_O)\x9cQc\xc0$\xd5-U|]\x16[\xbc\xbe\x04:\x83\xffe\xdep\xeex\xa9\xcds\xe4j&\xa5m\x15\xa1\xb3z\xe9B\x16W\xa0\xb2\xa9\xc4\x0dV\xe5\xd3\xcf\xc7\xa7h\xea\xa90g\xebh\xab\xd8\x86\x1e\x0f\x13\xd1\x91P%\xd4\xd5+\xd4v\xa2J\xa7\xd6^e\xb7\xd9\xe0\x8c\xc9\x0b\xe3\xcaf-p\xb9B\x90\x8e3_s\x1b\xdc\xb1w\x86D\xbf\xb3\xbaS$Mt\xe6vV\xcf\x93\xd1\xe5\xf2p\xbd\x17w\xe1\xf5\xe2)<\xb7\x91\x88w\xfc\xfe\xfc\x82\xdf\xb4\xe4\x98\xfc\x04\x00\x00\xff\xffPK\x07\x08\xa9-\x98t\xfe\x00\x00\x00\xa2\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xee;|O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\xd0w\xdf]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00a0~O\xa9-\x98t\xfe\x00\x00\x00\xa2\x02\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\x16\x06\xe2]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xee;|O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>\x01\x00\x00light.jsonUT\x05\x00\x01\xd0w\xdf]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00^\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xda8~O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\x0c\x15\xe2]|\x91]J\xc40\x10\xc7\xdf{\x8aa\x9e\x14V\xd8\xad\x8a\xd2\x1bx\x06\x95\x92&\xb3mh\x9a\x944\x85EY\xf0,\x1e\xcd\x93H\xdc\xda\xd9~\xec>f\xf2\xfb\x7f$\xf3\x99\x00\xa0r\xb2o\xc8\x06\xcc \x9e\x01P[u:\xa7\x9b\xd3\xa0\xf5\xb4\xd7\x07\xcc\x00\xdf,\x0e\xb3\xae\xdf\xf3,\x018\xc69\x1amk6\x92\xce8\x1f\x91]z\xff\xaf\xeb\xad\"o\xb4%\xcc \xf8\x9e\x16\x117\xcb\x84\xdbi@\x1e\xe8\x10\xae\xa7\x14\xce\xa8!`\x94\xeaF\x94t]\xc6-^_\"\x9d\xc1\xb2\xcc;N\x1d/\xb5yf\xae\"\xa1\xb4-\x19:\xab\xb7\x99\xc9\xf8 B\xd6\xa5w\xbdU\xf9x\xf9\xf8\xc4\xa6A\x14\x86V\x96\xf60\x12\xad\xf0\xa2\xf4\xa2\xadV\xa8\xddHI\xa7\xd6~%\xddnq\xc2\xe4\x85q\xb2^\x0b\x9c?!J\x87Y\xa8\xa8\x89\xee\xd89#\xbc\xfe u\xa7\x84\xaf\xd9\x99\x9aI\xbd \x8c\x96\xf3\xc5u\xc1\xbb\x0b\xbf\xc7\xab\x08\xd40\xc1{\xfc\xf9\xfa\x86\xbf\xb4\xe4\x98\xfc\x06\x00\x00\xff\xffPK\x07\x08\xa9\xce\xfe\xa0\x0b\x01\x00\x00\xef\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xee;|O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\xd0w\xdf]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda8~O\xa9\xce\xfe\xa0\x0b\x01\x00\x00\xef\x02\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\x0c\x15\xe2]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xee;|O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81K\x01\x00\x00light.jsonUT\x05\x00\x01\xd0w\xdf]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00k\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index e0217fa..b8e45c0 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -1,4 +1,9 @@ { + "document": { + "indent": 2, + "prefix": "\n", + "suffix": "\n" + }, "link": { "color": "123", "underline": true, From 57b5100c579ca8ef6c17334a8b18dba6479586f6 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 4 Dec 2019 04:55:26 +0100 Subject: [PATCH 089/911] Update dark style defaults --- statik/statik.go | 2 +- styles/dark.json | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/statik/statik.go b/statik/statik.go index 429d5d6..0ec6d5f 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xda8~O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\x0c\x15\xe2]|\x91]J\xc40\x10\xc7\xdf{\x8aa\x9e\x14V\xd8\xad\x8a\xd2\x1bx\x06\x95\x92&\xb3mh\x9a\x944\x85EY\xf0,\x1e\xcd\x93H\xdc\xda\xd9~\xec>f\xf2\xfb\x7f$\xf3\x99\x00\xa0r\xb2o\xc8\x06\xcc \x9e\x01P[u:\xa7\x9b\xd3\xa0\xf5\xb4\xd7\x07\xcc\x00\xdf,\x0e\xb3\xae\xdf\xf3,\x018\xc69\x1amk6\x92\xce8\x1f\x91]z\xff\xaf\xeb\xad\"o\xb4%\xcc \xf8\x9e\x16\x117\xcb\x84\xdbi@\x1e\xe8\x10\xae\xa7\x14\xce\xa8!`\x94\xeaF\x94t]\xc6-^_\"\x9d\xc1\xb2\xcc;N\x1d/\xb5yf\xae\"\xa1\xb4-\x19:\xab\xb7\x99\xc9\xf8 B\xd6\xa5w\xbdU\xf9x\xf9\xf8\xc4\xa6A\x14\x86V\x96\xf60\x12\xad\xf0\xa2\xf4\xa2\xadV\xa8\xddHI\xa7\xd6~%\xddnq\xc2\xe4\x85q\xb2^\x0b\x9c?!J\x87Y\xa8\xa8\x89\xee\xd89#\xbc\xfe u\xa7\x84\xaf\xd9\x99\x9aI\xbd \x8c\x96\xf3\xc5u\xc1\xbb\x0b\xbf\xc7\xab\x08\xd40\xc1{\xfc\xf9\xfa\x86\xbf\xb4\xe4\x98\xfc\x06\x00\x00\xff\xffPK\x07\x08\xa9\xce\xfe\xa0\x0b\x01\x00\x00\xef\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xee;|O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\xd0w\xdf]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda8~O\xa9\xce\xfe\xa0\x0b\x01\x00\x00\xef\x02\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\x0c\x15\xe2]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xee;|O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81K\x01\x00\x00light.jsonUT\x05\x00\x01\xd0w\xdf]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00k\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xb6\x1d\x84O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xe8+\xe7]|\x91QN\xf30\x10\x84\xdfs\x8a\x95\x9f\xfe_\x02\xa9\xb4E\xa0\xdc\x803\x00\x8a6\xf66\xb1\xe2\xd8\xd1\xc6\x91*P%\xce\xc2\xd18 \nM\xb3\x84\xa4y\xf4xv\xbe\xd1\xee{\x02\xa0L\xd0]M>\xaa\x14\xfa7\x80\xb2\xde\x9c\xdf\xfb\x9b\xb3\xd00\x1d\xecQ\xa5\xa0^\xbc\x1a\xb4\xb6;\x88\x96\x00\x9cz]9\xeb+ \xd2\xc1\x05\xee-w\xdb\xdde\xae\xf3\x86\xd8YO*\x85\xc8\x1d\xcd\x10\xff\xe6\x84\xffS@\x16\xe9\x18\xd7)ypf\x00\x8c\xa3\xb6\xc6\x82\xd6\xc7\xa4\xc5\xf3S\xefNa^\xe6UM\x13\xaf\xb5y\x14_Ih\xac/\xc4\xf4\xab\xde\xca\x8as\xd4U\xc1\xa1\xf3&\x1bS\xef\x1f.\xbf\xa3\xb4\x13P\xc4\xdc\xd1\xd2!GG\x83\x8c\x05cS\xae\x9c{\x91\xbb\x17\x8a\x0efi\x8f\xdb\xcdf\xea\xc9r\x17t\xb5\x02\x9a\x8c\x0eZ,\xa9\xee\xd3U\x1b\x1c\xb2}#sk\x90+I\xa6zR>\xa2\xb3\xfa\xef\xa9\xdb\xc8\xe1\xca\xbe\xe5x\x91jq\xc8\xfe\xbf>>\xe1\x87\x96\x9c\x92\xef\x00\x00\x00\xff\xffPK\x07\x08;L^\xa5\x0f\x01\x00\x00!\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xb6\x1d\x84O;L^\xa5\x0f\x01\x00\x00!\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xe8+\xe7]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81O\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00o\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index b8e45c0..712413c 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -1,6 +1,6 @@ { "document": { - "indent": 2, + "indent": 4, "prefix": "\n", "suffix": "\n" }, @@ -24,14 +24,16 @@ }, "heading": { "bold": true, - "color": "3", - "background_color": "57" + "prefix": "\n", + "background_color": "57", + "color": "3" }, "table": { "indent": 4 }, "paragraph": { - "indent": 1 + "indent": 4, + "background_color": "54" }, "code": { "color": "200" From 852df5e82a81e2bedf6cd3a26f9799851269d04d Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 4 Dec 2019 06:38:30 +0100 Subject: [PATCH 090/911] Update dark style with a background color for the document --- statik/statik.go | 2 +- styles/dark.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/statik/statik.go b/statik/statik.go index 0ec6d5f..b3f9483 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xb6\x1d\x84O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xe8+\xe7]|\x91QN\xf30\x10\x84\xdfs\x8a\x95\x9f\xfe_\x02\xa9\xb4E\xa0\xdc\x803\x00\x8a6\xf66\xb1\xe2\xd8\xd1\xc6\x91*P%\xce\xc2\xd18 \nM\xb3\x84\xa4y\xf4xv\xbe\xd1\xee{\x02\xa0L\xd0]M>\xaa\x14\xfa7\x80\xb2\xde\x9c\xdf\xfb\x9b\xb3\xd00\x1d\xecQ\xa5\xa0^\xbc\x1a\xb4\xb6;\x88\x96\x00\x9cz]9\xeb+ \xd2\xc1\x05\xee-w\xdb\xdde\xae\xf3\x86\xd8YO*\x85\xc8\x1d\xcd\x10\xff\xe6\x84\xffS@\x16\xe9\x18\xd7)ypf\x00\x8c\xa3\xb6\xc6\x82\xd6\xc7\xa4\xc5\xf3S\xefNa^\xe6UM\x13\xaf\xb5y\x14_Ih\xac/\xc4\xf4\xab\xde\xca\x8as\xd4U\xc1\xa1\xf3&\x1bS\xef\x1f.\xbf\xa3\xb4\x13P\xc4\xdc\xd1\xd2!GG\x83\x8c\x05cS\xae\x9c{\x91\xbb\x17\x8a\x0efi\x8f\xdb\xcdf\xea\xc9r\x17t\xb5\x02\x9a\x8c\x0eZ,\xa9\xee\xd3U\x1b\x1c\xb2}#sk\x90+I\xa6zR>\xa2\xb3\xfa\xef\xa9\xdb\xc8\xe1\xca\xbe\xe5x\x91jq\xc8\xfe\xbf>>\xe1\x87\x96\x9c\x92\xef\x00\x00\x00\xff\xffPK\x07\x08;L^\xa5\x0f\x01\x00\x00!\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xb6\x1d\x84O;L^\xa5\x0f\x01\x00\x00!\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xe8+\xe7]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81O\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00o\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00@,\x84O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01HE\xe7]\x94\x92Qj\x840\x10\x86\xdf=\xc5\x90\xa7\x16Z\xd8\xaaK\x8b7\xe8\x19\xda\"1\x99\xd5`L$FXZ\x16z\x96\x1e\xad')v\xd5i\xaa+\xecc\xfe\xf9g\xbe\x9f\x99|D\x00LZ\xd17h<\xcb`x\x030e\xe4\xf9\x9d\xde\x9d\x85\x82\x8b\xbat\xb672\x17V[\xc72`q\x92\xb2\xb1\xdc:<\xa8\xe3 \xbe\x9aI\xeb\xfa\x03i\x11\xc0i\xd0\x99V\xa6&\xce<\xeb!N\xa6\xbe\xdeHtZ\x19d\x19x\xd7\xe3\x02q\xb3$\xdc\x86\x80\xdc\xe3\xd1oS\n\xab\xe5\x08\x98[U\xc3K\xdcn\xa3\x14/\xcf\x83;\x83e\x987\x16N\xbc\x94\xe6\x89|\x15r\xa9LI\xa6?\xf16V\xbcv\x95\xfd\xe3T\x9d\xa5\x84@\x9e\x17\x1a\xd7\xee<;Z\xeex\xe9x[]\xf9\x1b\xf6)Q\x84\x95k{\x8cw\xbb\xd0\x93\x17\xda\x8az\x03\x14\xb4\x8e\x9a\xaf\xb0\x19\xa6\xb3\xcej\xee\xd4;\xca{\xc9]M\x93\xb1 \xc2{\xae\x95\xf8\x7f\xea\xce;{a\xdft<\x8f\x0d9h\xff\xdf\x9f_\xf0K\x8bN\xd1O\x00\x00\x00\xff\xffPK\x07\x08D0s\xdc\x15\x01\x00\x00@\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00@,\x84OD0s\xdc\x15\x01\x00\x00@\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01HE\xe7]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00u\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index 712413c..0379e8c 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -1,6 +1,7 @@ { "document": { "indent": 4, + "background_color": "234", "prefix": "\n", "suffix": "\n" }, From df17759c6697f039c92c172699ca31648a184b32 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 4 Dec 2019 06:58:43 +0100 Subject: [PATCH 091/911] Update default dark theme with margins --- statik/statik.go | 2 +- styles/dark.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/statik/statik.go b/statik/statik.go index b3f9483..1c15c19 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00@,\x84O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01HE\xe7]\x94\x92Qj\x840\x10\x86\xdf=\xc5\x90\xa7\x16Z\xd8\xaaK\x8b7\xe8\x19\xda\"1\x99\xd5`L$FXZ\x16z\x96\x1e\xad')v\xd5i\xaa+\xecc\xfe\xf9g\xbe\x9f\x99|D\x00LZ\xd17h<\xcb`x\x030e\xe4\xf9\x9d\xde\x9d\x85\x82\x8b\xbat\xb672\x17V[\xc72`q\x92\xb2\xb1\xdc:<\xa8\xe3 \xbe\x9aI\xeb\xfa\x03i\x11\xc0i\xd0\x99V\xa6&\xce<\xeb!N\xa6\xbe\xdeHtZ\x19d\x19x\xd7\xe3\x02q\xb3$\xdc\x86\x80\xdc\xe3\xd1oS\n\xab\xe5\x08\x98[U\xc3K\xdcn\xa3\x14/\xcf\x83;\x83e\x987\x16N\xbc\x94\xe6\x89|\x15r\xa9LI\xa6?\xf16V\xbcv\x95\xfd\xe3T\x9d\xa5\x84@\x9e\x17\x1a\xd7\xee<;Z\xeex\xe9x[]\xf9\x1b\xf6)Q\x84\x95k{\x8cw\xbb\xd0\x93\x17\xda\x8az\x03\x14\xb4\x8e\x9a\xaf\xb0\x19\xa6\xb3\xcej\xee\xd4;\xca{\xc9]M\x93\xb1 \xc2{\xae\x95\xf8\x7f\xea\xce;{a\xdft<\x8f\x0d9h\xff\xdf\x9f_\xf0K\x8bN\xd1O\x00\x00\x00\xff\xffPK\x07\x08D0s\xdc\x15\x01\x00\x00@\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00@,\x84OD0s\xdc\x15\x01\x00\x00@\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01HE\xe7]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00u\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x009/\x84O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xdfJ\xe7]|\x91_N\x840\x10\xc6\xdf9E\xd3'M4Yw1\x1an\xe0\x19\xd4\x90\xd2\xceBC\xff\x90\xa1$\x1b\xcd&\x9e\xc5\xa3y\x12S\x17\x18\x10\x96\xc7~\xf3\xcd\xfc\xbe\xce|&\x8cq\xe5eg\xc1\x05\x9e\xb1\xf8f\x8ck\xa7.\xef\xf4\xee\"\x14B\xd6%\xfa\xce\xa9\\z\xe3\x91g\x8c\xef\x0f)\xef\xcb\x0d\xc2Q\x9f\xa2\xf8\xe6\x06\xad\xed\x8e\xa4%\x8c\x9d\xa3\xce\x8dv5q\xc6Y\x0f\xfb\xc3\xd0\xd79\x05h\xb4\x03\x9e\xb1\x80\x1d,\x107K\xc2\xed\x1c\x90\x078\x85mJ\xe1\x8d\xea\x01c\xab\xb6\xa2\x84\xed6J\xf1\xfa\x12\xdd\x19[\x86y\xe7\xf3\x89\xd7\xd2<\x93\xaf\x02\xa1\xb4+\xc94\x89\xb7\xb1\xe2\xb5\xab<>\x0d\xd5Q:\x10(\x88\xc2L\xbeh\x05\x96\xda\xc5;\x8f\x8eF\xa0(Q4\xd5\x9ak\x8b\x9b\x12Ez\xb5\xb6\xc7\xfdn7\xf7\xe4\x85\xf1\xb2\xde\x00\xcdZ{-T`\xe3t\xdez#P\x7f\x80\xbaW\x02k\x9a\x0cv\x1a^\x07a\xb4\xfc\x7f\xea6\xa0\xbf\xb2o:^\x00K\x0e\xda\xff\xcf\xd77\xfb\xa3%\xe7\xe47\x00\x00\xff\xffPK\x07\x08 \x85\x9a\x9c\x19\x01\x00\x00@\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x009/\x84O \x85\x9a\x9c\x19\x01\x00\x00@\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xdfJ\xe7]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00y\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index 0379e8c..e905cea 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -30,17 +30,17 @@ "color": "3" }, "table": { - "indent": 4 + "margin": 4 }, "paragraph": { - "indent": 4, + "margin": 4, "background_color": "54" }, "code": { "color": "200" }, "code_block": { - "indent": 4, + "margin": 4, "color": "200", "theme": "solarized-dark" }, From 821aa99320e0d6b07c72ef7074b8b1982e8be971 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 4 Dec 2019 07:27:53 +0100 Subject: [PATCH 092/911] Add foreground color for text in default theme --- statik/statik.go | 2 +- styles/dark.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/statik/statik.go b/statik/statik.go index 1c15c19..7c6235a 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x009/\x84O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xdfJ\xe7]|\x91_N\x840\x10\xc6\xdf9E\xd3'M4Yw1\x1an\xe0\x19\xd4\x90\xd2\xceBC\xff\x90\xa1$\x1b\xcd&\x9e\xc5\xa3y\x12S\x17\x18\x10\x96\xc7~\xf3\xcd\xfc\xbe\xce|&\x8cq\xe5eg\xc1\x05\x9e\xb1\xf8f\x8ck\xa7.\xef\xf4\xee\"\x14B\xd6%\xfa\xce\xa9\\z\xe3\x91g\x8c\xef\x0f)\xef\xcb\x0d\xc2Q\x9f\xa2\xf8\xe6\x06\xad\xed\x8e\xa4%\x8c\x9d\xa3\xce\x8dv5q\xc6Y\x0f\xfb\xc3\xd0\xd79\x05h\xb4\x03\x9e\xb1\x80\x1d,\x107K\xc2\xed\x1c\x90\x078\x85mJ\xe1\x8d\xea\x01c\xab\xb6\xa2\x84\xed6J\xf1\xfa\x12\xdd\x19[\x86y\xe7\xf3\x89\xd7\xd2<\x93\xaf\x02\xa1\xb4+\xc94\x89\xb7\xb1\xe2\xb5\xab<>\x0d\xd5Q:\x10(\x88\xc2L\xbeh\x05\x96\xda\xc5;\x8f\x8eF\xa0(Q4\xd5\x9ak\x8b\x9b\x12Ez\xb5\xb6\xc7\xfdn7\xf7\xe4\x85\xf1\xb2\xde\x00\xcdZ{-T`\xe3t\xdez#P\x7f\x80\xbaW\x02k\x9a\x0cv\x1a^\x07a\xb4\xfc\x7f\xea6\xa0\xbf\xb2o:^\x00K\x0e\xda\xff\xcf\xd77\xfb\xa3%\xe7\xe47\x00\x00\xff\xffPK\x07\x08 \x85\x9a\x9c\x19\x01\x00\x00@\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x009/\x84O \x85\x9a\x9c\x19\x01\x00\x00@\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xdfJ\xe7]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00y\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00b3\x84O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xb8Q\xe7]|\x91]N\x840\x14\x85\xdfYE\xd3'M4\x99\xdfh\xd8\x81kPCJ{\x07\x1a\xfaC.%\x99h&q-.\xcd\x95\x98:\xc0\x05ax\xec\xe9\xb9\xf7;\xed\xf9L\x18\xe3\xca\xcb\xd6\x82\x0bH\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00b3\x84O\xf8|\xadg\x1c\x01\x00\x00S\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xb8Q\xe7]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00|\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index e905cea..0913d01 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -34,7 +34,8 @@ }, "paragraph": { "margin": 4, - "background_color": "54" + "background_color": "54", + "color": "15" }, "code": { "color": "200" From 8681be79dff931567082510f1c143ab8904a440d Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 4 Dec 2019 13:43:18 +0100 Subject: [PATCH 093/911] Add margin to lists in default dark style --- statik/statik.go | 2 +- styles/dark.json | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/statik/statik.go b/statik/statik.go index 7c6235a..903967e 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00b3\x84O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xb8Q\xe7]|\x91]N\x840\x14\x85\xdfYE\xd3'M4\x99\xdfh\xd8\x81kPCJ{\x07\x1a\xfaC.%\x99h&q-.\xcd\x95\x98:\xc0\x05ax\xec\xe9\xb9\xf7;\xed\xf9L\x18\xe3\xca\xcb\xd6\x82\x0bH\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00b3\x84O\xf8|\xadg\x1c\x01\x00\x00S\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xb8Q\xe7]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00|\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00%c\x84O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xa7\xa5\xe7]\x94\x92oj\xb40\x10\xc6\xbf{\x8a\x90O\xef\x0b-\xec\xba.-\xde\xa0gh\x8b\xc4dV\x83\xf9#c\x84\xa5e\xa1g\xe9\xd1z\x92\x92\xae\x1a\xadn\xa0\x1f\xf3\xe4\x99\xf9M\xe6\xc9{B\x08\x15\x96\xf7\x1a\x8c\xa39\xf1gB\xa84\xe2z\xce\xee\xaeB\xc9xS\xa1\xed\x8d(\xb8U\x16iNhz\xc8\xe8p\xdd\"\x9c\xe4\xd9\x8b/f\xd4\xba\xfe\x14\xb4\x84\x90\x8b\xd7\xa9\x92\xa6 \x9c\xa9\xd7>=\x8cu\xbd\x11\x80J\x1a\xa09q\xd8\xc3\n\xf1oM\xf8\xbf\x04\x14\x0e\xce.N)\xad\x12\x03`*\x95\x9aU\x10/\x0bS\x8c\xb7\x93t\x08 \xc7J5{\xa2fXI\xe3s\x9e\x1c-CV!k\xeb-W\x8c\x9b\xad\xb8\xfbc\x00s+\xb6V\x9b\xeevKOQ*\xcb\x9b\x08{Q:h\xae\x06\xed\xbb\xd3\xce*\x86\xf2\x0d\xc4\xbd`\xd8\x84\xce\xa0\xe7\xef\x91\x8e)\xc9\x7f\xa7\xdf9\xb47\"\x98}\xae\xce\xfdu/it/\xd2\x81\x0e\x1dC\xc8_\x1f\x9f\xe4\xc7\x95\\\x92\xef\x00\x00\x00\xff\xffPK\x07\x08s)w\xba)\x01\x00\x00\xa5\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00%c\x84Os)w\xba)\x01\x00\x00\xa5\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xa7\xa5\xe7]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\x89\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index 0913d01..bca13be 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -51,6 +51,11 @@ "strong": { "bold": true }, + "list": { + "margin": 4, + "background_color": "52", + "color": "15" + }, "item": { "prefix": "• " } From 353b5eab9621a156151c873e71566c44089fb47e Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 5 Dec 2019 09:45:34 +0100 Subject: [PATCH 094/911] Add margin to heading element in default dark style --- statik/statik.go | 2 +- styles/dark.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/statik/statik.go b/statik/statik.go index 903967e..862dfec 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00%c\x84O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xa7\xa5\xe7]\x94\x92oj\xb40\x10\xc6\xbf{\x8a\x90O\xef\x0b-\xec\xba.-\xde\xa0gh\x8b\xc4dV\x83\xf9#c\x84\xa5e\xa1g\xe9\xd1z\x92\x92\xae\x1a\xadn\xa0\x1f\xf3\xe4\x99\xf9M\xe6\xc9{B\x08\x15\x96\xf7\x1a\x8c\xa39\xf1gB\xa84\xe2z\xce\xee\xaeB\xc9xS\xa1\xed\x8d(\xb8U\x16iNhz\xc8\xe8p\xdd\"\x9c\xe4\xd9\x8b/f\xd4\xba\xfe\x14\xb4\x84\x90\x8b\xd7\xa9\x92\xa6 \x9c\xa9\xd7>=\x8cu\xbd\x11\x80J\x1a\xa09q\xd8\xc3\n\xf1oM\xf8\xbf\x04\x14\x0e\xce.N)\xad\x12\x03`*\x95\x9aU\x10/\x0bS\x8c\xb7\x93t\x08 \xc7J5{\xa2fXI\xe3s\x9e\x1c-CV!k\xeb-W\x8c\x9b\xad\xb8\xfbc\x00s+\xb6V\x9b\xeevKOQ*\xcb\x9b\x08{Q:h\xae\x06\xed\xbb\xd3\xce*\x86\xf2\x0d\xc4\xbd`\xd8\x84\xce\xa0\xe7\xef\x91\x8e)\xc9\x7f\xa7\xdf9\xb47\"\x98}\xae\xce\xfdu/it/\xd2\x81\x0e\x1dC\xc8_\x1f\x9f\xe4\xc7\x95\\\x92\xef\x00\x00\x00\xff\xffPK\x07\x08s)w\xba)\x01\x00\x00\xa5\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00%c\x84Os)w\xba)\x01\x00\x00\xa5\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xa7\xa5\xe7]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\x89\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xa5E\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\x96\xc3\xe8]\x94\x92]j\xeb0\x10\x85\xdf\xbd\x8aAO\xf7B\x0b\x89\xe3\xd0\xe2\x1dt\x0dm \xb24\xb1\x85\xf5c\xc62\x84\x96@\xd7\xd2\xa5u%\xc5\x8dm\xd9u\"\xe8\xa3\x8e\xce\x9co4\xa3\xf7\x04\x80I':\x83\xd6\xb3\x1c\xfa3\x00SV^\xce\xd9\xddE(\xb8\xa8Kr\x9d\x95\x07\xe1\xb4#\x96\x03Kw\x19\x1b\xae\x1b\xc2\xa3:\xf5\xe2\x8b\x1d\xb5\xb6;\x06-\x018\xf7:\xd3\xca\xd6\x813em\xd3\xddX\xd7Y\x89\xa4\x95E\x96\x83\xa7\x0eW\x88\x7fk\xc2\xff%\xe0\xe0\xf1\xe4\xe3\x94\xc2i9\x00\xa6Rex\x89\xf1\xb2\xd0\xc5\xf3S\xef\xcea\xdd\xcc+[&\xde\xea\xe61\xf8*\xe4R\xd92\x98f\xedEFl8\x95\xca\xb2\x1c\xd2\xc8\x9a\xf6\x0f\xa3}\x92v\x81\xecy\xa1go\x9e\x12\xb3\xc9\xd1p\xe2%\xf1\xa6\xba\xe6\x8aq\xb3\x15w\xbb\x0f`\xe1\xe4\xb5Y\xa7\x9b\xcd\xd2s(\xb4\x13u\x84\xbd(\x1d4_\xa1\xe9\xd3Y\xeb4'\xf5\x86\xf2^r\xaaC2\x9a\xf9{\x94\xe7Z\x89\xdf\xdf\xa1\xf5\xe4n\xecd\xf6\xdbZ\xff\xd7\xb9\xa4\xd1\xb9(\x8f&$\x86\xad\x7f}|\xc2\x8f+9'\xdf\x01\x00\x00\xff\xffPK\x07\x08b\xafW\x18,\x01\x00\x00\xb6\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xa5E\x85Ob\xafW\x18,\x01\x00\x00\xb6\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\x96\xc3\xe8]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81l\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\x8c\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index bca13be..d0e14e5 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -26,6 +26,7 @@ "heading": { "bold": true, "prefix": "\n", + "margin": 2, "background_color": "57", "color": "3" }, From 85ef3db3846c4858fea24564f2ccd06ac07b0e3b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 5 Dec 2019 10:05:59 +0100 Subject: [PATCH 095/911] Added enumeration style to default dark theme --- statik/statik.go | 2 +- styles/dark.json | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/statik/statik.go b/statik/statik.go index 862dfec..b7327eb 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xa5E\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\x96\xc3\xe8]\x94\x92]j\xeb0\x10\x85\xdf\xbd\x8aAO\xf7B\x0b\x89\xe3\xd0\xe2\x1dt\x0dm \xb24\xb1\x85\xf5c\xc62\x84\x96@\xd7\xd2\xa5u%\xc5\x8dm\xd9u\"\xe8\xa3\x8e\xce\x9co4\xa3\xf7\x04\x80I':\x83\xd6\xb3\x1c\xfa3\x00SV^\xce\xd9\xddE(\xb8\xa8Kr\x9d\x95\x07\xe1\xb4#\x96\x03Kw\x19\x1b\xae\x1b\xc2\xa3:\xf5\xe2\x8b\x1d\xb5\xb6;\x06-\x018\xf7:\xd3\xca\xd6\x813em\xd3\xddX\xd7Y\x89\xa4\x95E\x96\x83\xa7\x0eW\x88\x7fk\xc2\xff%\xe0\xe0\xf1\xe4\xe3\x94\xc2i9\x00\xa6Rex\x89\xf1\xb2\xd0\xc5\xf3S\xef\xcea\xdd\xcc+[&\xde\xea\xe61\xf8*\xe4R\xd92\x98f\xedEFl8\x95\xca\xb2\x1c\xd2\xc8\x9a\xf6\x0f\xa3}\x92v\x81\xecy\xa1go\x9e\x12\xb3\xc9\xd1p\xe2%\xf1\xa6\xba\xe6\x8aq\xb3\x15w\xbb\x0f`\xe1\xe4\xb5Y\xa7\x9b\xcd\xd2s(\xb4\x13u\x84\xbd(\x1d4_\xa1\xe9\xd3Y\xeb4'\xf5\x86\xf2^r\xaaC2\x9a\xf9{\x94\xe7Z\x89\xdf\xdf\xa1\xf5\xe4n\xecd\xf6\xdbZ\xff\xd7\xb9\xa4\xd1\xb9(\x8f&$\x86\xad\x7f}|\xc2\x8f+9'\xdf\x01\x00\x00\xff\xffPK\x07\x08b\xafW\x18,\x01\x00\x00\xb6\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xa5E\x85Ob\xafW\x18,\x01\x00\x00\xb6\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\x96\xc3\xe8]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81l\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\x8c\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00BH\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\x8d\xc7\xe8]\x94\x92]j\xeb0\x10\x85\xdf\xbd\n\xa1\xa7{\xa1-\x89\xe3\xd0\xe2\x1dt\x0dm ck\xe2\x0c\xd6O\x18K\x10Z\x02]K\x97\xd6\x95\x14\x93\xc4\xb2\xebD\xd0G\x1d\x9d9\xdfhF\x1f\x99\x10R\xb9:\x18\xb4^\x96\xa2?\x0b!\xc9\xaa\xd3\xb9\xb8; \x15\xd4m\xc3.X\xb5\xa9\x9dv,K!\xf3U!\xcf\xd7{\xc6-\x1dz\xf1\xd5^\xb4.l\xa3\x96 q\xecu\xa9\xc9\xb6\x913d-\xf3\xd5\xa5.X\x85\xac\xc9\xa2,\x85\xe7\x803\xc4\xbf9\xe1\xff\x14\xb0\xf1x\xf0iJ\xe5\xb4:\x03\x86R2\xd0`\xba,v\xf1\xf2\xdc\xbbK1o\xe6MN\x13ou\xf3\x14};\x04E\xb6\x89\xa6Q{\x89\x11\x1b\xe0\x86\xac,E\x9eX\xd3\xfa\xf1b\x1f\xa4U${\xa8\xf4\xe8\xcdCb18\xf6\xc0\xd00\xecw\xd7\\)n1\xe3.\xd7\x11\\;um\xd6\xf9b1\xf5l*\xed\xea6\xc1\x9e\x94\x9e5\xbfC\xd3\xa7\xcb\xcei`zGu\xaf\x80\xdb\x98\x8cf\xfc\x1e\xf2\xa0\xa9\xfe\xfd\x1d:\xcf\xee\xc6NF\xbf\xad\xf3\x7f\x9dK\x9e\x9c\x0by411n\xfd\xfb\xf3K\x8c\xfa\xb7\xc1 \x83'g\xaf\x99\x1fN\xd6\xec\x98\xfd\x04\x00\x00\xff\xffPK\x07\x080B$\x867\x01\x00\x00\xe1\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00BH\x85O0B$\x867\x01\x00\x00\xe1\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\x8d\xc7\xe8]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\x97\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index d0e14e5..693d7a0 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -59,5 +59,8 @@ }, "item": { "prefix": "• " + }, + "enumeration": { + "prefix": ". " } } From c89ab1c3cbc40246a5405278ae4fa3db30931691 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 5 Dec 2019 14:09:04 +0100 Subject: [PATCH 096/911] Update default dark style --- statik/statik.go | 2 +- styles/dark.json | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/statik/statik.go b/statik/statik.go index b7327eb..101885f 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00BH\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\x8d\xc7\xe8]\x94\x92]j\xeb0\x10\x85\xdf\xbd\n\xa1\xa7{\xa1-\x89\xe3\xd0\xe2\x1dt\x0dm ck\xe2\x0c\xd6O\x18K\x10Z\x02]K\x97\xd6\x95\x14\x93\xc4\xb2\xebD\xd0G\x1d\x9d9\xdfhF\x1f\x99\x10R\xb9:\x18\xb4^\x96\xa2?\x0b!\xc9\xaa\xd3\xb9\xb8; \x15\xd4m\xc3.X\xb5\xa9\x9dv,K!\xf3U!\xcf\xd7{\xc6-\x1dz\xf1\xd5^\xb4.l\xa3\x96 q\xecu\xa9\xc9\xb6\x913d-\xf3\xd5\xa5.X\x85\xac\xc9\xa2,\x85\xe7\x803\xc4\xbf9\xe1\xff\x14\xb0\xf1x\xf0iJ\xe5\xb4:\x03\x86R2\xd0`\xba,v\xf1\xf2\xdc\xbbK1o\xe6MN\x13ou\xf3\x14};\x04E\xb6\x89\xa6Q{\x89\x11\x1b\xe0\x86\xac,E\x9eX\xd3\xfa\xf1b\x1f\xa4U${\xa8\xf4\xe8\xcdCb18\xf6\xc0\xd00\xecw\xd7\\)n1\xe3.\xd7\x11\\;um\xd6\xf9b1\xf5l*\xed\xea6\xc1\x9e\x94\x9e5\xbfC\xd3\xa7\xcb\xcei`zGu\xaf\x80\xdb\x98\x8cf\xfc\x1e\xf2\xa0\xa9\xfe\xfd\x1d:\xcf\xee\xc6NF\xbf\xad\xf3\x7f\x9dK\x9e\x9c\x0by411n\xfd\xfb\xf3K\x8c\xfa\xb7\xc1 \x83'g\xaf\x99\x1fN\xd6\xec\x98\xfd\x04\x00\x00\xff\xffPK\x07\x080B$\x867\x01\x00\x00\xe1\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00BH\x85O0B$\x867\x01\x00\x00\xe1\x03\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\x8d\xc7\xe8]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\x97\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\x06i\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01<\x01\xe9]\x94R]N\xf30\x10|\xcf),\x7f/\x1f\x12\xa0\xd6m\xf9\xc9\x0d8\x03\xa0\xca\x89\xb7\xe9*\xfe\xa9\x1c[\xaa@\x958\x0bG\xe3$(jk;\xc4\x8d\xe0\xd1\x9b\xd9\x99\xc9\xcc\xbe\x17\x84Paj\xaf@;Z\x92\xfeM\x08E-\x8e\xef\xe5\xf5qP\xf1\xbam\xac\xf1Z\xack#\x8d\xa5%\xa1\xff\xd8\x86-\x16+z\x82\xec,lp\xdf\x7fx\xd1\xe7Y\xe77qV\x10r\xe8\xe7T\xa2n\xa3V\xe0\x9b\xb3\xc5y\xcfk\x01V\xa2\x06Z\x12g=\x8c$\xfe\x8f\x15\xae\x86\x02k\x07{7\xadR\x19)N\x02a\x15\x15o`z-\xbax~\xea\xd1%\x19\x9by\xa5C\xc6Kn\x1e\"n\x0b\\\xa0n\"(\x17\xa8\xe2\xb6A\x9d\x14\x13\x0d\x86\"r]\xad\xee\x13\xa1y\xd4\x08|l\x9c\xc9\x04\xdd\xddcB\xc7.X\x0e\x08\xc7+ \x19\xcde@\xec\xb8\xe5\x8d\xe5\xbbm\x0e\xf5\xfb\x13L\xc3\x08\xdc\xb5\x11\xb9B\xd9l6\xc4\xac+i\xeav\xc2\xc0`\xf54s[P=;\xed\x8c\xe4\x16\xdf@\xdc\x08n\xdb\xc8\x0c*\xfd)t\\b\xfd\xf3\xe6:gMZ|\xee.%v\xee\x8f\xe1\xac\xd8d.\xe8@\xe5\x9a\xfb\xfa\xf8$\x89\x7f\xed\x15X\xee\xd0\xe8\x1c\xf8\xf6\x08-\x0e\xc5w\x00\x00\x00\xff\xffPK\x07\x08@\xda\x19uH\x01\x00\x00J\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x06i\x85O@\xda\x19uH\x01\x00\x00J\x04\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01<\x01\xe9]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x88\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\xa8\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index 693d7a0..a6ce326 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -1,7 +1,7 @@ { "document": { "indent": 4, - "background_color": "234", + "background_color": "#2f2335", "prefix": "\n", "suffix": "\n" }, @@ -24,18 +24,25 @@ "color": "8" }, "heading": { - "bold": true, "prefix": "\n", + "margin": 4, + "color": "15", + "background_color": "57" + }, + "h1": { "margin": 2, - "background_color": "57", - "color": "3" + "bold": true, + "background_color": "69" + }, + "h2": { + "prefix": "\n" }, "table": { "margin": 4 }, "paragraph": { "margin": 4, - "background_color": "54", + "background_color": "#2f2335", "color": "15" }, "code": { From 7eaf4f27669ae6b8eac1cdb15dadffdda5cc576d Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 5 Dec 2019 20:47:12 +0100 Subject: [PATCH 097/911] Update default dark style to use colors from limited ANSI color range --- statik/statik.go | 2 +- styles/dark.json | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/statik/statik.go b/statik/statik.go index 101885f..5a57c0a 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\x06i\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01<\x01\xe9]\x94R]N\xf30\x10|\xcf),\x7f/\x1f\x12\xa0\xd6m\xf9\xc9\x0d8\x03\xa0\xca\x89\xb7\xe9*\xfe\xa9\x1c[\xaa@\x958\x0bG\xe3$(jk;\xc4\x8d\xe0\xd1\x9b\xd9\x99\xc9\xcc\xbe\x17\x84Paj\xaf@;Z\x92\xfeM\x08E-\x8e\xef\xe5\xf5qP\xf1\xbam\xac\xf1Z\xack#\x8d\xa5%\xa1\xff\xd8\x86-\x16+z\x82\xec,lp\xdf\x7fx\xd1\xe7Y\xe77qV\x10r\xe8\xe7T\xa2n\xa3V\xe0\x9b\xb3\xc5y\xcfk\x01V\xa2\x06Z\x12g=\x8c$\xfe\x8f\x15\xae\x86\x02k\x07{7\xadR\x19)N\x02a\x15\x15o`z-\xbax~\xea\xd1%\x19\x9by\xa5C\xc6Kn\x1e\"n\x0b\\\xa0n\"(\x17\xa8\xe2\xb6A\x9d\x14\x13\x0d\x86\"r]\xad\xee\x13\xa1y\xd4\x08|l\x9c\xc9\x04\xdd\xddcB\xc7.X\x0e\x08\xc7+ \x19\xcde@\xec\xb8\xe5\x8d\xe5\xbbm\x0e\xf5\xfb\x13L\xc3\x08\xdc\xb5\x11\xb9B\xd9l6\xc4\xac+i\xeav\xc2\xc0`\xf54s[P=;\xed\x8c\xe4\x16\xdf@\xdc\x08n\xdb\xc8\x0c*\xfd)t\\b\xfd\xf3\xe6:gMZ|\xee.%v\xee\x8f\xe1\xac\xd8d.\xe8@\xe5\x9a\xfb\xfa\xf8$\x89\x7f\xed\x15X\xee\xd0\xe8\x1c\xf8\xf6\x08-\x0e\xc5w\x00\x00\x00\xff\xffPK\x07\x08@\xda\x19uH\x01\x00\x00J\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x13x\x82O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\x16'\xe5]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x06i\x85O@\xda\x19uH\x01\x00\x00J\x04\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01<\x01\xe9]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x88\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\xa8\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xd4\x9d\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xa1^\xe9]\x94\x92MN\xc30\x10\x85\xf79\x85\xe5\x15H\x80Z\xb7\xe5'7\xe0\x0c\x80*'\x9e\xa6\xa3\xf8\xa7\x9a8R\x05\xaa\xc4Y8\x1a'AQ\xdb\xd8%n(K\x8f\xdf\xbc\xef\xd93\x1f\x19c\\\xb9\xb25`=\xcfYwf\x8c\xa3U\xfb\xf3\xfcf_(dYW\xe4Z\xab\x96\xa5\xd3\x8ex\xce\xb8\x98\xcd\xf9\xe1zC\xb0\xc2mW|\xb5\xc7Z\xd3\xaeB-cl\xd7\xd5\xb9F[\x07N\xef5\x15\xb3c_k\x15\x90F\x0bH\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xd4\x9d\x85O1\x99F\xe8E\x01\x00\x00B\x04\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xa1^\xe9]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x85\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\xa5\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index a6ce326..ae5b1ba 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -1,7 +1,7 @@ { "document": { "indent": 4, - "background_color": "#2f2335", + "background_color": "234", "prefix": "\n", "suffix": "\n" }, @@ -42,8 +42,8 @@ }, "paragraph": { "margin": 4, - "background_color": "#2f2335", - "color": "15" + "color": "15", + "background_color": "235" }, "code": { "color": "200" @@ -61,8 +61,8 @@ }, "list": { "margin": 4, - "background_color": "52", - "color": "15" + "color": "15", + "background_color": "52" }, "item": { "prefix": "• " From de1e31054eb657b5b34214c24b12f0c332dc2456 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 5 Dec 2019 20:52:14 +0100 Subject: [PATCH 098/911] Use 'Camera' unicode symbol U+1F4F7 to prefix images in the default dark style --- statik/statik.go | 2 +- styles/dark.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/statik/statik.go b/statik/statik.go index 5a57c0a..a627fe0 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xd4\x9d\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xa1^\xe9]\x94\x92MN\xc30\x10\x85\xf79\x85\xe5\x15H\x80Z\xb7\xe5'7\xe0\x0c\x80*'\x9e\xa6\xa3\xf8\xa7\x9a8R\x05\xaa\xc4Y8\x1a'AQ\xdb\xd8%n(K\x8f\xdf\xbc\xef\xd93\x1f\x19c\\\xb9\xb25`=\xcfYwf\x8c\xa3U\xfb\xf3\xfcf_(dYW\xe4Z\xab\x96\xa5\xd3\x8ex\xce\xb8\x98\xcd\xf9\xe1zC\xb0\xc2mW|\xb5\xc7Z\xd3\xaeB-cl\xd7\xd5\xb9F[\x07N\xef5\x15\xb3c_k\x15\x90F\x0bH\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xd4\x9d\x85O1\x99F\xe8E\x01\x00\x00B\x04\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xa1^\xe9]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x85\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\xa5\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00b\x9e\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xa9_\xe9]\x94\x92[N\xf30\x10\x85\xdf\xb3\n\xcbO\xff/\x01j\xdd\x96K\xb6\x02\xa8r\xe2ij\xc5\x97jbK\x15\xa8\x12{`\x01Hl\x82\xfd\xb0\x02\x96\x80\xa2\xb6\xb1C\xdcP\x1e=>s\xbec\xcfH\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00b\x9e\x85O\x9c\x1c\x8fgL\x01\x00\x00A\x04\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xa9_\xe9]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\xac\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index ae5b1ba..4c89a83 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -17,7 +17,7 @@ }, "image": { "color": "123", - "prefix": "[Image: ", + "prefix": "[📷: ", "suffix": "]" }, "image_text": { From 73b8ffc5392969eb9e2c7dcc90c4d7779cc27374 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 5 Dec 2019 21:07:12 +0100 Subject: [PATCH 099/911] Remove colon from image prefix --- statik/statik.go | 2 +- styles/dark.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/statik/statik.go b/statik/statik.go index a627fe0..a850549 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00b\x9e\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xa9_\xe9]\x94\x92[N\xf30\x10\x85\xdf\xb3\n\xcbO\xff/\x01j\xdd\x96K\xb6\x02\xa8r\xe2ij\xc5\x97jbK\x15\xa8\x12{`\x01Hl\x82\xfd\xb0\x02\x96\x80\xa2\xb6\xb1C\xdcP\x1e=>s\xbec\xcfH\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00b\x9e\x85O\x9c\x1c\x8fgL\x01\x00\x00A\x04\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xa9_\xe9]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\xac\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xd6\xa0\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01Uc\xe9]\x94\x92[N\xf30\x10\x85\xdf\xb3\n\xcbO\xff/\x01j\xdd\x96K\xb7\x02\xa8r\xe2i:\x8a/\xd5\xc4\x91*P%\xf6\xc0\x02\x90\xd8\x04\xfba\x05,\x01Emc\x97\xb8\xa1H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xd6\xa0\x85ONo\xe2yK\x01\x00\x00@\x04\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01Uc\xe9]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8b\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\xab\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index 4c89a83..0ca03ac 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -17,7 +17,7 @@ }, "image": { "color": "123", - "prefix": "[📷: ", + "prefix": "[📷 ", "suffix": "]" }, "image_text": { From 27e0e0878af7afe988df1792610852272d02c45b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 6 Dec 2019 00:25:03 +0100 Subject: [PATCH 100/911] Add prefix & suffix for headings in default dark style --- statik/statik.go | 2 +- styles/dark.json | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/statik/statik.go b/statik/statik.go index a850549..057cef7 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xd6\xa0\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01Uc\xe9]\x94\x92[N\xf30\x10\x85\xdf\xb3\n\xcbO\xff/\x01j\xdd\x96K\xb7\x02\xa8r\xe2i:\x8a/\xd5\xc4\x91*P%\xf6\xc0\x02\x90\xd8\x04\xfba\x05,\x01Emc\x97\xb8\xa1H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xd6\xa0\x85ONo\xe2yK\x01\x00\x00@\x04\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01Uc\xe9]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8b\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\xab\x02\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xce\xba\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x015\x91\xe9]\x94\x92[N\xeb0\x10\x86\xdf\xb3\n\xcb\xe7\xe5 \x01j\xdd\x96KE\xd9\x08\xa0\xca\x89\xa7\xa9\x15_\xaa\x89-U\xa0J\xec\x81\x05 \xb1 \xf6\xc3\nX\x02\x8az\xb1CL(\x8f\xfe\xfd\xcf|s{\xca\x08\xa1\xc2\x16^\x83qtJ\x9a7!T\x1a\xb1}\x8fO\xb7B\xce\x8b\xaaD\xeb\x8d\x98\x17VY\xa4SB\xd9hLw\xdf+\x84\x85\\7\xe2\xbd\xd9k\xb5_\x04-#d\xd3\xe8TIS\x05\xce!\xd7\x90\x8d\xf6q\xde\x08@%\x0d\xd0)q\xe8\xa1\x83\xf8\xdf%\x9c\xb4\x01s\x07k\xd7O\xc9\xad\x12;\xc0!Tj^B\x7fX\xa8\xe2\xee\xf3\xf5\xe5\x9dtKy\xa0\xed|?\xd5r\x15|K\xe0B\x9a2\x98R\xe3\xd4\x1cKi\xa2\x95\x84\xf2&\xb4gK\x93\xcb\x084L3f\xb7\x89F\xc8\xcd\xac\xc3f\xdd\xe9\xf5\xa0/\xae#4K\xa3\xff\x91\xe0qH\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xce\xba\x85O\x9e\x12\xa9mU\x01\x00\x00n\x04\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x015\x91\xe9]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x95\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\xb5\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/dark.json b/styles/dark.json index 0ca03ac..492d538 100644 --- a/styles/dark.json +++ b/styles/dark.json @@ -30,12 +30,14 @@ "background_color": "57" }, "h1": { + "prefix": "\n=> ", + "suffix": " <=", "margin": 2, "bold": true, "background_color": "69" }, "h2": { - "prefix": "\n" + "prefix": "\n# " }, "table": { "margin": 4 From 292f06052f456c02f369c96ceb935aff223d766b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 6 Dec 2019 01:34:22 +0100 Subject: [PATCH 101/911] Embed styles in gold library --- README.md | 15 ++-------- gallery.sh | 14 --------- main.go | 30 +------------------ statik/statik.go | 12 -------- styles/README.md | 13 -------- styles/dark.json | 75 ---------------------------------------------- styles/dark.png | Bin 75716 -> 0 bytes styles/light.json | 40 ------------------------- styles/light.png | Bin 75889 -> 0 bytes 9 files changed, 3 insertions(+), 196 deletions(-) delete mode 100755 gallery.sh delete mode 100644 statik/statik.go delete mode 100644 styles/README.md delete mode 100644 styles/dark.json delete mode 100644 styles/dark.png delete mode 100644 styles/light.json delete mode 100644 styles/light.png diff --git a/README.md b/README.md index af0f65a..c1e6859 100644 --- a/README.md +++ b/README.md @@ -36,21 +36,10 @@ You can supply a JSON stylesheet with the `-s` flag: ## Example Output -![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/dark.png) +![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/styles/dark.png) -Check out the [Gold Style Gallery](https://github.com/charmbracelet/gold/blob/master/cmd/gold/styles/README.md)! +Check out the [Gold Style Gallery](https://github.com/charmbracelet/gold/blob/master/styles/README.md)! ## Colors Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logrusorgru/aurora#Index). - -## Development - -Style definitions located in `styles/` can be embedded into the binary by -running [statik](https://github.com/rakyll/statik): -``` -statik -f -src styles -include "*.json" -``` - -You can re-generate screenshots of all available styles by running `gallery.sh`. -This requires `termshot` and `pngcrush` installed on your system! diff --git a/gallery.sh b/gallery.sh deleted file mode 100755 index 1b84afc..0000000 --- a/gallery.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -for style in ./styles/*.json; do - echo "Generating screenshot for ${style}" - filename="`basename -s .json ${style}`.png" - - light="" - if [[ $style == *"light"* ]]; then - light="-l" - fi - - ./termshot ${light} -o ./styles/ -f "$filename" ./gold -s ${style} - pngcrush -ow "./styles/$filename" -done diff --git a/main.go b/main.go index 17de092..1c1fb7f 100644 --- a/main.go +++ b/main.go @@ -11,11 +11,9 @@ import ( "path/filepath" "github.com/mattn/go-isatty" - "github.com/rakyll/statik/fs" "github.com/spf13/cobra" "github.com/charmbracelet/gold" - _ "github.com/charmbracelet/gold/cmd/gold/statik" ) var ( @@ -92,27 +90,6 @@ func readerFromArg(s string) (*Source, error) { return &Source{r, u}, err } -func loadStyle(f string) ([]byte, error) { - var r io.ReadCloser - var err error - - r, err = os.Open(f) - if err != nil { - statikFS, err := fs.New() - if err != nil { - return nil, err - } - - r, err = statikFS.Open("/" + f + ".json") - if err != nil { - return nil, err - } - } - - defer r.Close() - return ioutil.ReadAll(r) -} - func execute(cmd *cobra.Command, args []string) error { var arg string if len(args) > 0 { @@ -127,12 +104,7 @@ func execute(cmd *cobra.Command, args []string) error { r := gold.NewPlainTermRenderer() if isatty.IsTerminal(os.Stdout.Fd()) { - json, err := loadStyle(style) - if err != nil { - return err - } - - r, err = gold.NewTermRendererFromBytes(json) + r, err = gold.NewTermRenderer(style) if err != nil { return err } diff --git a/statik/statik.go b/statik/statik.go deleted file mode 100644 index 057cef7..0000000 --- a/statik/statik.go +++ /dev/null @@ -1,12 +0,0 @@ -// Code generated by statik. DO NOT EDIT. - -package statik - -import ( - "github.com/rakyll/statik/fs" -) - -func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xce\xba\x85O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x015\x91\xe9]\x94\x92[N\xeb0\x10\x86\xdf\xb3\n\xcb\xe7\xe5 \x01j\xdd\x96KE\xd9\x08\xa0\xca\x89\xa7\xa9\x15_\xaa\x89-U\xa0J\xec\x81\x05 \xb1 \xf6\xc3\nX\x02\x8az\xb1CL(\x8f\xfe\xfd\xcf|s{\xca\x08\xa1\xc2\x16^\x83qtJ\x9a7!T\x1a\xb1}\x8fO\xb7B\xce\x8b\xaaD\xeb\x8d\x98\x17VY\xa4SB\xd9hLw\xdf+\x84\x85\\7\xe2\xbd\xd9k\xb5_\x04-#d\xd3\xe8TIS\x05\xce!\xd7\x90\x8d\xf6q\xde\x08@%\x0d\xd0)q\xe8\xa1\x83\xf8\xdf%\x9c\xb4\x01s\x07k\xd7O\xc9\xad\x12;\xc0!Tj^B\x7fX\xa8\xe2\xee\xf3\xf5\xe5\x9dtKy\xa0\xed|?\xd5r\x15|K\xe0B\x9a2\x98R\xe3\xd4\x1cKi\xa2\x95\x84\xf2&\xb4gK\x93\xcb\x084L3f\xb7\x89F\xc8\xcd\xac\xc3f\xdd\xe9\xf5\xa0/\xae#4K\xa3\xff\x91\xe0qH\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xce\xba\x85O\x9e\x12\xa9mU\x01\x00\x00n\x04\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x015\x91\xe9]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x13x\x82O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x95\x01\x00\x00light.jsonUT\x05\x00\x01\x16'\xe5]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x00\xb5\x02\x00\x00\x00\x00" - fs.Register(data) -} diff --git a/styles/README.md b/styles/README.md deleted file mode 100644 index 97b746b..0000000 --- a/styles/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Gold Styles Gallery - -## Dark - -`gold -s dark` - -![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/dark.png) - -## Light - -`gold -s light` - -![Gold Light Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/light.png) diff --git a/styles/dark.json b/styles/dark.json deleted file mode 100644 index 492d538..0000000 --- a/styles/dark.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "document": { - "indent": 4, - "background_color": "234", - "prefix": "\n", - "suffix": "\n" - }, - "link": { - "color": "123", - "underline": true, - "prefix": "(", - "suffix": ")" - }, - "link_text": { - "color": "123", - "bold": true - }, - "image": { - "color": "123", - "prefix": "[📷 ", - "suffix": "]" - }, - "image_text": { - "color": "8" - }, - "heading": { - "prefix": "\n", - "margin": 4, - "color": "15", - "background_color": "57" - }, - "h1": { - "prefix": "\n=> ", - "suffix": " <=", - "margin": 2, - "bold": true, - "background_color": "69" - }, - "h2": { - "prefix": "\n# " - }, - "table": { - "margin": 4 - }, - "paragraph": { - "margin": 4, - "color": "15", - "background_color": "235" - }, - "code": { - "color": "200" - }, - "code_block": { - "margin": 4, - "color": "200", - "theme": "solarized-dark" - }, - "emph": { - "italic": true - }, - "strong": { - "bold": true - }, - "list": { - "margin": 4, - "color": "15", - "background_color": "52" - }, - "item": { - "prefix": "• " - }, - "enumeration": { - "prefix": ". " - } -} diff --git a/styles/dark.png b/styles/dark.png deleted file mode 100644 index aee870664c6158d2d9f601731267f078a5721da7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75716 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
Cz6b%U~$MF$BVfJcYl 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 Date: Fri, 6 Dec 2019 18:10:51 +0100 Subject: [PATCH 102/911] Return potential error from ioutil.ReadAll --- main.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 1c1fb7f..26e03d0 100644 --- a/main.go +++ b/main.go @@ -100,7 +100,10 @@ func execute(cmd *cobra.Command, args []string) error { return err } defer src.reader.Close() - b, _ := ioutil.ReadAll(src.reader) + b, err := ioutil.ReadAll(src.reader) + if err != nil { + return err + } r := gold.NewPlainTermRenderer() if isatty.IsTerminal(os.Stdout.Fd()) { From 95670866e0962a0c8772c652f115ae4f9e69587b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 6 Dec 2019 18:44:58 +0100 Subject: [PATCH 103/911] When passed a directory as cli-arg, find a README[.md] in it --- main.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 26e03d0..6e59fb1 100644 --- a/main.go +++ b/main.go @@ -73,9 +73,10 @@ func readerFromArg(s string) (*Source, error) { } } - if len(s) == 0 { + st, _ := os.Stat(s) + if len(s) == 0 || st.IsDir() { for _, v := range readmeNames { - r, err := os.Open(v) + r, err := os.Open(filepath.Join(s, v)) if err == nil { u, _ := filepath.Abs(v) return &Source{r, u}, nil From de91f6ae537ca40676046b9e5591ef8d6c05838d Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 6 Dec 2019 19:22:34 +0100 Subject: [PATCH 104/911] Automatically use the notty style when stdout is no terminal If the user provided a style flag, this still takes precedence. --- main.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/main.go b/main.go index 6e59fb1..2b8c8a2 100644 --- a/main.go +++ b/main.go @@ -106,12 +106,13 @@ func execute(cmd *cobra.Command, args []string) error { return err } - r := gold.NewPlainTermRenderer() - if isatty.IsTerminal(os.Stdout.Fd()) { - r, err = gold.NewTermRenderer(style) - if err != nil { - return err - } + if !isatty.IsTerminal(os.Stdout.Fd()) && + !cmd.Flags().Changed("style") { + style = "notty" + } + r, err := gold.NewTermRenderer(style) + if err != nil { + return err } r.WordWrap = int(width) From 8c59f7c51d4b595c52584c0f76b16928da620268 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 7 Dec 2019 05:08:51 +0100 Subject: [PATCH 105/911] Move gallery and images to styles/gallery/ --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c1e6859..f429abc 100644 --- a/README.md +++ b/README.md @@ -36,9 +36,9 @@ You can supply a JSON stylesheet with the `-s` flag: ## Example Output -![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/styles/dark.png) +![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/styles/gallery/dark.png) -Check out the [Gold Style Gallery](https://github.com/charmbracelet/gold/blob/master/styles/README.md)! +Check out the [Gold Style Gallery](https://github.com/charmbracelet/gold/blob/master/styles/gallery/README.md)! ## Colors From 58c97dc8dbfb7d05fdacbf3ef528499be672d350 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 7 Dec 2019 08:31:15 +0100 Subject: [PATCH 106/911] Check for err before trying to access the stat struct --- main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 2b8c8a2..5de6667 100644 --- a/main.go +++ b/main.go @@ -73,8 +73,8 @@ func readerFromArg(s string) (*Source, error) { } } - st, _ := os.Stat(s) - if len(s) == 0 || st.IsDir() { + st, err := os.Stat(s) + if len(s) == 0 || (err == nil && st.IsDir()) { for _, v := range readmeNames { r, err := os.Open(filepath.Join(s, v)) if err == nil { From c31c06a79319a0b0ded09d6ada3975462e38ea67 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 7 Dec 2019 19:49:24 +0100 Subject: [PATCH 107/911] Calculate block width from BlockStack & RenderContext --- main.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/main.go b/main.go index 5de6667..a02f017 100644 --- a/main.go +++ b/main.go @@ -110,18 +110,19 @@ func execute(cmd *cobra.Command, args []string) error { !cmd.Flags().Changed("style") { style = "notty" } - r, err := gold.NewTermRenderer(style) - if err != nil { - return err - } - r.WordWrap = int(width) u, err := url.ParseRequestURI(src.URL) if err == nil { u.Path = filepath.Dir(u.Path) - r.BaseURL = u.String() + "/" } + r, err := gold.NewTermRenderer(style, gold.Options{ + BaseURL: u.String() + "/", + WordWrap: int(width), + }) + if err != nil { + return err + } out := r.RenderBytes(b) fmt.Printf("%s", string(out)) return nil From 2bae07eac9f4adb212c39845c11ea8ff9528e3a7 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 9 Dec 2019 13:50:17 +0100 Subject: [PATCH 108/911] Enable version command for release builds --- main.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index a02f017..43330a0 100644 --- a/main.go +++ b/main.go @@ -17,7 +17,12 @@ import ( ) var ( + Version = "" + CommitSHA = "" + readmeNames = []string{"README.md", "README"} + style string + width uint rootCmd = &cobra.Command{ Use: "gold SOURCE", @@ -26,9 +31,6 @@ var ( SilenceUsage: false, RunE: execute, } - - style string - width uint ) type Source struct { @@ -135,6 +137,15 @@ func main() { } func init() { + if CommitSHA != "" { + vt := rootCmd.VersionTemplate() + rootCmd.SetVersionTemplate(vt[:len(vt)-1] + " (" + CommitSHA + ")\n") + } + if Version == "" { + Version = "unknown (built from source)" + } + rootCmd.Version = Version + rootCmd.Flags().StringVarP(&style, "style", "s", "dark", "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 100, "word-wrap at width") } From ee81103ce04a4d15b2f1c6371d9dd98ceadbdf2c Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 9 Dec 2019 14:01:47 +0100 Subject: [PATCH 109/911] Shorten commit SHA in version output --- main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 43330a0..e389dee 100644 --- a/main.go +++ b/main.go @@ -137,9 +137,9 @@ func main() { } func init() { - if CommitSHA != "" { + if len(CommitSHA) >= 7 { vt := rootCmd.VersionTemplate() - rootCmd.SetVersionTemplate(vt[:len(vt)-1] + " (" + CommitSHA + ")\n") + rootCmd.SetVersionTemplate(vt[:len(vt)-1] + " (" + CommitSHA[0:7] + ")\n") } if Version == "" { Version = "unknown (built from source)" From 584adfdbd1d1f95c1b5ec0cc5385defde52cfbea Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 10 Dec 2019 15:55:49 +0100 Subject: [PATCH 110/911] Fix baseURL for relative paths --- main.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index e389dee..447caa4 100644 --- a/main.go +++ b/main.go @@ -78,9 +78,10 @@ func readerFromArg(s string) (*Source, error) { st, err := os.Stat(s) if len(s) == 0 || (err == nil && st.IsDir()) { for _, v := range readmeNames { - r, err := os.Open(filepath.Join(s, v)) + n := filepath.Join(s, v) + r, err := os.Open(n) if err == nil { - u, _ := filepath.Abs(v) + u, _ := filepath.Abs(n) return &Source{r, u}, nil } } From 68a2909669fdccfdac99f799f47a11d7fc96b37f Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 10 Dec 2019 17:18:59 +0100 Subject: [PATCH 111/911] Add godoc comments to public types --- main.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/main.go b/main.go index 447caa4..1544e88 100644 --- a/main.go +++ b/main.go @@ -43,6 +43,7 @@ func readerFromArg(s string) (*Source, error) { return &Source{reader: os.Stdin}, nil } + // a GitHub or GitLab URL (even without the protocol): if u, ok := isGitHubURL(s); ok { src, err := findGitHubREADME(u) if err != nil { @@ -58,6 +59,7 @@ func readerFromArg(s string) (*Source, error) { return src, nil } + // HTTP(S) URLs: if u, err := url.ParseRequestURI(s); err == nil { if u.Scheme != "" { if u.Scheme != "http" && u.Scheme != "https" { @@ -75,6 +77,7 @@ func readerFromArg(s string) (*Source, error) { } } + // a valid file or directory: st, err := os.Stat(s) if len(s) == 0 || (err == nil && st.IsDir()) { for _, v := range readmeNames { @@ -99,6 +102,8 @@ func execute(cmd *cobra.Command, args []string) error { if len(args) > 0 { arg = args[0] } + + // create an io.Reader from the markdown source in cli-args src, err := readerFromArg(arg) if err != nil { return err @@ -109,6 +114,8 @@ func execute(cmd *cobra.Command, args []string) error { return err } + // We want to use a special no-TTY style, when stdout is not a terminal + // and there was no specific style passed by arg if !isatty.IsTerminal(os.Stdout.Fd()) && !cmd.Flags().Changed("style") { style = "notty" From 73d1d5d06126316c4d14b395b60e0a5d8ccc37df Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 13 Dec 2019 03:25:02 +0100 Subject: [PATCH 112/911] Document -w flag in README --- README.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f429abc..6543274 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Render markdown on the CLI, with _pizzazz_! ## Usage -Use a markdown source as the argument: +Use a markdown source as the primary argument: Read from file: ``` @@ -29,7 +29,23 @@ Fetch markdown from an HTTP source: When `gold` is started without any markdown source, it will try to find a `README.md` or `README` file in the current working directory. -You can supply a JSON stylesheet with the `-s` flag: +### Flags + +#### Word Wrapping + +The `-w` flag lets you set a maximum width, at which the output will be wrapped: +``` +./gold -w 60 +``` + +#### Styles + +You can choose a style with the `-s` flag (`dark` being the default): +``` +./gold -s [dark|light] +``` + +Alternatively you can also supply a custom JSON stylesheet: ``` ./gold -s mystyle.json ``` From 62eaf39a4f51e7e106288c0dfe7454356ffd4ad2 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 13 Dec 2019 03:29:52 +0100 Subject: [PATCH 113/911] Link to gallery from related Styles paragraph --- README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 6543274..744df10 100644 --- a/README.md +++ b/README.md @@ -29,16 +29,14 @@ Fetch markdown from an HTTP source: When `gold` is started without any markdown source, it will try to find a `README.md` or `README` file in the current working directory. -### Flags - -#### Word Wrapping +### Word Wrapping The `-w` flag lets you set a maximum width, at which the output will be wrapped: ``` ./gold -w 60 ``` -#### Styles +### Styles You can choose a style with the `-s` flag (`dark` being the default): ``` @@ -50,12 +48,13 @@ Alternatively you can also supply a custom JSON stylesheet: ./gold -s mystyle.json ``` +Check out the [Gold Style Gallery](https://github.com/charmbracelet/gold/blob/master/styles/gallery/README.md) +to find more available styles! + ## Example Output ![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/styles/gallery/dark.png) -Check out the [Gold Style Gallery](https://github.com/charmbracelet/gold/blob/master/styles/gallery/README.md)! - ## Colors Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logrusorgru/aurora#Index). From 95b99c9f72cc7400d4ec455849c1d97e99934ebd Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 13 Dec 2019 20:36:25 +0100 Subject: [PATCH 114/911] Lint/fix READMEs --- README.md | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 744df10..7357c2b 100644 --- a/README.md +++ b/README.md @@ -7,23 +7,27 @@ Render markdown on the CLI, with _pizzazz_! Use a markdown source as the primary argument: Read from file: -``` -./gold README.md + +```console +gold README.md ``` Read from stdin: -``` -./gold - + +```console +gold - ``` Fetch README from GitHub: -``` -./gold github.com/charmbracelet/gold + +```console +gold github.com/charmbracelet/gold ``` Fetch markdown from an HTTP source: -``` -./gold https://host.tld/file.md + +```console +gold https://host.tld/file.md ``` When `gold` is started without any markdown source, it will try to find a @@ -32,20 +36,23 @@ When `gold` is started without any markdown source, it will try to find a ### Word Wrapping The `-w` flag lets you set a maximum width, at which the output will be wrapped: -``` -./gold -w 60 + +```console +gold -w 60 ``` ### Styles You can choose a style with the `-s` flag (`dark` being the default): -``` -./gold -s [dark|light] + +```console +gold -s [dark|light] ``` Alternatively you can also supply a custom JSON stylesheet: -``` -./gold -s mystyle.json + +```console +gold -s mystyle.json ``` Check out the [Gold Style Gallery](https://github.com/charmbracelet/gold/blob/master/styles/gallery/README.md) From 1ffe6fe2cce2da3cfef0d1bd62a578f23c7ff604 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 13 Dec 2019 20:44:32 +0100 Subject: [PATCH 115/911] Compacter usage instructions --- README.md | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 7357c2b..0b2acab 100644 --- a/README.md +++ b/README.md @@ -6,27 +6,17 @@ Render markdown on the CLI, with _pizzazz_! Use a markdown source as the primary argument: -Read from file: - ```console +# Read from file gold README.md -``` -Read from stdin: - -```console +# Read from stdin gold - -``` -Fetch README from GitHub: - -```console +# Fetch README from GitHub gold github.com/charmbracelet/gold -``` -Fetch markdown from an HTTP source: - -```console +# Fetch markdown from an HTTP source gold https://host.tld/file.md ``` From 0058cd2abaa471379877849740bb9dd0430d21ed Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 13 Dec 2019 20:45:25 +0100 Subject: [PATCH 116/911] Fix GitHub markdown styling weirdness --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b2acab..d7a378c 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ gold - # Fetch README from GitHub gold github.com/charmbracelet/gold -# Fetch markdown from an HTTP source +# Fetch markdown from HTTP gold https://host.tld/file.md ``` From 3ddece16e4f9561768fe26eb43b052ca80f20004 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 13 Dec 2019 22:36:55 +0100 Subject: [PATCH 117/911] Don't panic, forward the error to the caller --- main.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 1544e88..c4e0060 100644 --- a/main.go +++ b/main.go @@ -133,9 +133,10 @@ func execute(cmd *cobra.Command, args []string) error { if err != nil { return err } - out := r.RenderBytes(b) + + out, err := r.RenderBytes(b) fmt.Printf("%s", string(out)) - return nil + return err } func main() { From cbf61974bfef49445a699f9933f7a4783a7ef9ea Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 14 Dec 2019 00:11:29 +0100 Subject: [PATCH 118/911] Move ANSIRenderer into a separate package --- main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index c4e0060..7855c2e 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,7 @@ import ( "github.com/spf13/cobra" "github.com/charmbracelet/gold" + "github.com/charmbracelet/gold/ansi" ) var ( @@ -126,7 +127,7 @@ func execute(cmd *cobra.Command, args []string) error { u.Path = filepath.Dir(u.Path) } - r, err := gold.NewTermRenderer(style, gold.Options{ + r, err := gold.NewTermRenderer(style, ansi.Options{ BaseURL: u.String() + "/", WordWrap: int(width), }) From 1e28b02f47fe1b46bfa788333a1ae53d2bee410f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 16 Dec 2019 06:04:55 -0500 Subject: [PATCH 119/911] A few minor edits to the README (#98) --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d7a378c..4662c0e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,13 @@ -# Gold +# Gold, the CLI Render markdown on the CLI, with _pizzazz_! +## Installation + +### Go + + go get github.com/charmbracelet/gold/cmd/gold + ## Usage Use a markdown source as the primary argument: From 3a99f221cef9292539a510cda5330392c0bd57a1 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 16 Dec 2019 18:52:10 +0100 Subject: [PATCH 120/911] Keep code-block style consistent --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4662c0e..b218ace 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,9 @@ Render markdown on the CLI, with _pizzazz_! ### Go - go get github.com/charmbracelet/gold/cmd/gold +```console +go get github.com/charmbracelet/gold/cmd/gold +``` ## Usage From 969b3d5a776fe8343383ec932c656a1e63c4e12a Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 19 Dec 2019 00:45:43 +0100 Subject: [PATCH 121/911] Add .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ad7eb89 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +gold +dist/ From 6a8462e414bc8c0df047c46da6d733a5bef9322a Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 19 Dec 2019 01:01:26 +0100 Subject: [PATCH 122/911] Import glamour --- main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 7855c2e..bda2a9f 100644 --- a/main.go +++ b/main.go @@ -13,8 +13,8 @@ import ( "github.com/mattn/go-isatty" "github.com/spf13/cobra" - "github.com/charmbracelet/gold" - "github.com/charmbracelet/gold/ansi" + "github.com/charmbracelet/glamour" + "github.com/charmbracelet/glamour/ansi" ) var ( @@ -127,7 +127,7 @@ func execute(cmd *cobra.Command, args []string) error { u.Path = filepath.Dir(u.Path) } - r, err := gold.NewTermRenderer(style, ansi.Options{ + r, err := glamour.NewTermRenderer(style, ansi.Options{ BaseURL: u.String() + "/", WordWrap: int(width), }) From 134be1de49f95635a111c16ef9abd344453399db Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 19 Dec 2019 01:01:45 +0100 Subject: [PATCH 123/911] Add Go modules --- go.mod | 9 ++++++ go.sum | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 go.mod create mode 100644 go.sum diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..091a159 --- /dev/null +++ b/go.mod @@ -0,0 +1,9 @@ +module github.com/charmbracelet/gold + +go 1.13 + +require ( + github.com/charmbracelet/glamour v0.0.0-20191219000044-557ffc6b1bfd + github.com/mattn/go-isatty v0.0.4 + github.com/spf13/cobra v0.0.5 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..386f628 --- /dev/null +++ b/go.sum @@ -0,0 +1,88 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= +github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= +github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= +github.com/alecthomas/chroma v0.7.0 h1:z+0HgTUmkpRDRz0SRSdMaqOLfJV4F+N1FPDZUZIDUzw= +github.com/alecthomas/chroma v0.7.0/go.mod h1:1U/PfCsTALWWYHDnsIQkxEBM0+6LLe0v8+RSVMOwxeY= +github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= +github.com/alecthomas/kong v0.1.17-0.20190424132513-439c674f7ae0/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= +github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= +github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MRgZdU3vrFd05IQ89AxUZ0aYdF39BYoNFa324SodPCA= +github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/charmbracelet/glamour v0.0.0-20191218235625-da0b6812c811 h1:g0Z7r3lbsO7Iuyl/EW0HJaBfdem0iP9Nm5EYgkrF1dU= +github.com/charmbracelet/glamour v0.0.0-20191218235625-da0b6812c811/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= +github.com/charmbracelet/glamour v0.0.0-20191219000044-557ffc6b1bfd h1:Re4Jmak86z6aTSyHMAAtTjaRgXMKYJmFFLfXKawLf00= +github.com/charmbracelet/glamour v0.0.0-20191219000044-557ffc6b1bfd/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= +github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= +github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dlclark/regexp2 v1.1.6 h1:CqB4MjHw0MFCDj+PHHjiESmHX+N7t0tJzKvC6M97BRg= +github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gorilla/csrf v1.6.0/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= +github.com/gorilla/handlers v1.4.1/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/logrusorgru/aurora v0.0.0-20191116043053-66b7ad493a23 h1:Wp7NjqGKGN9te9N/rvXYRhlVcrulGdxnz8zadXWs7fc= +github.com/logrusorgru/aurora v0.0.0-20191116043053-66b7ad493a23/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= +github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/muesli/reflow v0.0.0-20191216070243-e5efeac4e302 h1:jOh3Kh03uOFkRPV3PI4Am5tqACv2aELgbPgr7YgNX00= +github.com/muesli/reflow v0.0.0-20191216070243-e5efeac4e302/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= +github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rakyll/statik v0.1.6 h1:uICcfUXpgqtw2VopbIncslhAmE5hwc4g20TEyEENBNs= +github.com/rakyll/statik v0.1.6/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.16 h1:S2woQOeBdzkMSw+PPqfuVpYD+tEXhLCDtoWZcqL4jQs= +github.com/yuin/goldmark v1.1.16/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3 h1:eH6Eip3UpmR+yM/qI9Ijluzb1bNv/cAU/n+6l8tRSis= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From 29f95031eaaab5c0dd70633650bc72f65cc65129 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 19 Dec 2019 01:10:49 +0100 Subject: [PATCH 124/911] Update README after rename --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b218ace..519fff2 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,8 @@ Render markdown on the CLI, with _pizzazz_! ## Installation -### Go - ```console -go get github.com/charmbracelet/gold/cmd/gold +go get github.com/charmbracelet/gold ``` ## Usage @@ -53,12 +51,12 @@ Alternatively you can also supply a custom JSON stylesheet: gold -s mystyle.json ``` -Check out the [Gold Style Gallery](https://github.com/charmbracelet/gold/blob/master/styles/gallery/README.md) +Check out the [Glamour Style Gallery](https://github.com/charmbracelet/glamour/blob/master/styles/gallery/README.md) to find more available styles! ## Example Output -![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/styles/gallery/dark.png) +![Glamour Dark Style](https://github.com/charmbracelet/glamour/raw/master/styles/gallery/dark.png) ## Colors From f92db6bb904a043f02fb5ebfa80451546c4ac38b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 18 Dec 2019 21:26:41 -0500 Subject: [PATCH 125/911] Add example output --- example.png | Bin 0 -> 456041 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 example.png diff --git a/example.png b/example.png new file mode 100644 index 0000000000000000000000000000000000000000..54662f024d1d2337c5793c8433a3de75282b8822 GIT binary patch literal 456041 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%0DwRO!V14Dud1yb5^93zQbTxr8@%(wE%`p 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

Cds~Px{BiN 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

1>9UyY^rm+37uHa|q(EKv5>%z-ZZ&y4EJ` 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 Date: Wed, 18 Dec 2019 21:33:48 -0500 Subject: [PATCH 126/911] Add LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..beda40d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Charmbracelet, Inc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From c6aae63d786e30ab2f115f697b6cabbf36e251f1 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 18 Dec 2019 21:36:30 -0500 Subject: [PATCH 127/911] Update README --- README.md | 59 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 519fff2..2750929 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,32 @@ -# Gold, the CLI +# Gold Render markdown on the CLI, with _pizzazz_! + ## Installation -```console +Use your fave package manager: + +```bash +# MacOS +brew install gold + +# Arch Linux (btw) +pacman -S gold +``` + +Or just use `go get`: + +```bash go get github.com/charmbracelet/gold ``` + ## Usage Use a markdown source as the primary argument: -```console +```bash # Read from file gold README.md @@ -26,14 +40,14 @@ gold github.com/charmbracelet/gold gold https://host.tld/file.md ``` -When `gold` is started without any markdown source, it will try to find a +When `gold` is started without a markdown source, it will try to find a `README.md` or `README` file in the current working directory. ### Word Wrapping -The `-w` flag lets you set a maximum width, at which the output will be wrapped: +The `-w` flag lets you set a maximum width at which the output will be wrapped: -```console +```bash gold -w 60 ``` @@ -41,23 +55,42 @@ gold -w 60 You can choose a style with the `-s` flag (`dark` being the default): -```console +```bash gold -s [dark|light] ``` Alternatively you can also supply a custom JSON stylesheet: -```console +```bash gold -s mystyle.json ``` -Check out the [Glamour Style Gallery](https://github.com/charmbracelet/glamour/blob/master/styles/gallery/README.md) -to find more available styles! +Check out the [Glamour Style Section](https://github.com/charmbracelet/glamour/blob/master/styles/gallery/README.md) +to find more styles. Or [make your own](https://github.com/charmbracelet/glamour/tree/master/styles)! + +*** + +For additional usage details see: + +```bash +gold --help +``` + ## Example Output -![Glamour Dark Style](https://github.com/charmbracelet/glamour/raw/master/styles/gallery/dark.png) +![Glamour Dark Style](https://github.com/charmbracelet/gold/raw/master/example.png) -## Colors -Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logrusorgru/aurora#Index). +## Authors + +* [Christian Muehlhaeuser](https://github.com/muesli) +* [Toby Padilla](https://github.com/toby) +* [Christian Rocha](https://github.com/meowgorithm) + +Part of [Charm](https://charm.sh). For more info see: `ssh charm.sh` + + +## License + +[MIT](https://github.com/charmbracelet/gold/raw/master/LICENSE) From a9651eb3e47ac79aa8070283ec250d520cfa046d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 18 Dec 2019 21:49:29 -0500 Subject: [PATCH 128/911] Let's put the money shot at the top of the README --- README.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2750929..2047378 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ Render markdown on the CLI, with _pizzazz_! +![Glamour Dark Style](https://github.com/charmbracelet/gold/raw/master/example.png) + ## Installation @@ -77,18 +79,13 @@ gold --help ``` -## Example Output - -![Glamour Dark Style](https://github.com/charmbracelet/gold/raw/master/example.png) - - ## Authors * [Christian Muehlhaeuser](https://github.com/muesli) * [Toby Padilla](https://github.com/toby) * [Christian Rocha](https://github.com/meowgorithm) -Part of [Charm](https://charm.sh). For more info see: `ssh charm.sh` +Part of [Charm](https://charm.sh). For more info see `ssh charm.sh` ## License From 951d4072a16d29d92e6a5addda83ec39fa7f9dc6 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 20 Dec 2019 14:28:10 -0500 Subject: [PATCH 129/911] Update glamour module --- go.mod | 5 ++++- go.sum | 23 +++++++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 091a159..3e35afb 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,10 @@ module github.com/charmbracelet/gold go 1.13 require ( - github.com/charmbracelet/glamour v0.0.0-20191219000044-557ffc6b1bfd + github.com/charmbracelet/glamour v0.0.0-20191220192632-994f646a1953 + github.com/dlclark/regexp2 v1.2.0 // indirect github.com/mattn/go-isatty v0.0.4 github.com/spf13/cobra v0.0.5 + github.com/yuin/goldmark v1.1.17 // indirect + golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect ) diff --git a/go.sum b/go.sum index 386f628..c3a1f77 100644 --- a/go.sum +++ b/go.sum @@ -2,19 +2,20 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= github.com/alecthomas/chroma v0.7.0 h1:z+0HgTUmkpRDRz0SRSdMaqOLfJV4F+N1FPDZUZIDUzw= github.com/alecthomas/chroma v0.7.0/go.mod h1:1U/PfCsTALWWYHDnsIQkxEBM0+6LLe0v8+RSVMOwxeY= +github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= github.com/alecthomas/kong v0.1.17-0.20190424132513-439c674f7ae0/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MRgZdU3vrFd05IQ89AxUZ0aYdF39BYoNFa324SodPCA= +github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.0.0-20191218235625-da0b6812c811 h1:g0Z7r3lbsO7Iuyl/EW0HJaBfdem0iP9Nm5EYgkrF1dU= -github.com/charmbracelet/glamour v0.0.0-20191218235625-da0b6812c811/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= -github.com/charmbracelet/glamour v0.0.0-20191219000044-557ffc6b1bfd h1:Re4Jmak86z6aTSyHMAAtTjaRgXMKYJmFFLfXKawLf00= -github.com/charmbracelet/glamour v0.0.0-20191219000044-557ffc6b1bfd/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= +github.com/charmbracelet/glamour v0.0.0-20191220192632-994f646a1953 h1:Q937drUhU2JlhruQIMmiukd/SOfmwnUrgHfqIfju/hI= +github.com/charmbracelet/glamour v0.0.0-20191220192632-994f646a1953/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -23,15 +24,19 @@ github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CL github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.1.6 h1:CqB4MjHw0MFCDj+PHHjiESmHX+N7t0tJzKvC6M97BRg= github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= +github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gorilla/csrf v1.6.0/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= github.com/gorilla/handlers v1.4.1/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/logrusorgru/aurora v0.0.0-20191116043053-66b7ad493a23 h1:Wp7NjqGKGN9te9N/rvXYRhlVcrulGdxnz8zadXWs7fc= @@ -56,10 +61,12 @@ github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FW github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rakyll/statik v0.1.6 h1:uICcfUXpgqtw2VopbIncslhAmE5hwc4g20TEyEENBNs= github.com/rakyll/statik v0.1.6/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -71,6 +78,7 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= @@ -78,11 +86,18 @@ github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPU github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.16 h1:S2woQOeBdzkMSw+PPqfuVpYD+tEXhLCDtoWZcqL4jQs= github.com/yuin/goldmark v1.1.16/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.17 h1:t7bl7JAmainKs/Uhmr1XZVkRJsgL2UwdTCtTuYL7RAY= +github.com/yuin/goldmark v1.1.17/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20181220203305-927f97764cc3 h1:eH6Eip3UpmR+yM/qI9Ijluzb1bNv/cAU/n+6l8tRSis= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From cb7fedfa5e751d3339ba0f63b814b1c412d1408c Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 20 Dec 2019 22:47:47 +0100 Subject: [PATCH 130/911] Rename to glow --- .gitignore | 2 +- .goreleaser.yml | 3 ++- README.md | 30 +++++++++++++++--------------- go.mod | 2 +- main.go | 2 +- 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index ad7eb89..4b20fa2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -gold +glow dist/ diff --git a/.goreleaser.yml b/.goreleaser.yml index 20556ac..a95d295 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -5,7 +5,8 @@ before: - go mod download builds: - - binary: gold + id: "glow" + binary: glow ldflags: -s -w -X main.Version={{ .Version }} -X main.CommitSHA={{ .Commit }} goos: - linux diff --git a/README.md b/README.md index 2047378..b9599cd 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# Gold +# Glow Render markdown on the CLI, with _pizzazz_! -![Glamour Dark Style](https://github.com/charmbracelet/gold/raw/master/example.png) +![Glamour Dark Style](https://github.com/charmbracelet/glow/raw/master/example.png) ## Installation @@ -11,16 +11,16 @@ Use your fave package manager: ```bash # MacOS -brew install gold +brew install glow # Arch Linux (btw) -pacman -S gold +yay -S glow ``` Or just use `go get`: ```bash -go get github.com/charmbracelet/gold +go get github.com/charmbracelet/glow ``` @@ -30,19 +30,19 @@ Use a markdown source as the primary argument: ```bash # Read from file -gold README.md +glow README.md # Read from stdin -gold - +glow - # Fetch README from GitHub -gold github.com/charmbracelet/gold +glow github.com/charmbracelet/glow # Fetch markdown from HTTP -gold https://host.tld/file.md +glow https://host.tld/file.md ``` -When `gold` is started without a markdown source, it will try to find a +When `glow` is started without a markdown source, it will try to find a `README.md` or `README` file in the current working directory. ### Word Wrapping @@ -50,7 +50,7 @@ When `gold` is started without a markdown source, it will try to find a The `-w` flag lets you set a maximum width at which the output will be wrapped: ```bash -gold -w 60 +glow -w 60 ``` ### Styles @@ -58,13 +58,13 @@ gold -w 60 You can choose a style with the `-s` flag (`dark` being the default): ```bash -gold -s [dark|light] +glow -s [dark|light] ``` Alternatively you can also supply a custom JSON stylesheet: ```bash -gold -s mystyle.json +glow -s mystyle.json ``` Check out the [Glamour Style Section](https://github.com/charmbracelet/glamour/blob/master/styles/gallery/README.md) @@ -75,7 +75,7 @@ to find more styles. Or [make your own](https://github.com/charmbracelet/glamour For additional usage details see: ```bash -gold --help +glow --help ``` @@ -90,4 +90,4 @@ Part of [Charm](https://charm.sh). For more info see `ssh charm.sh` ## License -[MIT](https://github.com/charmbracelet/gold/raw/master/LICENSE) +[MIT](https://github.com/charmbracelet/glow/raw/master/LICENSE) diff --git a/go.mod b/go.mod index 3e35afb..9a98e18 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/charmbracelet/gold +module github.com/charmbracelet/glow go 1.13 diff --git a/main.go b/main.go index bda2a9f..aedcd14 100644 --- a/main.go +++ b/main.go @@ -26,7 +26,7 @@ var ( width uint rootCmd = &cobra.Command{ - Use: "gold SOURCE", + Use: "glow SOURCE", Short: "Render markdown on the CLI, with pizzazz!", SilenceErrors: false, SilenceUsage: false, From 0a11c079cb003e4c570bc5b8b23cb04dee492030 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 21 Dec 2019 00:18:27 +0100 Subject: [PATCH 131/911] Add nfpm configuration to .goreleaser.yml --- .goreleaser.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.goreleaser.yml b/.goreleaser.yml index a95d295..b4ca33f 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -26,6 +26,16 @@ builds: - goos: linux goarch: arm goarm: 7 +nfpm: + vendor: charmbracelet + homepage: "https://charm.sh/" + maintainer: "Christian Muehlhaeuser " + description: "Render markdown on the CLI" + license: MIT + formats: + - deb + - rpm + bindir: /usr/bin sign: artifacts: checksum archives: From 9ecd2a83a15b3b0e8326e6a0b5fd21ea09bd290b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 21 Dec 2019 00:18:44 +0100 Subject: [PATCH 132/911] Add homebrew configuration to .goreleaser.yml --- .goreleaser.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.goreleaser.yml b/.goreleaser.yml index b4ca33f..d8f0e79 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -36,6 +36,19 @@ nfpm: - deb - rpm bindir: /usr/bin +brews: + - + ids: + - glow + github: + owner: charmbracelet + name: homebrew-tap + commit_author: + name: "Christian Muehlhaeuser" + email: "muesli@gmail.com" + homepage: "https://charm.sh/" + description: "Render markdown on the CLI" + # skip_upload: true sign: artifacts: checksum archives: From a2c5e27b29832ea9a67a834aef83f8dac2dcffc6 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 21 Dec 2019 00:31:02 +0100 Subject: [PATCH 133/911] Only use brew for macOS --- .goreleaser.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index d8f0e79..677f045 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -10,7 +10,6 @@ builds: ldflags: -s -w -X main.Version={{ .Version }} -X main.CommitSHA={{ .Commit }} goos: - linux - - darwin - windows goarch: - amd64 @@ -20,12 +19,14 @@ builds: goarm: - 6 - 7 - ignore: - - goos: darwin - goarch: 386 - - goos: linux - goarch: arm - goarm: 7 + - + id: "darwin" + binary: "glow" + ldflags: -s -w -X main.Version={{ .Version }} -X main.CommitSHA={{ .Commit }} + goos: + - darwin + goarch: + - amd64 nfpm: vendor: charmbracelet homepage: "https://charm.sh/" @@ -39,7 +40,7 @@ nfpm: brews: - ids: - - glow + - darwin github: owner: charmbracelet name: homebrew-tap From a0584ae68c0c937ce4931e4a869835b39884ab81 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 21 Dec 2019 00:31:41 +0100 Subject: [PATCH 134/911] Release as ZIP archive on Windows --- .goreleaser.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.goreleaser.yml b/.goreleaser.yml index 677f045..374f0ae 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -54,6 +54,9 @@ sign: artifacts: checksum archives: - + format_overrides: + - goos: windows + format: zip replacements: darwin: Darwin linux: Linux From fdbf3b2626dfb2bbd044949236c8e7f2dbe74a5c Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 21 Dec 2019 00:57:02 +0100 Subject: [PATCH 135/911] Fix brew settings for goreleaser --- .goreleaser.yml | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 374f0ae..24c4c95 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -27,6 +27,27 @@ builds: - darwin goarch: - amd64 + +archives: + - id: default + builds: + - linux + - windows + format_overrides: + - goos: windows + format: zip + replacements: + linux: Linux + windows: Windows + 386: i386 + amd64: x86_64 + - id: darwin + builds: + - darwin + replacements: + darwin: Darwin + amd64: x86_64 + nfpm: vendor: charmbracelet homepage: "https://charm.sh/" @@ -37,10 +58,10 @@ nfpm: - deb - rpm bindir: /usr/bin + brews: - - - ids: - - darwin + - ids: + - darwin github: owner: charmbracelet name: homebrew-tap @@ -50,19 +71,10 @@ brews: homepage: "https://charm.sh/" description: "Render markdown on the CLI" # skip_upload: true + sign: artifacts: checksum -archives: - - - format_overrides: - - goos: windows - format: zip - replacements: - darwin: Darwin - linux: Linux - windows: Windows - 386: i386 - amd64: x86_64 + checksum: name_template: 'checksums.txt' snapshot: From 2fc9c566a7700cd37825d3c9a3dc6bed6efd7733 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 21 Dec 2019 01:04:49 +0100 Subject: [PATCH 136/911] Reference correct build ID for default archives --- .goreleaser.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 24c4c95..2d08495 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -31,8 +31,7 @@ builds: archives: - id: default builds: - - linux - - windows + - glow format_overrides: - goos: windows format: zip From 8b7dda8606325b1892d4b844aca04524dfdf136a Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 21 Dec 2019 01:09:08 +0100 Subject: [PATCH 137/911] Keep linux archive names lowercase, so we don't break GitHub's sorting --- .goreleaser.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 2d08495..3052163 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -36,7 +36,6 @@ archives: - goos: windows format: zip replacements: - linux: Linux windows: Windows 386: i386 amd64: x86_64 From 966031ba98d63d22170fd44275bb9fe029aff53d Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 21 Dec 2019 04:34:02 +0100 Subject: [PATCH 138/911] Add TravisCI config (#104) * Add TravisCI config * Test against Go 1.9+ --- .travis.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..ce0904a --- /dev/null +++ b/.travis.yml @@ -0,0 +1,29 @@ +language: go + +os: + - linux + - osx + +go: + - 1.9.x + - 1.10.x + - 1.11.x + - 1.12.x + - 1.13.x + - tip + +matrix: + allow_failures: + - go: tip + +before_install: + - if [[ $TRAVIS_GO_VERSION == 1.13* ]]; then go get github.com/axw/gocov/gocov github.com/modocache/gover github.com/mattn/goveralls; fi + +script: + - go test -v -tags ci ./... + - if [[ $TRAVIS_GO_VERSION == 1.13* ]]; then $GOPATH/bin/goveralls -service=travis-ci; fi + +notifications: + email: + on_success: change + on_failure: always From 9e47f7d39d05d7ec2cac08ac4bbd0dc2103375ab Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 21 Dec 2019 20:37:01 -0500 Subject: [PATCH 139/911] Update installation instructions --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b9599cd..96fc0bc 100644 --- a/README.md +++ b/README.md @@ -11,18 +11,23 @@ Use your fave package manager: ```bash # MacOS -brew install glow +brew install charmbracelet/homebrew-tap/glow # Arch Linux (btw) yay -S glow ``` +Or download a binary from the [releases][] page. Windows, MacOS, and Linux +(including ARM) binaries are available, as well as Debian and RPM packages. + Or just use `go get`: ```bash go get github.com/charmbracelet/glow ``` +[releases]: https://github.com/charmbracelet/glow/releases + ## Usage From 566a5874a1e59fd4e0b4f96f183d542b25f0500a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 21 Dec 2019 21:02:57 -0500 Subject: [PATCH 140/911] Update glamour module --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 9a98e18..76319f3 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.0.0-20191220192632-994f646a1953 + github.com/charmbracelet/glamour v0.0.0-20191222020039-e4c939e29d53 github.com/dlclark/regexp2 v1.2.0 // indirect github.com/mattn/go-isatty v0.0.4 github.com/spf13/cobra v0.0.5 diff --git a/go.sum b/go.sum index c3a1f77..cae2230 100644 --- a/go.sum +++ b/go.sum @@ -16,6 +16,8 @@ github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1p github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/charmbracelet/glamour v0.0.0-20191220192632-994f646a1953 h1:Q937drUhU2JlhruQIMmiukd/SOfmwnUrgHfqIfju/hI= github.com/charmbracelet/glamour v0.0.0-20191220192632-994f646a1953/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= +github.com/charmbracelet/glamour v0.0.0-20191222020039-e4c939e29d53 h1:rlx6rlrDUP93OhuqJsndh9Fi1rvzxVn12+i7b9R11s8= +github.com/charmbracelet/glamour v0.0.0-20191222020039-e4c939e29d53/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= From 92039b34569cfb9a5d14a8baec3a05e28e94578c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 21 Dec 2019 21:23:33 -0500 Subject: [PATCH 141/911] Update example image --- example.png | Bin 456041 -> 507270 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/example.png b/example.png index 54662f024d1d2337c5793c8433a3de75282b8822..1b724833aa91f6a578780f822b6807f9d2e43d09 100644 GIT binary patch literal 507270 zcmZ_02Urtn*9MHDVnf`;6+tn&DyS&9(v%h}hzKY}1ca<2L}~z2 zQfsA>l9H9zeG)aLq(Zf~J$BgTn)g)C8P#`N)-8EM@rCvx zExsRK>>pfenAo>S@lM5fmt6m!vn}ubb8_gq^53srS5o==L}}5Q|Gz6ri#Pq}JxdP! z=S1GKxU~7go3E5`uklBFEozOgAe0?qRxR6f;0kBe6b*@PS*=1_8e8{M!KT+h%&M}0 zEyrzf(a1w>$L4zOOVy&&cdt2k`*icR*tL=K&moD$L=|}uU-k2mKj9c`;8VRZaP!RF zUdVtyyI`<39SJBJj#<7{LZU+}$B!nRvnIjTf==X6d)Kj--cQyM1NF)g#Ndwp-)^ndSOrgNH2Ym8Zf_n>;yyV8}lziGdjNRu5`+M>+Q8IO1ihNEITlp__cwUQj~cx zZJV_nIcSP7L*3oFLyIh5iC8$0ee|P=9DJukstT`vOuHXMuBQl}ah)j`K zRpNf?$#LCP_h)mo2YQ_wlWgsg6D#S8Iegpr?ll_g|7u{9mwTF@u~fD~ayJ}1 znW+=tN1XYWd)YRohatE;>_CEtjBI2OPE^#3B`q9B(1A2EPlRr zW|714t$F^HVV!MxlN7q6U&`-Rtm*Po;pmNxm&$)>E^p-h3#MjgNv*qnI0fQRUa+`g-bMhMPeKgGbili;ZH|XuHGlZjq6(q8!H5W6NX1A-MBI1e4LMX^T zi&=g04UDbN6|+%%=8+TOYN=oSD+9^MKzg8#<#&aOAx&i#h`UL}d5c(y}b|Ctye7Zgk=`G46uG9S+c82e4 z15%qVZrq8@dd1jvYnh&ZT5kwB7-gHIz?%l7H?_Zx`j(6u{udPUH0qE@KrV3l ztns{d+iklS>K}HrHH;kKp-Xld#)T1RH(0P#cZUHjtS@bC}D*_faut~BD@clbK zOrSaRgO2XbxZ69IBv1OMX0=rroC>u$Qr$Sk=b0MLb{`8Eu=p+-Oc_$9e|Ez&!UZJo z*LtyNJARyJdbOAC4TqFF)8Y~q3;-_=M#+ds==FI7fFBlPR8iZ1fc|e5cpS)B$E-Y+ z`f7w{n(3=W@@SXt9Fmp?RcZlvnV9!U!DGv9huQ$If?-eM}lxLAN`&c+=f2XVxG%7mc!)c!cSV~p41iIDZ|Tn%yAtf@0R z*zc@M_zf_X?MnsGqUl)SC|GjFk2sdoGgvDB9WH1Q8{_}4*U1q^P{e>p1_TN*QDh?R zvlz3IxbDBawCPypSfj&gZp4O7mKy{qUXEwBWr_SG{R+=0a3@Ohk8)$4MV!oqreBk$ ziE|Y%rqq#Xc6#0KA%kX~i-t`g;|v&ZUH}jZ;Xx?~!Kn*S2_?-|ISVEFx zbix-g2>}#8Uj(JD{ehyjuWZj6ABE=FxXwe_W1p#J&rTHk^=w*q&}?_Ntaq$gOc}_L zn2Q=Ln<~b3wt9B1&RIpU;+on-5-PXp@ETg@1|Z})xI(yatC?&}cZQ(YchD35;Mgi~ zh12SQ`8Uw5t+yYZ3shBv`MbYCb+>%)A)OrUpPE-=t|n|e&MG5ypZenFql;2SXGj7b zR};>QXYUd?-LN&1Hn7k&>eVoO?tQMB<7PNcx1Ja%-VxQjY4Z;>9eJkYru<4L^VHK> z^zFW7bttKhWLkn-9*2+8jlr!OG5PAfMr83V))h1ma_@uE27<(Of%yoMVL`oyOm?4R zz^ntxTKbdUFA*oL{a~pG=KabR1#eHYUv8W4A8pGFw2Co&lG@5I#C^XMXhOmk843bB zua1`Ibq0>>8vBQ{Kzjlz36PzGvr=n&i_#pqezo1x}NPef<|p(y0wX8D-{E>?0v-~Rf1u-GSB>uN zhnEv>x~RXxH9WJq5*Lp-a8D~2*Cfp|?AfSeb8$u+z-ZZnR4IWggS<`V1a0V+PCl6zb|wdvLGRzPR%0l z>Q@QIb*JIq!TW5|tTwx~U-|i8s8j5Dz&bfu>nRdVSOWK0Q)Ub=wb5x^C2b}6CqG*C6c%6J3U-mfS6u#;I)YFGYCOI3!4 zz4(LL7to2pnH@2x=6Oc2m7H2emdj*gmq&dP2+%WG!r>*Fa_UdW0-i*TSGpcfE>Sp z09t=AlOl#*Sln;2J0k3Cgr;dk>H);2_ZnX8PNVD6LauJ-?N8aHJ9Q=nk{VKkBZK5i z1*iniv{d+4JC?tsfEHjzhUtk5mY)FIvN1hzFtrStXA=!J0R0B>NF2)m0YHi{bbG~> zAHJ^+3{E8wf-|XLZW!>KJua3os&m8pwjh_aJVxZQ0Vdb6t_Sg&o`HZ}2a@ZFVAiz>2@RKAq1x)z&Xr*IvJz6a8c${QSwGvzjEgRo86Z@i}y5v@u2h+O$ZB50XjhgqaZ`x_R85CiMH_iq{KGgR~5k2bw?? z#c&O>05E|L%(Bm*i1r+j436}Z3%-cS<-9r~CHWi@MeiqC{uRV?W7j^OQA_SHT2Y;F zKlNUJ@M}5fQW6Cv=1*VcDLYTK-;Kqi>{7+PZMWCY|LI}f+>^C|A2_6wqSnnQZ_1Ws-A-qbEUpJD9uSc4r&JI1}?#Y z^7*ekk^ljLi7|MS@An02@j&i(>e1!HtFIh6pxmF{U~ak1!~R}y*A#c`@_TAePN11W z@0O*LbUw0>)_KB-+IZr6LXg&%=q~2`=j8D;Th;>ujv7HWXD|hflekQJ_9Ifnh$AO~ z43b*$AiZS)b0=UlVKWqPPI6yr$96M?Cgrt)`db3#A1DK{$CzB~vsn(gw)`>6!{C18 zp??9qwfQF;w14bmgngbC`J0w5o|*PczwXa5d}v&(({lix@|lqNg-r*77W1yHTag|p zS%+lKg>AV%%o&b+Ljb9BWFZ+Dj-M_d;H?Bq8A=m^$Wowa0p|XadE6LK4{(76v!>m^ zMR_Q329ON@3CxK|338}p)Kq5dwE>34{)4&U)!(~LnQ_Amq*nH+PYQYG4d3QPaY8bU zk|&Di%J4p4Go@km261rcJJyu&4$UedQ!1cxkfQ}q^=stSnPeAT8PZ;EQ3y;YlW76x z8AKZys&QfLp~uMeh$LXzk)zf*Yr|u$iAUh*N4=-H3d zUqOz4&aBE@XB<#`P_KFPPQdu!-cP3vjJNEd1$KV_%rpsUaZ`4lzJwVk9Ha;Y&!i0| z-<07@|NN5j>}joWRH8I9&)!1vF1E>igV`)>89A|Ud9GfX2wVaxgo+9Q zzV=;I!5aOyl>Gn#o?~M)>XGb=@}gd;291Q`ZkL3}-Jr5rw{FsN2+U=Z1|2Ut$e}NW z_4NB3c*WM+A3XvOAdZ}PFstWyJ@BFnFOdFIoBKdBcVFdg$1d#5<>SW2bN8Qy(o)w4 z>rFTvjFlI$(VlRwG#X(>NS8z-1@l``-WJ1(lwnx?|KbP6Xd8O0tiDa6jd(MYY?0No$x89g3@g;**vpZSL$tlH;zs!`<75* zmlL(K`6DS+r>G!UiyoD}M*Nn`N~F-9Po1h_u;LIJ0yhaL^-{-X6L`rtP(h$B2(Ex2 z)qk;wbP4@AAEUxaSOuHp(ND?u^}rEM0QDSjP%LBm$WVi~*sKQ0Nnb^5{7VnW1MQ>h zU${_C&Etb;tY&o20QR_=v0C%7qQFg;{M?;U>g|J$YSQ<{-un@G$OA0XJM9dh1I45Z zYnzztCkWz1tm(fLFce9K1-mg#I(!|aE67!m9mw=ybClSb%d- zWEM{1maVt919vs;pK`(mLZXb7Jxo<~8WYX?dWhMD!Pk)fDK8QI<$OG&R^rJ_rf4F+ zGK&e*1>T_h(*jgqQXm{3^gQOXTSqm4XDToUW@YtJV8BiTaXGCte?jy?DAe)OH4lJ0 zD&SPh3-4|o*d29 zaFmuqYM!t%VY9>o%fYCC;ui=9>98s!<1XMTM^+)ke}P&f6&wO(9}U#RrV@R${J?9Z zw-~Iw!9r$$Aezle1W`D2EWr9v3jKeVdXZ;D$+tpn)>Ip2Mgaa;N$~MLm++yM_(+=8 zz27S^Y3s-JW@tkmEs{)GSaL0G&`lD8sLO$x87%Sab^4@fo2Xo;$_tq$xD`-^o@(qg zIS+25Pf$51X;>h;NFF`MLcM8h;fi30HMJlT0Fc=ETsJ%15afNHdW5c$5@g4v@!ca$MQFSEKmjs%1eTK`TpKP;)lym*D2nx<-;6iR+->QF)!8H4Q>(%5F)|A zN0M$#H!#rJ`Y)NZjqXy*iE+gSBh9P!a16p2Y(OoZzAV_2=G};hhx6A_v~;1n|k2~`!M+~Z-@m^eTxEwGT>pKZMi zPKtA%c3OURr7K>atOvlXdHcq=dg6fQjAA*P;gFV(EJv{|t&Sy-SFcs5bKTo8HUCD( zvGR1e06s%gZH-}!dxk$5n1-rTmM4Xyytz|$aK?ljXH~;X&^H3Ov4Z9jid-ffEvV8I zHx$y%Q7Mv7doXmzVuIyJAf5t~8A&Yvk#L{v8$`hdsni~XTH{bLAQK42CluiOMY zRV+t{o~^HALT;R^a6D=i+^s(O)9| zE%T$jM640}bM)TMHoi;FtuJD0xY28pP-cSMTY}{G5J{IyVx-8S3zaa>Hc{Hxg-W0^ zzt_q62Q7|NsvP)H@mMn>ndTW6>3l+z<$NV4IiG&Kxi`Z<(qx?5p0-*)jucTu(wggF z&Xq%@e8KXNUp?D>Q=eQ+O;_uFQI|K{*y}b>4AF>%tS*F#K!uIw$)u<;8H--?K0(N8 zqHq=v3n~FgqbicC^AeAc3Fdn-+v>YrE+qag&J_jbLctc$ly0qxfZ5JN3S5B$ljC<0 zer#4rd>lPoA=nNmlI9jA;O9}T&Bn^jfOsG)sGV#+@5vQ<%f=kyo(a0IjMO>Cq44TE zJDFK^uV?2wlAYzZDN|fpz!gE@My_-^kRGyO3J9E5re9N77r}45MUXF9NYO}(iP&2N zO-adf#4^HE7tsuw;kcEC0I1i5PYgOr$P{p+rpN2l96_)(fv)kRne>+qr++q1K5W4D zy}F(CV(W?KGgo?o9c`-fswQP`XP?kWwh>+}V?L)Hh4w@_feP^sPRknO6??`>mCeb2 zO3M%4I0ZK|kP^}*dJO~p$_uu|1G}B6xrT{0+6wSYsfVmgCde|nKwJR1tQsl z5t9XVS)y{nXdy`&%VtHqg&V(#44Ov=ehDU77(s-;YO_1qe$=xG-#9R|I(gk2+?3<6r3u{XWMQHBV=cL!|iHhKq zZ%-@FqjL|VWL$-Gp)brB5)dQL=h%mlh4RDTTQ<`H?2$l>C)sRPDu^;;)6X!5XVHi% z%2R=iC4M`bxe<<_)8)rO|NT%p|Di%2gE5s$%>FJXSJLSbVK!pP-QKBGB^VK1lEfC?Zu_w@T9n%At6gfnBqkX#bGaT=%;#qT)TqelKU|-w-Sd5$Bb8 zcuNx4HCvk~moEL6a*^}}N=+Q`t#O_(EzX+_p4$I54{1VZza3ox?Pl5ko;)ljiRM2z zzSIcDVCsn*=_Z6n-P!=HsE!V9sC=-B&C{*@Zvnhg>#iU>*rB2Y84HDzwaO;#{-s4ni0PJn(L}D1x8>1|1i5vjIJ&XlfqhRmHiu7$507c0 zSdQ}kufszSEc!i73-C$+`l>tsm=%d5bQRHLSInoiM}m%?RY`1Xs42I%of&LAp78rq z)n*YK5dV>4+?W$jH%_i>-w`pQ!Cbe?lU-lu1`3y(OAz+kYO1EqQTC2xI&^E+hYb6K z_hjIlb?F=ECNx-e6f@{HKL(xcCdLtQHYYN^*M1}^1G4uE!wO+Ws)c!wNxtDIu82pa zNh|6c%b`(frK?Swm?Zb>*^Xk9LgZLW==>)m8dANcau$Vzo@>$1p?Jw`mhjLYS0dzI zvZ)ix|Ed^sz;?@(#gY03-c2%U=aMA9663UG7&Xyl&;4^lJCAXh!aX6TD~fnU#F2vX zI@SXWx5%FCoEki+oo$lHsOlSPP_1h%-!*;ePo|LfNKuPabEC_<#4l&dnk@5XyXB1u zgUm?8cXnb-H%63B2RdUR)qX@XjdinR5*+YnG?=|R0_P6XEn)}0J*Vg1+K;nN*guRb(GBVy2RPDK8BE%IpH@#r3D1} zD$4C;j4M{RA8ue%W+Yxm4IpF(MV3%Tqe~iD6J?>VqRI)I#O)Fg$DWEqtS4wmX+Jg9 zIVMUKzGx)SQwGie38FH1x+GBw7y0JW1Yh0|s3b+oC^v;=eYN-Je8#>n|EsXAb_JX8 zcy`n!taIlC4!iwj>McJ?+Cg>Gv}G^%=#T&0JQBi?79U>uW2#0FLtHg$%I;gHyGH(1 z{Pv*7KGWvzF@24!;0cTy=zj(IEa5%1Vzlvo97+SSZ>*B~@J>nZ5>*K2r1^RQ8@-S< z?^>x+`i%wU3({!EDo{Eit^FizOay~y1%8q?g@SN?fQmzC!7O{rUO00Woib-Uxak2= zgUy-)d31!L!BsJcLI7~|k2-PCF!#>d5XYf}#r*#G_3 zEc;_C!_CKtf8UGQh0q}caKl6^+#u)W!}Qy0p+LnUb}i(&d>E-XWCk1gR!R$4aI_^A zjxTpLvqxV`L?D|N#LfD85@rrYEgyyzpMhRJ3@8p*#o>>&5U*htmBL6Wvdhtn2s=1W zoyEG{Dj&up-4WB{tB{}RR?tkyPiCrrRf_)9ryDwOT6}2wyTd1IMZ%tYXC9him`O$-!~lgHVkl=c0L{7;5&DmKwo_s0PrQ@>{$o-B;9W)ilctQ~1uy(X+;CPG5?7|pW zE7t)YRsB}h8LdzIb}l=;rRXl@^UofAu_M>rNmQ%AcPmtuJonm&v)@P2`HD_x)!Mh= zd+!^Q-=|9gZ!GHD;-h~1-G+t@Pv$SL^E1l4%j)xz;Xy_UEaP_$pjOWh$Yjm_5&6Y{ z2*-OJ06BI$mn$i)RXnq^G}9;dC^P2P=FTYWZ+k1v5Y@#-rp2AVmJ}ZZ?Ku7CGDXGG zld%H{{EfLNmV4``_Jm;>_+ZY8<5u+SsjMUgexYbMbl*txew5#DbZi!m;BGWvyd{(+wYjI$APG|y3F2w^ctq#e75wbzW% zO{)H}>wlhlQmpM^czJnnu&GiA^L%*RwBNf@PYks?geLLBb*2sS$0}+@_tI(R zyCzsEJ&rQpjoh~rrOU8~G|i53<|e$%0XLaLy*IEf$UDI(xDI}5eI8YVybgP>`9?RG zNGssoKH#xhO{pXusWfz}+BPoVSpCNMI_rX6`}*$)%3SNPhe~(2@k$BiUJiz2G#@u< z9zB5Nu_%wi@=2ki7WM;krw6&z{w6EYCj-K)9!lDgObas|NT9N{d2d9DoKvXSul^aT z$QvgfjwSs$Wctr;9b$=YjaO|P*=*4!qVn)UVFi6aSkvwZb~)ldWw-_S(Oa9Wz$J2~ z!{$&vv34qq2k7zu9PDoP9&mUMuW4Nhn-d?xgH2M_BBd=#Ym{~veK6CHFvJ$Oqd#?L z?yY}xmG+WR)yebYM-&h7dyVJ3>5rg8>Wc-@x-gA)G)oGe_>g3msSdQ(KkL!UkoAw# z!Z1RSw+b)beC7>hrn+%+%=h7Mu)8#0ccO2FnAIR-Ml)$u;IsGulJGN#2EL# z0Kjn(Tf5}>#+(RHN* zN|%fu1{|`9BZQ^jdDd|}&xaqByKL~@RTm=n-RqVRYr5v7?&RgG#H(2(?zZ5`OOuW{ zPa9}8{Myx#lNNB@Modi5F5h$GcZ})(%T)^MX4?IYp3?oRpgrEnMQld&$d;5 zBkn2=e}#AQiZGbYLc1mx2d)>sqLrVmUYTL;H9c_RFw4E&+#FAm@ymk|7{4-StnvSd zY740}I=A&<>_#*$@LQtX%}vMQQoxbut4YD*^6_WBrN81OtY4+A9n5N0I~<}RIKKRg zql{%mDd3a#D=ojSeCUMoX6Gt?s4)Cf!b#8i{T|3q39p^0yGbo^X3AyWlNH4?uZcB; z=fCL}<&$tdc%aL1Wtf|bzB%~J46J)TU$!gT*jr!zt#iIR-E@i3I_CK01fSnEWydO zQP}B0>dU66(1Fg4xQ;-B9x{EV#FE#i-!~5re(@HIB1M$?R;eBHt2$lWaeD01Kl}3g z-tSKy8{3B$rFfZ+(-}pc-%({D6*EZ_NVSpnOFK2oz3C@_c9W>&!Y&6c_`g?!MX`dq8@m5dv&99-Q-YWu$ z$G}Z|fkP4BPk@`ezYk~5Nq$5yd`X{^o_w20Ia(ts1Zs=CJHsT)+xYmB(+h_^}OPQ=dzluOFj9%tYICAcR z`M3}6%duX*Lo2h|=Q{N>OE6f<36<`esPE~cb`nJ_=5M%szH4M1kf6922yE9syISqK z=8)1*=bLrGoV6dzNZjyLNzJ{$mmeR6nUO>>Di^c`zx1C?)fDx|tDZom-?+ERnu|YT zqe}o3CJSrL^9gH6sN48OcapdV5U)rmLqyLQPOA-sk-d_`z-O1TX-D!%=M26^*q0#r z&(fw5(^m7b7<^&62?^|P6j}nteLT3S%nO%Cc8MnU_Z%Yb$(E|C@&?p=y#+mLU$JnK zg$1tH0t(mfGo-&POT)5Sizl1!3}KN=Cd2bA8%zCDPyS|?jH67F?^((s;w(c%J?cyT zYpLrEUa7WJt)(T{5hUeBNF-rCOlv;u5KK8(3U3nJXC^?D&aSdTY+HB-iqE>=$(%m} z@BWK-wpaYI&aha$t>EoyZqk%k+Vw2p((_fvM2AtTHHdT_FvJ>Z%PQf!))mdaGRrQ& zoBw8B^MHo*Po$Arxw%ieQp|NwxIXo%z6?T|WwAf^{;sLuH1^>Fi=UMp%Mb1nR+g7x z@MFQkZc4=S^?=+sd3qx(8w{y>S@D?c9ul0awWPH+)V8P4ls@9X`nuONc>s-#+?y2iH0Z0S;ZAdq`f39KDS&9gWA&e#Do6SXvj)uK|NH#6lF}2W zWd_br(f+Gu^KH3X90zq7(S7gX?x(sS%91O{MA59gVBCwodcZN9+>(i%7L<7n{}7|s z|M=!Yk$>-pWbXJT~_hmdwGl}|QOcQRF_WTs$qMg09Q zr85KB%&r}q9kw5DN=8Dz36qKPC3*s)OTZh-$&j#Xm>Ku{!?RB4*kozvlZz<2XT94L zBcdZ_7KrGfjoC5%K%MR={ederHkjrsQ+_wlg2|3SlT9YVZWL`Z$IO4T=%60%TkQIE5CCpu}loE%(IX2&rd-{rpBm8QSSYTr6Xzvi4fOv}-`N7Hpb8Davb z1EDKueEAKhjyIOS5;>@p=Yh`&iB+$&sDZxA_a)bmSKP$*(1dzIPS8|VrLZB+a#qiz z*LXXo;m*7A;%=jfyw$R1-oYU1sMe-d0jWQcW}z0bS?#|rq2zaiQubzavRrT;DpixF z&Z9EnzTF!(%g5J&=*fhqpC3RK6E|UtwQ{tClTkVXAl?H!4NzpLqU2$2sZEjHZh%}a|*88bs)almzQ{#;_&wL9=s5``nEv&C<5wvlY zcnRSj3l%C4%F2p;?uCsbxd#%2MXT=MfCH^X?M2}TBNU$=L3h@iK zDS|Hky^6`4O;S@be7EQYqIvG@Ri~^!1g<5kgi`Ao?dJG+Luxile`5R*L1S@S2P$u7 z_yDElrjh;VbK0aPK2!L#R;r(0P?V~J&n6%pR`SQauyG)i7SfSAXncT@vZQzjyUP{5 z^EB40cN1ev6xF;R=-z9p7J*1cBg@KKaZ&X4iTmz(hesbT!#Dbp1^&zRlWSJQ^Uj2+ z9zcUN5&J3lna0RF)d`Iej{ehi$=Ij&-08WPR85weOrekjO9I;{=a5gh_V0NmQNxyz z+&xDJZ2mEbQVpi}8th6dyV+RlX9!^o=Q4iTcXnV$j$Hyova{2tT1!;~^lab+OquZb z&e|IjJLo2LhG5slKQz;ct>8Va6B-*xo~8kpnEI84d+Ygnf~ra@TT=A87eZ-AS~t@; zJGZ^6svSGq$H*MFo7mugCo1rw4J+qe^ofG-QxLbl|8nxY&b#!&bNM7AdE)lpZ3Ay& z7LN!BwokvjAw6PU%v(o!PR76Y2`ORE^%(e1&5gD=HTWHLZy0!y?u6bkYNlM1XV@`6 zwo!Tsmt}?VyO%7TXXG(Hm3ZNH{V-#im9eL{v2k-07kB8c}2-UMRI7r~Shyh9Mq zkVofg--LlAr9&&PDzz0(Y^ZErxtdbCf2`xpM}d8*N%@R>k)EVI{FliJ{kGy|gdO;1 zF@sY1C@T5Rcnu+p`HJw!0VJ^QI(dY*$1}VpUCRmd8SVSYC~R%cV;4@NC=JwUt|BlV zb6$@9!Mx1VS)Or^FR^G(m8-wVxi!O|NaeMT|t#heN9r?)4 zrO(~ey|JOp{?+r+8a_@^FU|Qu#JrAP7LW`Bu1fD#Us3u~q3H~{H~1mK3bRerz|;8e z=2efPLP1{oQm~GCpKnlQ?D7iQF{$S1^K05f0l~eEXCnnq(@Pl_$}1O7#1RtM*gYB1 z&G{`49cqzJ1Cj*$RDV5sozmi@FR1gLl)5+_iwS?r!2A2wkCuBT3J$t~gJFbgh6U#1 zW-^N3Hcq1={LI|JzqLNhD@49}Vx%f7um8ndKN*4Q{FHpy=XG^f?|cDJgYVsx`>Mn@ zv5LAGt!Mi_j7)gV?qJ{7*8Z+MFR!jQKHG7d z5UQ<3AG9l|7JzRPw}bocIcx*_t0&&h{|Y{Ntexc98h9q@6`r< z^S#{g9mYqsk3Osz1e)^Svcnn$18X;&%@?@ZV+Q*U%>*c%;bc$NLC5T3L6Oz7Y@^lv zF27r7P)6$p|GxpxpgsBjQ{plS$dn(uj-H);HdtHX%pvoZL+EtkkA16K8b*V&O<<`CNAGT!wqZ>WO}p zC-?cktah`UfqJv8-6U2MHpqigo|(f-c?~>RiJ9{?&(#32-T0-8e!%{8EzkVtfu=v- ze6zmq?_7U`8J$${@lbWghd*B#d)}m(>E$=Rq9Oh;Wj<`p*^waihh!>eUlLI0u+~k9 z6hsI5>BW=S5R<9kub9Ps9*Zq3oywnNshu?56+IanhK)$qPNpDxR%>@Z#*wYMe=m`~ zWSB-+i*;P18zL0GeAeXfK1r!(tlLFfx3A=`t2|z%hb> z&4zL!Y7S3wd6?SpU4k@ZzYJ%t^aCFR({B_8Zkm-(s+jGjtJ-hEo z11ArHXCqoTA_r6&zs%8rl}&#{7$~s=wlx=qxuQh9XCx#1gp|b~sD=#6b2zhk@yG0z zV*QgitA4$>;No-C)7YwWwgLz0dANQM9;%HzZ^dsfSy3WN6HuLZ*A51$uXW7pYkJkv z<43n|azzBJ!xzWpC#43YhwKC0-g(rgQ@IvMq@T{M%Ppoi*_)%2F|)h3Vz zGS+dy37`(ZIJ5xh0xs9mGDe5e%c8jh3Fkv*gBkoB-T>j$0 z<01_Kt^g&K5(XR%x2fQQY077ap0+H1U2w3h={M&WuoM(|+WL~+bKgbo zPWwGmOXz|>2-dUV<>r-C!xmHPw{zovyL<2kWBz4Fb)NzuF; z6#_--{ok=A+bC!oT(+qf=x*Yb$uIKMRA6_*OiEq^t(M$-N;>yC9oAMnA5qP+V|BF4 zu}KF@VBr0tzlczx^W`#rDzrLf$|Py}NG8uFYr4|m)=b42;E*(*^@O7+106Brzb59> zw4|z3&MNI>YhN#$mr3Quw4g4x`r4(^=}NgC{`Zs4SCw1k@ZgmWgJ`mCf% z^4Wvs>s)T@ms3`Y*z<`ntS;&em5j1xre4NMw|@239DF;{;^c0*U%kI%F$(TYKxGBai!Sq!fhPQ|a`ZqVfm@mh2T7ma@I%0s9Lzbp z`6Y6A)rubi>dzZKUK(+pKHE)-sdqPZl!zm2=U$&Nn2mXXl~!Z@T|)4OKx=8)shFHo z@zL|Fn5e7taP95>CeawrN!c&^kasnQ;8B{&G#VM2kmS+2mL3v-^5yjhyzBX*GY|!4 z8J#a6E5y7oLO4HG49dN*KLin$1_aZ^8;jggoCmyS$0t(1X9vABTZ&jUo$vM;;)BmB zf6MkJpT7fc1Pp(?Uxs{BjspxWfBsl3jW`?Qb<3jXkiPJ<*4Pf!!&g-Ap2EonowVYy z+@_-g_5Z8AGD7Z@I@%2~*shkz@a|TIN{g#oXk!RR{&>doF+m|P4Pw93?>Fk0P18|U zx8b6@?j4RD<~cBsuXHF7y+Y~6_f3q&Kb_3`wIu5CDx-wX{0T)Vr;|~%nNoJT;{n0v zL-MTDL`th$TAZEI<^P(O?_hg&V7G3t7h*s!^9=4dD=LP@Q&etRsk6&)rznr?yneBt zd}M0(bXnPxFIVu(qm%7Z=04wKq`eb+d7)Xj`ueFXaXWExitOG0)t;$qSGCc5U+}MW z#xDlWH4NxXc#%|Z%spI#=z0@2vZmdt<3gNIh~%|c&mM!i|zagFkhcj!#-yoZC;{7I;6 z|D6Exw-`?zTPJrM9Gd{_oFNJ)&>E_ciz@4`A*bmET&`up5RAH}^i1*F?@+v2_+cMp zNlSm#&R$Bq4Kg*t>pWZAY|UZ1D!Ckt+P@VKTgDZC8WK$4@9XJ;)=U>7zjo)bi1qxM zhtS(78K~BaB@C^}UUt&>h1c=IF7~C9k1|XrTb#k0Sq5JV0$LR4q}=+CVQgCoDk+b-u_=EQM&GQ?`ix4D3HzMK1FdG^`@^a*T3(2LNpBy{i$Y@ zybJb}c0v`LV%`BRz?IyR@pfZ_VEE?Z9|`)U^{U*;T|IJa&1qV$UKvx|lu_7fRq z%c&h*dpIKX_oGG~7=FBRa9aX5@9H+NQdr3^F*=I2&4gmmg{$6&P8Mv#t|rWF!}f?` zh8*lXDxwoDhtc|1 ztx=WUCwrGrMe)w%j~mzSgdt|dQ7_$Q8-jnm)trGz;EnOaz_sS#O42PAX&19=!sLlv zZ6EXFqC7+~a8^f0qL z+XW8NMyP@>uu}QXqNK12m{1!8U^F%;Egn*8tE{tficvX|+1p>;J4P&+AoyRUA}VMaFS^zSq)T15CcuZ>qqhX&Pp>Y3bTkD*&v z^AGnmk3YGj?3>8zcXBwY1Z8ryWn&_I8x1g3B6RHhMOrJwLbice;8l@f2hJ|9Ea=n8 z-aInZczLKgfAH;->fscgd^oZqzH^m6AkIaUtATIaMGcoIT@9ST0;FsDielprv4Lri z&(65_s1UaIX;UILss96uhnU`GG3ht4Hpo=e{AawIrg~J6=URo%iK%ObfLvSHoaSSY zU@2v(@LAKh<=9o^UW1)KV(bgIZ3srYL*~#GF7f{BLY#iW&1p{I33~XA3zHT3^=BP) zAAj3vIZ3%X2KC+7<1$rHQQ)(={>gftV~6uQu++L86sIF9;9=2VFfu}9DLiBvlfft~ zzcG9=zp9nTy9ai85#Jy|98WXDGI;PiZ*vKK4r?x}LV5PwQp+}5Wtk#~0OwrpytrnY zww$l5=3PPrlk9|USYlKy9r)~!azQ9Gr;{sifU#%vzOjR}hzr&53$ZigN*^goe2*M7mzFY9 ztETyB)kVMT6#2Kgd1q7-vYCY$=vM<8Mw?S=O?7MJCs zs)H&``}5GC`Pk8TNEZO$R}D$?U(!2V*_KUZGRq^c6DGT%9gR- zpUAH#2!6B{NELsz7XGK3m7Y;2jvHtRNdU;@8IxO!HwW?-lUE97nsPK0Cby5+dAe8@ z?Esa;k8X8ysrL|Nk$i}+&I=lR)LI)*GZA~h_DhD7_bsX!hz>Y;%*sN`=bBR1Ar&R# zsh^DVd%F&Q&-1%@$ob?OK9^S zJPfCW<}Ip<|4H)C$Tr171)?Wp5sEEkL|a27IYvU)KQwKaQLf0`VWCzdB=VQ>Y=p4E zz8?;@B~DA4wb$si`)KzTPL!Kl`-CAEZC!25IW=)!`~E}5jsp2j+SRkJ^kew$qH!Oa z!{gD&Zq&mKX^Oz05^uTuF-F{uV2{Eo}!L&j1}TArNM`o;8D$I-@}6a9f{-6%@@ z$u32!cE(rzxRh4B;S`A(F(bg^@z4B=am|-6u}-$ut^4ht#Vc(=8aH*tLxFsvsnHyU z3hS{Bi0MW2aS$D>|JuvNO3a$R0P@`70s2t{A1xPclffE4|6tn}%b3_rT|=Y$%spDq zQ5jX&uLL!vwY?7D3Tm9bR2sYR33_qwR!OIK7TK+k7CWm8vfpO$&{16I1<|_txO8Pc z;&M^s|K@R77jz5uWdH)-z9IOFC<5Xw0>=lt@%!L|dpX>Vl%+5=K`Mm~!r%!AUb^f@ z^K`p#UA3@=cpZghVj%yhu3gQ3U?fk$aifnfW@%>1clZjhpZFFAwZ`S3@G4 zO)s-zO+KP=7;iD(vq@|I_!J*E=&l|6J?)nPwY=fZ*D>Z=e|-J4ZsLD4dFb>Q=5_*o z&tWYmoNULgd71)~!IKjNwgq}C+%x$Zh)>L_f%oFOu}%=KyJDLJ)>!vrOCI`JV+C6u z7A*5lUp&yc)6ns3>Uz(F#dT+pCQ}3N1>HL-=q%RWNy_h)#StAV7EKl647E4V>rSD6 zb^qVDD;b4OJc9zycZBu818qyRm*)Mk_;Zn*cjMcaYoK2Pfa*ZLh6$^|LhzI5&7vP| z+R$yiS2M1%v@{+F-;Y?g#-8!#R{uY2y?0bo>GwSx#ollPWJCcSMv5q?fG8~}N>f3) z)Yt$qLPSbvNx+5;uuueqAOV83NEa}~1`ail0HFv0k&*-mB_WV@e>XVg^M2R+{E@-6 zX5I3XbM`rVpL5A2Po@9l;UXz1UPCa_4z9mBsk>(A%tS;Z3$B~V48#GCGw1lYcDGR) zC@1)5L?=?-Ik|-we!|Rrus8^2ki`0fz1k*GrodcysiZROowP zs4xnQp(DtfxBSY)a-Se%9j@o-mDdu|5tB(h4f@%onK=t)lbVwr$=uO}&3x;tGF*Sz zp8*zhl1^G+J%z_w?&!O%(edAD%t}0Z^AjeSS9kQeM`-8rC4|Cq{|O^y+V&JcQ`=Qc zcm_;M(L;3sL*{zGy_L_7rMk?z8_3J7EWqbh@9Crm-|=UfYV#`XIj`Z*TvRJUk(SyH zEE+Ka#L3liO9BLkVl`<|hl*Tuz~ z;>yyjjF0pOsI5VX+*FCpVB>~un+ys+^oSPuQq%X)FX}a^b-|N%hE}#ZA1z2`$@P&b zA%_gRH^Q&*gZ_I2pJ;rd>|b)O=n^h&|8YTWlgeVu&mFY+#roT`q|wuP-XK8LSfbY= z4&dfDy^2I7op^?pHwsB2Zx&-h#iV90%N3N~cG}FPVmZXJ>n|qy_1cn;?@R9M9z9Wn zEh|Et#O$3MxL2=e56hpqZ7JHrU9XT-nd4}p^4~-3y?^j^ix{r7Oe*Gu6w)-yX0-YA zwEK$OmQS4Az|#QHI2y=Im?T+tvC!*_#^dh zt4zxTuL|X=%FX-&yMqzttgu+!!`VC?Twy&YZ6hk3D$V{-gf-V_9XNbjE5{;%PPi1- zo$!g*4yf`?uose*cLp|Z(E)w!T03QX|-JDwq!G(y$yx+P*lyZhR@yDm2+ zd-5JINM52B3n#K*pU=Vl?O<+}MDr3M#KdDZ28VbJzwa3@HRllCmew&+Mt->N$%sxvGMI2dPKU-iEbXu+2f-IE%@YmW+FNaW}Mx4qWI3=a21mSdm5gGGN;oaLT~Guq5o=-kQe z?zFpWjMEOb1xt40Fls^N^&$Rx6m~GN=gqukQ{D4NDO|z*Pydkykl~cLo1b$Igm-T; zhpTepVGEI23pCvkzn?&;wX_$wK%VK>Jx~;w75y>Cf4ceG-uG=wY~n%#5giJq&S^74 z9{`vTk+l)Q7eCno0d3UYWA6vQPO$^7tnsv8R^Wtet%qOGe!GxmW8S6QJY`8wlVZZs zI>}%1ww;sVgdB?FycD3J+xN!Z;iNd$Gg$*^BlVne11+6@7ZGC07Sf(=`o2seF2L>! z=_ujEB&b&F(VGBNL3R+e?FR<0!e?g)5e((e7@ELBR1_({TVm-t3hk8I>UZ{$-<70a ztkbh~tfvN5&N-@NIOZ|oPjLOhz`86Fg;=0dj2$dx`VW=|9-24z*7QV$<;ihokhTw|K`H4BZ!l)7imz`RD3RTJh|d&c~zllzPq?w`k4jn z`})c9W-FLDh(og%c=HzyMq1k#OQwBKFY{%s}5VyG2Zj9RIvp68{S)ON;_WRa3h1+s#;N3ppo5sn4T}tDfx`EU01zvUhWym>>P`1btM8`|Mio zWUU4C((zA?rpmB@=ArHhj`S$Tf=)!5lyTaJFtA0yiGF{L1b5{>XP@G~V(e-~4H{I> zJX}n(QnbLQD%d2wB^O!nr}uGRa{TqclW~i`>0;ePHu|>8_y_d148`v9#~J?vxGXjN zems-@d1EVLnebUa&{!gEQm?KBS=LAla6`0)Hg}*%q{uN_e}c6$k%&2i3eveZV{ovfU zeS%{n%=w}pApi02xM)ZSg@I%<=L6tLC~TjE3YyM0Fuv(Excf~Ka~wp&clq=P8@hJI zL45qch!LM{<$V{O+KC7ObXS26eh1{jD8c*!Zm{dZgq;*3Lba&W{+xP;;_iVWL9JFs znu+<_n>VxX+GW>Y@N}|e-_+s9HD4@b2f}N0ZD4E_R0a##O&kho&gpjl_mLpcvXi;8 z;RUcM(l8n(RDV- zeHNEXXw3<{o!q=B*D+ykP55ZSsTFtcEjwHFu0B?q_Wrs5Xy4$exGcnEB+QGyFRW-j zk60PoQN2rK?q)|{+dPQ0gn8#GuU^QW<61!z{|9-PYMeQ15drA6@d-yv2i5`M7(l;< ze|i?9Y%H$U##oAcek@mHVW;d?w2RkIN#$-kg@0fZm(Ma?dhXklA$VYHxHT@ge51&Q zAF{|D;XL7(-7-+TK=CE#pFWY`q+|nW@E<@CA;NG+r-`bmM?T(G*F*sv0JxJg;wKVWBI! z+%}W=lM`M7w;uh^#b?*6L10ij_XGCt!>2nUXb_KvV5H*!=VL?SHuSyv$y54n}YZeK6X$x zo?zh1)ow^-20o}YpFE!jhVuW6=vU&XG1bFfPr1a828mcBo?qM|Lu_{erI+6IHz8TJO>o}Mjd`1#Cnh~bi=hJRz<1Goj1rr zmnWbL=X=giRv+8WDQ6baLW-3cYW{VW-$1lo57P+Xh+h701h5w@gei7c6e8H9o&^wM zBSQVYN;9BmFVnW;9AVyYkE(<9t)M zSU#DebbK{;=SP&##)n9IOrhG7)i#<%Z~qY8ccu3+;L3CdUVj8RxARf?fAU?(rB9eP znIWW%$R*bVdIuOt5KbIREVR_;vnjNo`95hTNxEYFBE2C8Kz|lvu3D@HGhGKD9S4uy zGHJ6q7o%iB(hH%#J-IdR8q|8Otf%f?#i720gAOVR2FEDcGJJ2JL@z_;aPJ+oj8E=2 zHX@@QP1->Zx-=#=HOJG=J%|6_#rWY6rg_U#M9YXUVvuSphKKG3d=5hAA#cl6ez3hs zsgCu(WCv54D+6ASk?L5e4Mr^(dMEE3pT0k$%V3+%kGq)y;(6ZpgPd}y6~EEBWox2> zs`47Pndx^t*Q>5GIKrG!e_z^da}saWOn|JZE#+DL>h2k$ONmT&u_dOrjFVIVc2hHb zUT?n2SrnRspj12e^TqE1o^U2WI{lwr1Bn*W71zd_6(E9i3PoRwrpQE~2r~b(h=q29 z^>8QkSYEGxALpFu;SQ7V8v)~V^>$DqIuE39$AE7)-yRvPojobgStEHyS$!G9y!F}v z>naf($~#*4C?)wxV~DOJ>_t3l@7L%L(z1lt^-LG$?UX7{-j|1_r3xWo_c$(rJEKtA zAqr(fnv(=aEOt(Dwb8G@%*6HXlKQ9sCSali zJYeoBP4_5;=g7TU0nU}W&FY8i=XG+EcJ9yFlfY-KMWuIE=ff&-=(G;o^&M;?x;vil z$C-AmEpXuf4+@Nq@@A8&J^^wW3)e%)+Uy$8+QDc7u$ut`n+a&4l8mc>q1Y}4MV}`U z50qtSO448#Rra@=%$WPxmpzj0*}qYR+BJEYnTKG_Z(|0m%wuhB9_NcIMt%9F-`ZMv#uRWVUpz`(Mgg=GO4lb6{A z?5{#zC1oTNN&6ht&0&1XdO z+f4YbZc@eY-V_paJ<4K9+>YY?M`J@SSU+E{sCu|+j99OUH$iV2FT}mo7__#$|3cV5aKM3GNqOBxj_p9G za>_YosYVpU;33O%O?vxAFGYkQFh4Q!{ETz1?_uxiE zV_1)9`=1CoS*5Cs&WGipC!qJk#7mHaewFuaabw2^{?s1gI#F4jG1rg|Pi>Off6(|JH-mEevR3~IdN{OylxIz`; zoK<&6(f1N|at!g>#_1i^Cq%WC{LC{VA3NAY9v^IDBdxfN?s}0ndbZYNPLvSw_ls}% z{CYD4QUnx7`*UDO=G={nV<9r4>!i%eXF%b?TEMk+nJi)m=mG(Iz8WXa1_+1hkezuG zoc7|3Lz0Csjl;9oI0g@W6L7y1uD*zBzEv!fJ@GkWzhODQ0Qa)}jl|Q>)`CgY*Y)g& zx|{jM><{@xFn3insqh=g7w2e_;QZgS7(*aiOsqAw#vW1RnHr8_kSYo9u^aB;*MgbH zCGs&g!0ZG6RHkBVC7ctE&))Y;TZH~0C`SW02&7nXBjlkUx!ba_()hrfQCpW&aGPFY zhQj2?`#^*G4{zI75mR)jr>qqi-x3e{cO#tIQ+RRcDCMLCww9>FO5FygGrD^^7i#$U ze;^3uuau#UEuQNzwB_$@r#%N>1AFd}I!RuIL$xl(M2;xDV>ZOC>jg0V;U;#{T zKIO#0;Dx@779a#9D9hUz*gBxTNEfa` z-gv4vYFMQ5N86BI>y3(_L1lB&!AZ50JfkQQXVC2cMVrEV{ge02@rGoDO#6SqRQ?Y& zCe#9`cFDNX2zb?$QM5PnkBva}<^RI4bJ#v_LrnOC) z2BGCyPfBVUD?>gp-BOrI^;KE)J$9rdv1u2tc7GI!d2=U6aM-|xUU#&VQr+5i0E~-# zlKu{kX6bG7_R>=%EddE60m^{FiF7kC%v*#2q}*Qvm$t-N^iB=r2`gw$lUiYVZu1PL6P9C(U8R+>X6Gs)mvwjNmf zYdc1RCO0Y7^J-njEOwy?C^8K*DXYiCf*6EXR-f5oF$>_tAF}~^+y}9Zcfx8&MW`dh zH0GvWa0YhS_??nxivd!@Ibv;ue=#dyYf|<)r>!NFukSfOmLYuRpZS;la}k=wpX{I4 z#|=%t7@`w><$E?IusaH-vTB?&D8GwTk6Gsixw4_pZvNd-UGh}x;`Bq@)300Tyf9p@ zufjzp%O32h?H<~kj4zDv*j|(IO1=9y-Scg;i_hXM)DTO6Y}Oh!Dkdc-Ck>MXh{+rn zDFg~YZTOUkNlFS$iTfly8o3Q}SZWVgnPK$_ks*jioH;q;#q0W5kQtLRUqz|xA3h7M z8|I1mhH6=`#ZJWCdWHFr4qCWjp?0xW&S+=Q`6cnM`GT}WOa52`=DonWU-|5L; zkC15p;QVnQL{8*_jiau=ivx@nZl>`_sC5^T62yW#z+k~p5SPAS!Vkx?5wFF&R+1N% z{qE2kU&~1)rp3pQUXCV3>tCq)1nT2zYwf_C+_w9i^ekn=?G2~9TwEC}!*bn_Df3=N zpAn8;hoA(F8|;fvg(qeT#8JuR$`ES}`L>%YNfrJpa7sRA)$B34L5fG(GlRnGhYGuk zCWh4nwdcn?mdz(BZ*oWriS@#XC6BHYwvx}S&EX=nb69y6omG=X%)x@qOyv#DR`&G9 z$j(?h&r&<>P4moJ#BnE=i-qoqy+V{cJ5Wr1q*#1J z3(+t5(VWNZStB0-Jz^5S%M1s2sj8;RP3T#GdCVoi56qaC=PO@bcZwYxzjELk^}|X} zI$q6t&_xdD$umcURt)y*-Lr$ml@V}GxS7@DK1QL*W`2atSkxtVer7vE^Gs{*b|aUL zfm7Cd7@%U^IozVgehZEq*~eze?{Kyz=CCTi|1h?AFQ1@UP_4vY$eB=Ob_?2Bh3}gS zYjci{7(dB0oYl|02<*lzgoo-$HehS>$^qt=Cmo%?No%*F8ZWnJ9|vfHVfb=wJG)Ir z3rop33pIqg%lgYDy#%yGMmS{=l9ApVPKr878vF)Sy8C|F)b2ST3HvXMnFhd-Qn#3qjjxFsj)ZCX5f$8phS z>}u4$y`JY%tf!6{K##49H{O3k&RB+do_UAyp_N!Yqw&sI6wv=R%5ulgP1mteJe}>> z&7Zi1k~g^ItR;D!4y+UQSUUt^ak5WV2m|joiy1%(>Ebn_iSc)0p2j3WngN`J+T_4j zb}|@-UD@2??Bce9E5eV?%rikc2g%eMPNrg6k-}FA`Vt%=W zJv82hi207cSp7e1l|t&SNtFantLcS&kGC(yb)X*a1s;rbi_fO<5FEXL5lPUMj!l_;VAShNF|2)hy`T;J)ToHJhM)u zvsMy-sBe9$5KP?h&RXDf^R@TSz8(1l$@zCRQP%V^{S5=kci)U`%H(YWxDG*;NUfQa$ zZot^vON~MN`c;2tqut-W4gxvL{|iX^LaW;w#=%CeeWO`RN}I(9q?X8xk6_-DMBNCI zpXQ`JO_&5Rslv(EjRX7wp&fAw;-g0v20rtZ436pD+w`iAfBMLC>3sTAPTfXP_Ztoh z_ni^t4D}1*dsjH0li{wX+(DDrJec3teR6-4bQhx@eWJfNe?Rk9Ymho*)yT5q-g8-8 z#m!eimA+pDdv3dh(U$~&5^3RJ#COZN5B|?4*mOr56yLkzfCC8qC9+==#u*h~_RcFT zNEUDxFN_G;Yk|RSMWiVJzh88Lo+>3t82qr*<|^o>6$ZscoNJ*x^?9y_RI-T5eJ+kL z2W|d&870n_z!yFp)vhSdmM8ox)+AV0ikFuV?LU}Qx-Lxka_(zt$DFJ3z4pGTxoYD} zJ*is+w;|w&L>Ey`iW~OO)b_PZ^ zO=)8mqz6)>`k=~p=-x|eTY+?Hzt>_J3~bUfO}|VIoB4JMvJ8kzT?X_?GwxIAq!D*y zHKG(?l&wp6vkjF42qI!I%ArpV5*O5tU|! zVjw`cclMrkpyyuU-6gs_1tU*^u3z!11q0tV6c=5k&n{PJ9|`AvE@CdM2np;g__Ju@NP&b+ZE>@P7L4&sEaK9Z7}F(?z=@hZfKSi%UEb z=l&v%Bp#T8ljiHDS)}p0X)bi`+XL5Ong{x0J)edCE3FYe6zOtR8BOOdj_|yoQ_#6b zyHWSt4CDqM$4rD-l@Fkd=VU^l4XhaZQ>pL4cDJ7Y`(BqMS^3X^Kd8f09K<*qKM}L% zM2G=02I`LL))1AiSxNC+W_7)4sM!CeloqIyg!Ulct0~QJ*FQZ*3ut@s>e%3Y9qG3S zi!Ow%sRT@AoaGZaglN|tN8+kG&dt`!H*s1+^ixqI@}k#rnu~DK;)z8S3?SWWF@(wB z68qHHHj6q?@vg;D=wg!D{pun9$;eJk`qe+g=g$o+cfR!UGchIj-fvb9Q?7Sia&M9C zR#w`u@ug+Vzi{^Jqn#ocmR}b%R1yzbHd35!E@lrPc*n<2l6c?d=(!_3+sUCeE6C!f zkJ)A{zrn!+_x5~TzO5eh-a1$H>2qD|&mOdVtUPDHp-Y=mZbV^Azop;M7HN7vIKA=Y z_uqAGHcdT%3D;s5L*4bHrDIrFvGs>g9=HgmN}N22oA`1@OJ)u%+i0#8lESaynhSDBX))T0q<~z)Thn zU55eH=w1_^9wLxEmja9@^y;Gp(!J$gvv!&ktXf0GbW@4JKgSR96WW4ri{)S(S}XG} z%`7jI=Sk!~jI9ObS9l+79@8L~g8HJgn}3|@%0uDb&=v{`1B%VDRxp5u)dq`q`YNqZuc!zRwZY#Oht?1Ku_ zFyGNXu)uEuA|TwOlWVVBW$9{kaMSkz>{1Zo9h8?MMn=v(!B9&`i(Y4Y2F~k$_a;P* zX%Fa&J#2+-z``G0^gaYL~hS@@&|EqF0LSylcys#%= z8Mui={Tv^uJ`ih#@NyhKAO(r843gl^Np}dQ9pc@OQM#!34KM~Z3o(8SeH$Q3#QTs% zH$?Hy8_=qMB^R=gTVIvv$;4fn`!o<^WB}8AH#1X7xxMu|^Z@*Tw#W@sjau_>ymP^s z*KX7RRV4!&qQg}5vOu7DU~TO~olo~k&K1s!TlI(ZUk{;pSA{xF>oFLHuh&h0sRpGE z@$>KnmI}vQ>P>R!$8t<)LD+>f;2KsC4)iZB-Ny(H2=WMm_`%9=q;KMJebFHS*uCcQ zNGD}7(Epcb5V5bg8vSuGtY0TFTlC157}SgTAyeHy zsO*_4M>LyzJ1X+o*CciV0Umrp;_N%BA>!Ao;)kIrAmKGN3dIit2B_|kArRRyk+lJR z;gbvezV=`FrKpdQd$sdi=e+Ce%zAFDN#o*N$K5PW^CB4nb0_yhgm^Q7dYASSKGX5f zZag1XFWsG&sI@dX($_U!S#tm9alfDl1|@#~S+L>3pv$hwfUQ@z(2n227Utmn z?Q@`GuIZ+{SoViDrO1|y$e6j4Nc3asA@9VUUMHgz1#~uZCF+nIg1vk& z#pm?VU0itF1z65z6rS7g!Vu+ODgI@-mY!eSB)GrsJm&`Iz>y^6uC+~apQ#&4oesUs zC3N5wTCGG}xh(oRl>Ab%SWYJ*%;UrRy#)0Gg#xfsE5{ouTA=%2MhK#OQ3Gl5>X)iW zqnj|!eneHpVTTW0hn@+=$?ixHFrcp=7d2o7uV)np`=`L}E$rQ^d&wwJD8r+3<0oEi zT{V-ijfP!pmEJl56+Cd+%CtrGtdB)TQT#!Pz9C(#%PVOzPrOyq_rpa^@=_~f9yYe% zWv~j+AHjTknj6xhL(Pboz-WqZjj!0TAFGGzJEzQbzLr07)X$Z6ks7$q0UzA8gTglF zhv(2U%f;6G%Sr*G6gmn9ne);eA-xCEhJpLGz&;I`TW( z>EE@>S%TgJ2CgT+|8O;Bhv!N6Zuu0lZa1=C%t_a)8oMV%a{1g8DfsAm4)R~{Z0g|TLAntGkq zAy4)KlXI+CQ%;=z;MnS~%5|d(pg9gp7p2gn%0x3WRpmk9Vfk!-jaNopPWanr@n8GK zbM+fKf=J=l9P*U5+=z^Ia_O!I6cfrr{6eL^BQFNDWzKi;rq(rJ^}b^!3^U7jZ^tC) z#et@1=rZ#AoMYr{{c(5VAH_L*7OHyv$0fwC(Yki_eYUu2U$fFWhuH{ zz^A}-pznmD`m3F3&+2U}sj$G4xjBOeHP$uLflU0C6vX=(ugK31Y-zciYtD-^^f2Bn z@vs!FG5S_2_Ixo>I}%VMME-2Ns)S6~e9C1id5~phTL$a*lB`#d@f;T(28LEJjXnPyk38IK0Q?S0w(8N0k5v+a`)$gKWh;Iv%0;o}teek(&g zcT4)}QoX%{=pMcI-y~J)>+e$>^%WMD-h-AkWZ~M~UZStr5L>ibb^dat! z%Nw0iF#0#GPK@PDZ{a+7^d$nRu14yURmAl{QR|n*6JEpVqMsaTp2%C09EM-Z zxSrTN@rTUn?_!WXvcIw%2_5PsVMgV*=$ilwnD%<1tvK5giQD?~=Hd%-7(tXun!THR zaO*0T#KLe^c@s_~YU-tgb>BY8wXeX8l9oS@JkpNfl6&!(PwceRV3@!H-RC8Ip)buP z&cOf^(MH+?om=JGt3(1S5$_B^KQlw}4HBW)??WsT#0A>uyQ$Mjk!emIirHTMHq^}T zkzP)}CgjWo*(Kfsj5N5{0p<0>^y0)9t7|SF0mbk{={)q4K!H!-L;7sJ-JlAxz7VDHk zh27_9A7FDrjGu|b-i&)0~)CVc40T%JPqQL&3Q zk!^5HvzMqJpv{PW9s)b}2&O2^%L6#gIMFaLho6p#6g{1Ua^=DQY3WC`k^RJ2i*$f} z0sR(1l)(lDW)QvlqCTL{8V^|@3FpYw^7TKFQ@d<2>7rDqK(y$M;cN`0c_vhpq}Q#N|QN0pzuxG!?TFaYzD&%azQ{ekUjmcc@MD~Hjpwk=vU zmC$Vh1-g@d;M|#B;9N-!fo$1!{1^lx1dc;;o@*0FS69sEWW=&Wy^l+fofv1uPrxEr zK)Z#kTPrVQn@pa?t%(h`gR$R6_;US&hm;**A@>Cut>=(jtfE965v|*OvB9-Pin!SG z9whJFc6ARH*tiQCk;lmb<`Wx%70U1q8YkFHSLP0wO-@{m!jx)0I$CaPt)X=#bv;{O zP(oUsn1%sD_|ynj(i|yow@E-@x0%@|+evekiv;wzbgu+8C!nTcrxz!L@^yjw zODM82*l!5%#dL{BkeD+WasKg!L&&?vOC4M9_S6lD&+S&XP6$YzLa|X*#YiEqkE4PJ0u?kdQ#b)(ELt37kOO?L8D82aoG@Er7hVMg?6efpOpAAl6L$|p zqF&?l!$X6%)VwWqRJl&H#e;-e+8@jqgL2tJkJNu~h-0cmb%9)z1%C<>D@S&nq zijpNPviQvp610xZQ<2hME7EM->$$C0HH5g+_arn73!?v6LKzLf63Xy{;@|2RdYF!HQ0QU4N0y04^7q^wWOY(9GpN#^_>-7A*3h?jexNIvdk4sr2K5e)Sgy1?02UMk6JS$M zS4lKW>P7j7Y;&M~=l=9JORdZdS+(Hf$cxZ*h_HyTA)Saun_LzRp#TP>I<|-OLOo!C zwrCqO!zh?YMJ3q!(lMQI9&OM zsT&dk=?81Lj^_iB?O+;96Ihnz`n$qj(u2KPGJo;7F*j2(_dnQ3t3CFtQlsJV?y+1w z3kCgjH-qA{Z?nq=PfYSaSHD3NwM8_=9p%AdFazTno8MBN96O?Hq_yxV5R>_%@*?I> zzJ{0fTQ7oLa-mD#GW?UfO}|!lIC$$d3O^QF{AIv7oCamNAn5Ri0xqj&RhG#hHRNl! zBK6aI;>j0%=7CBFX$iIbYE@>}663pGm|V!tQ)zO=vDsJGB9nYP;&8U3W%je-UZmu{ z6Z=KtHC(C*AGFDVd=~|8ty^__UO9)iy<1%JeZky1mU5RpS9`%zqsBBc=N$f!i)h5C z^{Ko7bG9=Ca_5%sHV813li1D(Ux5jbWx~805h#qFEdsvp=>QI`2f4p+0UckUOl^SQ ziUG;>zmwPj6%Q;rL#l^D7FDWm;MB^LN1XIax50gFS-gO*)aGk0Y%zbjiB&k{u!K&h z+G=<{ia{Jvo+=jnzGR~@Bx9#(<&bmutkDHk7Ntfhy%>gXf}d$ReAm;x0rO-A?*?>3 zASZPpV&X5@4Z@d!r$B8Q2bREwPB_ey1X;l3BE6iNU=T-z?tpak+pUVuA^JcIe+#13 zEr-`}cO|)8wC9y?^z#d1xP30=q<026yy+OyZv@$xaw_>G<|9~uSUz)~6GF6$1^-^( zNxI^rtNKKC+J56BWbh0x`&`Ozc7&zjnho5-n-?S9-R!jQqlC`s`}{&{n(xIxp2)3A zv@a>SwDZ@*K@Ml>w_l&R8;Or5Bv&M+40H+7xF4o2+*sg?vcb-aZMmvEvbUl(pS@Ga z&c}jcv`9uIRP;=Y*(4?f>5#WcXuu1fy*QU0Q%VZwT)w!fW+GIXH@F_fUs!5%%d@bt z3~_Dzq~=^WN$U}3bPJNv8oDEgy?aTKQOBMtbbd@HL|0QEvtd(@zhe9j)b6}HY%&%` zSvcjr?sI8sh0k5ukxQUNxF=F^&RwLZNOm&Br=Ge16s&&LBq=TUID88HHF{vPZoeWq4{0(yZ!r&;p7bf1^36Yhm4L;0Z6%;D-3mnKvGP9g{i(iv7#8lZyt8df=vE1you@K{Rt;N@ssqbQuX|H3vgf$&?_mNyWq4r5I zUPFd&l8@F~1^LKl|MT!-!wW-Pu^18bC(s8?Y5#}`xC5Y~M4?cT$`a65M~u)~qJwqp zV3q#`+_*wr(Sz1pPzWF)w5s)(#Z*201I2?dn0MlxMn*M02kS@ziPr8rVAC7KU9o8g z%rh_#?V8r)nz)B*2uv@JBH^8e0`VJrzQ$_Dg-g7`6L(-jP zqsC`5T=9b-RnN1b@Cfz&PZUmoogy@-=gAk{$w(%OXH$#WD{|&1->t{s8(FkOW?;oY zvr&NqDZxIS^&S75Cd!Upst_k#W0L0dvA$~mF;<7AJiKnc{RW=^_%}1pd}{}05^Fu4 zGAls2JuY4x)Rh7l7t&d&!+tGiQ_$Xh7%2Ev9sq&6cq){3Wv43xdt^o4sn=S+&q3;~ zATaK?QpG)_oQcHwNM{FD_BC2~ht8P^r_rCB^j)H;JN&^waJ&AG>iBpTFrd9eu=2KT zz_hE)K*7Lr$YzP&aC#FT47R|oUVCdAz1$~Cr0y+=bB#{-At;qKpO%lxCT3IN{ zdAfLdp8`3njNNyqt$5)MWsr#8yEY=@ zc-Of#Zi06oa;3NNYL$#wRZ8&2if6#VWTEdN?E|PFzDZ?Ra=jjf;5{zliL=CYGcKYf z8-GydfZn(Yd1M-i-Stb>YSVMQ==g$R2_pMy(A#=$5mTmgNW@Klj@ExeSGov0$QZbT zhT^ck9I&M4#4HbM0QqRpDA@s~m}fET<&`8d205A7IjqAhRuS9)LFh8(2^XO5^+Rx) zvB?}W)C6RuZb;?pS0CLJ^Lt}W6_W)xZ0bfY^SB@d2EmtO$bfsYH;SUpOj^|XN&Qp4 z@VlfZh{YUCI}7-3WX*X(g-)_Ta}6HI=wYP(kyC|F?JH#cV}21czFy|MT!OiMI`jJL zs%9+)SS8abis>QRb~QzW+L4qQ`gSC7rWoZsA|N_vDn9x*Z4EJ9mk{vtGSa{~Ezonb zMy=*2?DaTE$^myBNHZ(Y=z0I`{#f@rq7AF1jn3xxWV^OiWO{ zpAiFOBnu}tkC7~L{`N+W)iuAlxqf>y(qeLW#`j^Yop)_jfgr#fQ`|^bP=uczkjtjq zPU5qm8IS*~vCkT~PJEF!Q`gDep}}oS#lD&AO#*bDp3q zZ=T}vrC{1F2eF>U)0y_=JZaXJlu|?X9{#)7ZM%r(4OG9b2BKoPhMv_^sxR7DzJ^y< zNUL3IKO72P_j$uHm#W=**ZdF3^tc7;ybd9y)FT`#@9!F%2K~zs&U7z-PCy;uUN!yo zY7odp362F<{>}=UIiUOn&^ig&u}CcaMQ-^2HwF9t!MgM6#PB_rX*IvW3N)7=L|t-f zxyGQ~-ZvK30fTKvxpyF>i!i_cz4jZfz|QaThd_pxz-qXvNg(g)5_vjl0wc&Z%&1R4 zm&XPtWonfq&C;;;0}9s{=kw54#%k*;xj3WUlcyqNle*Q77)TWnsMaJL7TvypGS9O3 z_tH{eDA6=7q%ACB2u5K4P?`x7zM1d4RbnVQ)DP=FK9|$f=~>(3mzbi5Ls5+5j)L{2 z)H0K3^nyB-Eu9aG&&Pm5B|mv^9-_r&T}C_*5-|La|^ z6f~cAJ*(}65!+ch1};}84Q1jorE#BoxX0^`dXb=OB`0+H4GE_BazUB64bpm1GQoUl zy9Fb#<2guj09ytEg*1l+EDqgI#?)^Y*F}XSJqa1GB$ex|lNqP$K2WehNrfz>r90dLy)IPNnT(Tb=zn`csQGA|YDg%O+%Uslfl{UgpBf;yh3tR;; z)o8G{2J09WI9M`_ZsP>w;P!?=-(cl1$2Wlp_BkZ_)uKnt%=;>f{h9dG+UBor`{EQv zBaEhUM_Vk6{k~Q2oTqLGLa_gZVmf_XXD2o!4lpbV0S7c@;htvd1dMPmxcc zf|Me_qD{ZElCX<345XX^phLDZgI^FKp(}hh#qp|~Me$Znzx$|yncfX=M`WRa|MXq@ zmvEDNXuK$=-t#%%0zALqq(=V+Sv9T6r=NsCvNGx(3n%8)yAY0e%@j}P?jVR{`8oY{ z>ki*f{n2lre_J#Dg=UC*f{%w9_(c&GA@{A_OuCaZMg+QnJ`=2)$jY}XN>`{b$+3`U$}R;Jt7J#k&JegEaFkTR z!m|gSTgw%^8Tt`4KUC62J}BVIsMmeTDRM$ZVE3a?>5=TSI5vz?ouODN*%ZHqX`ak- zwWsCSG-}l5(-kbmgI96iTQ38z={YTTEpv_pvQHCEzOxOx!>LdBey%V-s=SaVTXMGi zGyrp}RpLC!_=T5>X>b1j0$ux?77?*MWVIqXmLQ(z{d3~Mdk=qJBFV$($y~kV^AnX* zpwJ#fQ5W_`n&Ir+N&?*yO1v}b?BGNn*8w-$VE(%w3Rf@)rv$y*hbCiVw9goPsW1En zho*xyA8HIx^&A0Y(T}4DO_Xi1C zPtm#ASX84!+xKlcg`-8&l|t6Ydu4BzI5F>mO+8_H4KT>UZ?8y3>w_v;u#>#5?5vj+ zybq8*iEO*a&Ls?ocM!;hL*?rwO|M%awwutbDAnQbg`b`>ydBA=_Tlb~v>sKvy9L9% z7wALfL7Vu~I2WkoM7{z=(2{ZM8lb2A2{<${jltHT&(TV(0x9g*;=dCjw=@(Vm*6}3 zLvad!z0Z5R5`QWcXJmlifzW53^DZj{d&y6C=41Bn{w}$gsp?&v-n&RMWMkTl#48fkAQV7=jQ4`?I%W$tYi}Rr9XdQ}xDm?0WHOcj`l*%+y zd28p-D!c$wJRvc2(ML94J1V(u|CM3(EUp1K10^#-fGknX?VmcMY#y@po@q@_Ydl%M zRI9k#ctNR2{{!P_P;cEOGW+ z1E9u#56<4eq@F&gVlF_=`b;lpWd-eNOeP0r|MO3m4Y(NRs;qo{+Dwk#P zKL!8M=j_zL@?aM{a8MFKx$=|E$y^)Y+$xC+yV2Fv`*!4pV`CY6%_RC&%@h?ITsv-_ zTPa}Cj#AtbKt%$@HesizH+2PtOI`-D693ey2nYsVus%>lEPhiDbH@uVqi!*;~t z3A39r?!U6xpQ;|xa-gvCwC<*&fCB^PpB{EE3>XOHN8lG_If9KMF77-y|0~yA`B`B% zO4Me6{lfpZYOr}g{bpYw~G^vn;Sx6YnDHmpEH+dF(KR+#9& z-1%RqBD~%~qJZdh<&x%HE6EDnx+6xI><9F*?|~?>IFiMMfAq}B!Zfbn#GJ;^UP}JH zgED?L3VM%|&EGn|V3uXyPFACqScnda`X@K#qUZQ5Gv>f5j=-UZy{!mrySH-n&&iDLSm zi_n#ef>PyuA;VlOVLNIcD&*%sK?Qi#J)bZ{FloD>-l=T^WRU>SQ}x74K|Zmyo_5S{bq&=x z|A*+Sda3Sno7^P<1sQkkTmt2|e^Lf5CDeX&nzK*_)*MzPpea5XnP5jRXm{T_6d}pi z;o+~jkUaZ4&ME!*cXf6Vvl$|x%i5QNB3ZB}HgOZjhBYAO&v)b+7s7nNQkJ{mw_zqp ztU>U*qDSX}X;Z%Mrj>wkT|#+PO!m5-q&Rr?*Hs!Kle9i%I59aj-a-x40-7wRO{P@c z#UfwhmXf*|1F2!Qd34C{f8SooQ>@KD#Rm-`=-w?u(s#c}3fZGjKP5GaUJU--DGy#) z3wCXxZF=X9yBc@BE{#KI1glm6XynAMYiH!9=ISp$FIv;|$B7N~oMF)RC&+=d6M zKi#|jX0_YHy}7?{PrL?^JNc*O;Y%N*WjBpW?{!YyaNuNxtn6>k^FIz5E_fk}Ct6uG zbtxId?}2OqP+$Xo{y~STBs%{z5}Q&(*W+#vMhSPD#w zd~avkLzX&wf887WT_P`GMu5=Z!Qj3JYgTUmn{5U1=|KbT2?jfO>rK5! zM~~=?FgLo=`g;~bm~xFu6Nx(nb1!x#WsDHIBX#f-# z_bN{1cw4$dRWC78-+!<+>DAr!(v$~VcdKvy3svPueNf<3Xr7x|8^W3=TBglH?or8~ zzL`I?>mISV`mep&8wDUrmPtC}fb>SlUhrIBQRNT(0WFlBjOQC?J4Y}Q8CH7xn&+4v z-+%aUQyVJV@;r}_;BQQ#1ka-vGfqtzdI?Hc<3*P!^{7Y#M$XI0uQIkd5nQGnHSfGe z)W;TW(m56Lr-%I+l-xxB7fpW-BI&3dAtpC_4}(2H=^C47MP;75()Zp&w+nm!Lj5~s z!#k+}D{(at^nQ^l02GIAMAl;B#M?JOOkZ2Cfmp_rsHy86ITOO);k4d}k!mV4)O{`U z>iju3xwBt;=LZrZRR>?Cb$Ryn!-MSmTxgz+{ne|{n*_gIrK9txq)7oXN%X#qT>P{E zmp$DQKJCnJY2wOGPP`7ZIWZ+gjf5EbkotM;)L@-UKWS>9I^osf)3aDK{}H&g zEG5$GUn3EE0=DdlYgU_1EAFE|to?anXy4rvu_ai=@=j_`{rpBaQ10*$Ff3@FRtJ!$ z25d(#3HXEXv?0L8+7a)_BUt0jr;dn&S^eNTs62s0Z@2}CE>u0K>SmetGC%EmY7YPI zA2X>373I7G?p<3T`XA|wm>w8cpEK}!JZ0REowd_{?->^BsdxK| zEH#!fk1!f8{deX-jvY3XMV$OXG@h;V`!QUwTVm1p4FnN_R{_7HgN2SBei#d1duwN_*8G?=7~w!E2Y{^Ih4Gh#C;Bc3*q;#&NPtvmnjA z->qEkvE#Tvij-?c-Z^yX3xhrG>~K6^gW*{K<%!pV5C2e-Sit&7rna^`hL@U6CQeK4 zSnru?PbAycFA9#lr(w54<}Xv-{@rrApkbHhMtx&TIsUEO%>wQuse{vDU8?_SLp8^y&6i*DY@ z&JDYSvh|M>#rj+8sjlCX#qIj*Q{??*Og~KM-;C-}k3Mw!Fyl~=4~zPI>Y?7F(gvlG zFH`)Vk%6}G<-hQ)(J^N*k0D~IZjT`LPLkFd$YQhKr7>$|3@O)e0EE4u@nPCFZ$D7kt{H8Gc@xrF&?Ij~n>|X%3=x*qW zS+s%ZmL3NO8?fFvNM?%=CT91i#W^jkiDXx#dqTIe$0xZVUTux_2p zd?6rG?j&|;_f9NZjnic0&F1S$DT&BdqM0fRTQ=#&N|yx)UofY9_+wVXT7vQBXDSg+ zTA{*F%DHSMir3BFVgTTUOFVS?d(-l7XnCc-@}-0GJ{CxY+7r^a1 zW8Qr+eAUjglBhAD`3p~f+3T8T89J>{y!~o#G*14YYN>*2^zT)ur_f^ma#G#G$FTkS z6&lQLMGt#!cLa;>Y^`(0KeiCk^RGbu2Rhfak|obFs~o|OwOtjNnjnQsk3b5g24Od& z*-fbsd1F878~+A9yLIDF(Tm5iR_%FKbi0_ip`;Ww8=}OC)zhgcN33IJaAl^U+Q&2C zPr+_%BbbPv-9#5wat!?XSjEcK|GAtpI91A3Qqda$_bbxLRiSro@I7_u=S?(m4^gh( zN3>?%(M(Y$;?T5WO`dzpaowzz{iI2hMoyDue6)~Kp|ryaZfn9og0S(UkH%wWfN4Z* zPm~noP8x-;ZtzF{(nu7^w|=00ZFVDW)%SFN4cXO=fDtwMc+VaN(T3%W5!M!e1?ZXd z1Kn61s%_qi`JU`XS0go3B(h_*<&%3dq-HWsZ)7)upz^jR2OC?xBP0A@yGB2I#p?#6 zljxt+Qx3KVkAR6L$|%xRpXbRBzN9Lvo^DTs!SN@?_Y^W_w+b?~1_ALuWff8A-apx! z-5OQp;L|um>Rc$lBmhANZt-mYTk*0H^TqVU)h$620Lb|W4 ztW4xoAb`Me;p8kSoqM;bAF4P#N$@hn9E71-ov>mbeoX0Lcho##>$*fQ_5KGSPEuCT zV$2iG;*U9%%E#6PcPw=olr^(3j$KC0l-Q5-5rm#yRnnP6xNw=@Z06JKBMzsi|UM5l_h^%m;=??j8 z1?`wDEEobLUT8p-0=)V+D@$_H8pJ;G87h{(6F=784Rqjt{E%zomL(X#i0oOZOBJHZ zp;ll9L)%(c#DcP)uMVIU?~=a5}V=IfUG_}f{V5l;TW$c) zuSDK_1H7c}Gpr{fsd8ks$U{{xtmuk-*{(R9O{OK*r(d39pwoR1Y@wMdnSW2e`1+p; zD^)r>V!l?o%y;OA{AcmJYi{3r2L^c7H%D{zp7Vb6ZSyC2zm=cp_-QxkrF9esIAe$0 zBgI;)MyS+oB%@hT{}KxD_tuZ88{q46JtBFOOhpwLWg}vUQX^ZB<)q?1@3}Qh6tnFI3nE|aq{l6`gC2I|@oI(oK z^(RN}RKd0>-O}m1^l!X>KG7yw^K@Lg8owzvV904V@(qkLqYKbHAuUACoh z2o8(%`jRT+HRmxLxREAy!w0&15^I|}Bfpl1H);QSdYkSngg@hVM6TTsl&N!^q1>!R zCf`3dPkP&AOv6c}ag+Pag7*sb>uP(t0=J8ay`KU(BJT+|=JK>p+!Gay**X1_A-E+iUwmh>z6WYD z@i62b)`jw9{@rd^Z;bBN$m!m!U7*Be)qAOGW3|q+FTbB{=0*iul0booRfs+n93$F% zpvc1u1%e0p?0vxb@O}q8o6z--UCwmXp$dV$0AUH?ocduTj%ssQc>2Tok&JN_z$f0w zeArfIlX-uiipz1l@JX&}l)-VR24qMLX~%G_H_3jX8RKS}jsqzD^*_0)v~+4McN@y< zm#>Nw0FUX1;yhlib46%92bjepUl4~?_i3RH(2;ezGLKU7AGN5>6pv~Snp3^w2LU*w zfcQVla&Zd=jr_YbidZ@ugt{dnUx*BJ35cCayDW_*o}R}t8gUozt1D`Tmcib{CA<*q zLPfMJ&qmo!!EZ$3k4`fKwnm<=Y6)+LT^}U%>Hd=iaO26N!yXP6F~{LFX$hPDn?-$c z*1gwn7x0q4U+a(0^VvxE3U-*TkTdubH8L zXDe+@+hsm1g%JsNo|(#5X_g7=+BX3-T;gs6*%Wmr;O-k-y)8dKF7FCs7XRk$3i7;d(OS!U7 zuB;1Pc{z#4Y-A=@JoY<(uk}Pkv4(r|LMJaHH^L($Ce3_>6~K1asy0=L7aQ9CgVtsw zphdY$Apfyt;t&Zot{eI?WI?^kl@kPVy9%5Z)UKKTK)txv^-i|D_~_ETuF#btx|kP5 zhB5b+)7&P!d~j8-eZKGQd=V|Hu;Tw)&&ty~qGMxTrarxqIgqq-IvaHt$cSyHh1Z(j zsqy2=*(YA|fN0^}I3ET`uT|2ug`LsXKo9_hjr?Xi`YaHBt&KZ#oDn%u!k}OD@(Z(s zy~1ELkE-&x?_n211I@d867NvC^B?Wcr)I`)p%u9o^D{i~=f`~-9bc(K)MJ;8w>1Iv#tXH(^GdYx zj3u@Bp7x8I)V?)(#{UP%&v@&QMNx|gx6vWSE?B@yvnv9gM=5im@V~Iq0ai+7g24LU z+`qxj&ni7aWoAuxk?{u+0;YpGT@wC6$-QYwfPJgG-^X0glHYM=QZVhnUyI5A7aWiN=n^x^G8kerR0`V&dW5(U~djd)Ts?ay;_ySJi`I@!Bygv1XGU zeUv+8xZF^SEVg_390ZD{mlh^zQoqm7L~XA;uR1yA;PUwk*Idat?^-BnDew*jm%Z7Ba%VVaXi@PDL0zyNwGBi; z>-ZH~DVI65WU>`F5IC~>^)E9{>fQb&Le1ShS){Alxoz6ynJm+Nd8=T}Bcg1`6bMRh z-+PK%Xz(bIzB7OPx5Q9exgAV6Q+gW3-sAMuY9#M${qR?h&2@a*E7th;#}qWIixqA^ zP98ZL2cF3Jp7d6H%_R zjU6*SezPMh&1Un(vr!-L=8~mEhN9VWOoe)6X8y~5Ybwwth=P%iAx|u9L7-N(^p?*8 z%hWLDxk?c=>b1Q|taY(WRMp6gXU4-bvEdxg$N{0_8+!tiKf2W#j6L9U8ROVz6d%7K zdKNcQFmR|z(J)5Uj%|_l>-Awf$UnLV%zrQgdhX!cu_1rj&_D($mWj8Ta7)k6{RqXs zhiVz{rT;ZfpmA;K_AELXc_1#^C;h$%C6GQ7`<~O+&b!7n?vy@n1+FJpMKean&MWxL z&if?A54P^LIZ4E03eyiYOjO7gnHNEdR^tZWl7AaK42~5Fh_McQ^^N>v<*oEj>3p(! z*zRJ>h)M~pHyIjhe(~k*#pQp+Y+w@B7d4NQBdaHWZ_?1fnAf!N3h|jxkvIogxX`T$seu8Jg_kw zbq{Z!`K60pNOcwWW0~$69>a2meV!qR)5sl;4J$t2aY*KSI%OX8QE~{?|26f5Oblui z6SbsD2|qBh<3y`?j@5c043_LS35|uzcwR+VrS-FKPM@uPS{`~xV+ESxg>uKf3Zp0- z^i=ye$^^iy2J#wN0mNjwe^Yd@UX_@7ZV2!O1 zAUWH1l@mlJ2u%45_7zyxuPS&c_GfsXzVoKPM7~*=c8vLdmf`u>L45b1E6`E8!@Ab{ z8x2|@N^_*i1{#AaiUz+;N8TRMp53?@2z2cSaI<)4Mft1jC&8E|pV0gcFZU4D@f9MC zAY8os?`X4Zv6s#<(bkPZ&tr^MpRhAHqy?--rQ?eFIR=G3pjM(+ONvYjFQU-4!HZJA z-IuVIug4qjIWbRB&Ly~X5aTX4NT!vaEt`+pD2`84&n29mDq>A9w0R#hrnZd|P_NwZ zYr^Pz7BVBb%TLki8?#?=i>aB2m{shEVY00gHp~P5 zA->;+IYP-XLvLd?!X&>5cjPm1CC^QZyfa%&n;t_S~@KdnR#g=s&{pJ(qLf(ihuRz1P zJ0r&P$wKAS8EZbbOMVDol+s11o#cN)W+lz-X1q{gNQ601c?|S&djMG989S-MPI>B1 ztIgIq`gmya6Dc$jfJA#Lk_&IbmiT@=wRxXytrE#gJ^ex$7Gsm(gChTHek$yc``TG1 z*SEeKW4VKiAIspoC`B_!25t~qlC0xNjUU9@+lUw>R*k=56}!HH5cQ{d2a>1PNB}32 z4^0fD?oc+Vt3cxK<@UaOz`x`7CY~eDQZpTQNQnyCL*M#G1VA+Za=RRV?pm*gKc(D3 zH1vnWxQ1{;Tf-Z*3-#{jS&g96 z^5%)d|Hbsc>pu)(ri}#Oz+=~vN_T#+1eyVKp=GL{`UEPCHpBP(^?8`y^7T0%Oj^e! zuNEBpbPJ>Y4D}oSXF|ZiPdcy#CurR49_sW;7SIqYoSCX*=t~1v{HQt5wN;ET#iHc; z-0+Kj7yiYmCNTyk1W$q3pc8^Jc;*mf1 zsh{*M=Rz6r?%Y<9^wo(E@~Drp@pN`dU_{Pp57_{%>>3v7iN&RkijiAjKZ*Q1nm~S< zYw7t8`*thUcqT)6t5fTfI9%UpJdW=|?->WDd2`!B!%_Ff+%jycjS@!f(fC(V-ea7Z zM`-65T(dWPmJ7x=X9&Ic*IY_D%Xdj1k=xb|DM;4S8w2|pF;O1h*%6% z#7}N>@Vzu~;i7{1dP+omt&!jxIWiejAtB1_MbOo zCHlVsf$Vo&U*H>9E#M>167e}diW|K^Y>OZiM3CCzck=RtWM8i^6W>O}l7M)blH7_h zO4UIq;60o_^J&X-sEGiqhYvW=;wI4Vj|EgOx#rUtO&*SM4+}$w=HlePr1t*JDrYu2Bt@=wFY*+wHAkiwWWpX@5j9AsJ;(@Y#cVy%Zio19vwMa9#gc{kW?@}{=Z>Xe|(tGH%s!uo0XKiUS|Ci4lt zmoT+lu$W;~-|0O6MIlrk&usCU=4T15+{X+XJr5j(4Xb|iV0@Tv8Ek)jWhN_DrLI!u z0H=Z6%~+w{!QgdlJ$#{Z%bF^L`C=$^NIQn(ud$z&(<;Joz5J37k@oB`6%P2pe=ouJ zd`6y4z2UC0$&2Naf*JjT&gn*_Rkc0EP&tDQA$aTGR>SYb`@Y4;UVXGP4yJ1WS187* zqiP80lgFoS1Lv)tjr>HpGIT!L1RaKxnwGtov3Og+duWhK5K_oDVA{;=j{d1q4N?7g zP9V1{=RMR5J&8>-dqQ~k4bya?GHvczJwWN4#p$`zTsFZtp$sOPSw2wX3oS^Q7r>=;P~pkTSQI_mW51y-4j%oeLWE|V%rILNRbe^neQS}F7~A=+MD z<;&&iJ0r!+>P!=o3vD>U?tiPlEq)_V$L1(2DcA_8jD#jj!o{vZtazY0*Q6}Dw1;0V z(WGQn!rV5U;{Q&q8~*z2Hxu9dw?K6hSNk%wZ&jqlz;pDxL>i{GGm<-AqV2a{J)UXf z^KQhvRT7|Tvk*V%kFr+aF(Zgt!hXuJm(!|tO6yV*FDC4wUpZ%=TA5i-z2~Y{gpNtJ zjQRH9f7x{r$|GG=qq@^-gqAA_B);+=7;+3q)Fr07yv7@$y$Xpv_rSewM*psiLZOPw zt%d~k;*$^*Uz<5{&}3M?--U0Wu-Y;V_k?*u2NfjPPfHPB&epQn_!Y$X?O*?0^Q%$* z(f^NOx5(G8B5whJ4q{ufnX!M?!8GWT%T(gm0cnmRMGu{(GxH2~Z_gE^w94Dof5y%A za?lFHFp*}UES^*n>G$VkSrLx}K$$GS?))HTovkdO@JIrC!OZn#8QL;BV!g=-p~DvU!HS7B%J8oIsO)6qAXLjv-T=Q}ec z0TK5}ATA(KedoDrbI!TzTs{G^czpT<#lIy*8G&O1F}^hfDNam%bxd9Lae5zDFkGWh z$(krpC8NTEef6+Y-5qs~&L~!q{=srK)f-i5EDl+5H{-udi%V zDDhc-F&1f1exQVLLV3j^;zwV`wl>~`c5|SgY9bsTZr{E7_f>IG!)C8s-f&0m2K3u1I0m_X$ooP|)DG**$ z4i$q*LbtRUVX80lF~ZJV3jGgHZ+XiKDvSNMqSoJZyL|E|A&rK&RSgdCVvs+8 z)-tUH-IS%=8l7>Dx(#B_gd`HgMUQu4ICyjQHq>I+a8NL~-(4hNwa0f|cBIY)3d5Z7 zVhCvc4OR*B%4M$i!6b_^A)q9Ex2!hAMR9zR+I@9u-xMVF!3xWEd4$bS*pE=hm&A#+ z&WDKFUfKx0F<(r6EC(MVZ=tz@AOgmIKQ+%IxEik^nJ!>=#)s9<`0hfR0k;1`6@?Lv zZGx1wN&|AzX$x|gRE+cXKwZ!(GLL^B_U;>C*P5tP8UPp+UOCUxy{>31r#6p^bW4`o z>)G1fi#^^O@8c+;Iaxg|p>vkH+iH6AzqM}v&m8?<=6NBWclVFYw-F6)^GE-3&FjU} z3w>!Ke*3tGE#$QlIR+2&)LE=s{(ADmVsMyxh$bp1Z1vO@_OIcAKndkUb_aZu$s?j7 z=vu8H$U%v0V<1f;QNcU}2$LnN)H6h96bv#Eqa!N~@TW{h3B?}y)R>}=3%p=S)Ss`o zEX+rbSeYcwzz=J^rfJ#`>y~6NSzt;1|C&op!Uo2U zH+E9X$u8qqi!xnDZ<7M__P&hBR-u&7ylg*^CugqAeof#V5JIm~{{Wh$jj7bkyjMAW z7lH1$jXB4*wgbLwA9o-+m2Q6ir>QOzAMWgazL+|Ef{#V-32M*5*^#Fkgx~wP<>?Vz z3)pg?U7v_0^c!bN_-=TWzm5rFuS|raDRztJFsmGyFd8%Ok<)4U2-+5h<5S23jjvh1Yrz3>V1p`+!ac|lLFDlB2R@i#>3&aNlSA>jrE%=o2zRX*=-p~YS~Ce8zUB48hFaD@!R$IoxLT}&Q7vJt4yho zn8ImY4oTS^)|SYO*pYUfu~RG|YMR)BAs~=E=Dwr57?^2|NO`kk6l}?Lx4-!`cOx^v zkONw>_vfaz0c^xBb2^dZW7zyfs?ehCwm+~LzI=>$7k!ST``hXfe*-Z4Du98qIg?x< z*t7X1;fQr!@y=XG1*N_fLovDM*qY9|pUusTA?X+nKG>s5T%|K%H1aug<1|U`sLc_Z zDLT!P0bAahSP9~gko9R}$8LM1M#=3g`gBlfFCb@1FaH%0FJ4y!vRnTw@Xz^^@SNZ?L}_WJ}Nj3|<^G^tGQw50>^J zN>O5J*W(Y7ey=0rH*ixtdgtl$T!Dn(6E9fjFn$s?Lss7WmZJP-Rb?i! zhZc$#+?d@RK%5mj3l3(!gS}(B)Y_8qd0v3aq|iz_yx^o%6d%UMhrf2a$r2DEaBR&@ z(c5a&llp9}xn+UH$96_9A8TwJ;$EK^kCdUX$4K3B2duLcSi{c4adp;jJ&NG%0gc8z ziHvwnT=)i_hF?S>oNOacn7`kb${Q=Rf$jF3trW@h2t?S9=f9|4Dm{(HL3Ghko(^UF z^49wr#A>L^dWzDidDz zmti^JZ!}gk1MLC5mt=93Yu>Yi(XBzjST3O#n+FC}HZU-Z^(_qKzcU4p%)slzQrjcG zLn99svm}O{W57%xpbnhsgcAq$wIjXr^n)%++P2FaeX1TraDv)R6~O-kM` zhJDbV_F8}Sa6WuKV5zA!3VZzi!@SJtocxA?hjzNJ^YMF@ugyBqiu06Rm3d+4wao2vl!#w-?jYBg*sCR^7R{|wG&A&|%vI+YjRJ^?_7yG*6 z3jZ$$@TIq#vxzqg5YKnVS+ZZTSuNk~JjtXfxotU|oWHF&*=UDLnsSf|Y2?R#U}*dR zrhQw?-1FC=%Hl|G)0nhrCTqz#JaIo~zhg4`ExUYV_evS>Q#Y{5cZmA_61A&*CV1{Ow;q=deeuh#xw4JOS&sKD>OK2K$>T)QGo_9=JehNGwdw3I)M<8> zGg91=#XLrm1m)1%Pv1M*GwZ6A$J?LPl~}Y|Wm$tH$|(wfs(|Kz=D&MO?mg@jx+6iw zAuseU3D26C3qy|Oiw#?tOg2hdgFe6UKGYiYB7WudJnJe$RLOspM$QV%GVV-u>lZI| z*}z3j1R%fsr8wLmOLr^7n>gfR!J~Dq#hDb%I2Lkf^ELJ6!oc{%VI5B=vf3{`Jx0~1 zd)j_uBHbhY?E+J6f*$vY?&8l7u0HX3NTkP2#zk|9-=|iprZiSjd*?8tSCg_o z@kVo_WZ`+SNN=NGwu9XCue0as1r=+U0+a=)EoIB)C(p3!Y~Ccf-jn z5FIuKJl9H3LP-roa%58|{(9rBmG+9iFp;~I2RJY+jV1VZN4$_^98`A+k#iGY|151C z)=h72-UsBpbrfFtA9p$}6~YRry1HJ71qk0rf3R_N&<4hDwLAa(T+-SXPOWNo?aCsd z-1^}eTN(0xK9Vfa3QmO78R4lD<*s!&s)_xihkM@@JWbWwW3wYC|7B%|zeyt(FA^8` z>&(iY#rIl80W=abW~#>Mlf`f#%%aSBi^p>H)qQS(tcv$p)zm-zW*L`nl65_^K}aJv zNW|^aHshodtweTaMhtkbPFQVyzHA_od0sA08E@4%qiJcLjkFX9M3#tgO)-#1##FY* z%%(i}a~iC%xaum%B>9aZoOvT|x^tVR1G4JK`z(=uyOnV18oO5L81z2oIkRKI3v5_y zuaoQ0VA-=jv+ZDNf{r`VNiACtG&Nc0-j` z?g+5tboceRc0>GV8kBNJH`{)yy?HL=MMGa4YqeY9yX!`_B>Uy2KC#ZY?q z1z>EAEGLPS`d9C#+Ep)wt!;eu&Jnqn0SXIcDH^;JwLHpIme{6hs&qN_G!7@U<%%qW z)WnULwf)2&UiYo-#&b_pe~JPh>_o=PjtAs#hnjqhI_CJsw#!b@no1t=RUEf?x?E65 zSXxSwVpSW`jI~&LeBVE|%tm7kDgaal%if%KBYEm&rm#db0|}RA;3nC>|CZjrxq)7_ z+Yny{0*%NB9@@^eTt*+^p}bt5MS({sZj+3rSTQM9e`ze$_=5L+p^x+o{0BEgMR=&r z&Iz&H`H2OhZKT==Zhg|@((>dVpX18qlqa+!ZI3=syg;>Xw4Z+rUiPC^;YA~5OA%i( z>9NbV-i`BFkhKzJ)=`GN+%B9tTUga%C`7_4=6oSzypANto7R+3M^PF_|8tqq%Utm| zLYL_PT+lA7UGTY7Fsg-K{q6SUduo^{Rnvy`8m!paMnM~vijy?Wo3A8hFLr8K|1-(g zUA;o1mZ{@U+%_y0AS!lsOwa~Zzhq@#wcx}^t2~3`xKgL_7sVOZ>uz}+vrGCm=Jq67 zY@zF~F%S2vZ+x#Qq0^e(VQpf5ztd;BTMRwA+1T?D@khzB63i`ebt)Hn3!r2>YG#V+xsyZNb$5d-v;BMB+55v%KERlI-a zAd$YztmeKH_N5&SOY6HUt4rj3LqV;V4Osnge{BbQ%J?NAkM)w@CV%9*g)SpI03*89 z;^)Z?2Nwu_{ZZw}z6vD!uPu+j>ra!0W@u>#40jYm;E!(*KA(?>-f|Bw5 z&G_hzYH^lFc&;O7icm`@+w)q6#C8@B%MF7;JD0AY{;yr*;6uL|yP;1|{IrbsHM~@3 zFQ3>((`ulrKQ->qanLK1XSVuQeBciD?9{&XaS;-f@-;l$M4s|w_Bv9M8`ic}bE~iTR>$hMU+q3{|Gd%x$`))|-BzBOT1Y#JgVV zxfAhRcRyZKZ<1n4Wrf*Byn$=3%s}+}ufs33Mzr;w6B2nqzvk#O5ggRO>obqYSJl?2 zh6Bs?UZ-gI?bKpmX)7q%uK+B zgDfYiIWP~;4yeVZxey9(`x6(v5fmJaGc7%rD!7vO*blom8iUH)f70JgrDDp|pD(_` zwX&+E0`}qIa6w#RtY%0kc6(q5C|j!Te^fG8taHvKi1K=n^UB@2-0BIpcy}K9T<$mO z?y?rgqxCX|L$EL>&Y9d7$8V*HBCE5C@a&ngBP|}p)l?#FjObBZCQHs9og3Z^08)~7 z5h_-fF2SR*nTwVo3gvt*_M`qz8zGO)_57B(y~E?mXLwIpxy(f-b6i%R!R>WTgf>&O zpxh?%mr?7bt5%eluiwfO=5?^uQ(P$F6YfD;GjdMJm8P>7HT!blq<8*f%}~1an1ZMC ziMU3D#2 z$RnYTlv?oHj(2W^YL0w6j*xRQREjt4gC?lt%rx$s-ooua3?GzzyZQ^XU%yJ;dO08y zN5T@6k|iJ8X6%7qtZVL1TSf{y!ZL(yX1|tEUS&| z@RZdZSp+R~;Lr!on5op=7gAtRJV6m$TX(elsOVq3xsb68mC0Z$GYNVmSeZ}u9YKGH zf?pX=L#L34M%2b=EB6&B4VLn(8bd?!qRUCQx7Jki2@dN-XD%=)Zzs-2@z{JZfCBZg zwz$ChM3Omz#vh=28n!R6U6h0G4Zt)x+-G4w_)lK+={~VcZlJ!$DKwk&c^ze&rUDms zLBS#1OQ=4>p57ZMbRfhWc8!aJ3oKd+IkvX=6xUj3-SJN>P|@?z@suNYpiJ_9Rt@o8 zq1;UdG65FF-6`Vdp_2Oy;OuSYzQ$Y7c~8*mb3?^F-j{LIcTQZP^L3e=vQtM%V^{C{ zXJfCYdNSSPv|W7J&{Rk9*iG-$27eY-0hFrLsl*X^#X z^z`YMhVqBYFAX9eQ}&l+X(!j!xrb~U%f9(0-pxiEJMxwCMXN;JC#@n^;ynR_^EYHF zS@8Z7X2ToGUpydG?6cUT+)Gi;d}N2&?&u({NHb)gNI!qHxpK7?1ATZ#Q}WzVLtQX~ zG~UFI^N53_EC0odu`WAjn}GRk$fIJcoB@}$h=Tb8_TPnQ_gPv!5AmRs0W2OY|J zl)^=h>yNWGGltwE*pq=0kJd-*vthX;Bf%t*gsY|k_pJB4%s|FCA!fgChGv;mVVRUg z#%(h@W(taXPt1%CD6NG-F7Io)2X%gB9I7_)N!Z^M9uzv5ry>cnZ;r6^${gvjTOhTf z`N}nMf9kHPNgFfOtBP+=V1(?~&mJdEB@4$ps^$oRmzW>za`#HLms{FBahVFy9Wih% z>7kQ7&>QU1j&Y8IPqtf{)BK$TTU%TYwV_kivuS^GL#IF$ts_a#|4q5cJ#iJo*7N|W z8!*B)R@T0EU;G9WoPd{0Lb=2y*ni@`1K$yUT=mAr-R!5Sk)`KEHX(eSZi_SNE^v0m zxc6Fs99!lUj!d3I$$Ll){myU_^@lz;_dHz@P@3D=Nq65b7$N$j1*hSr&G(1@li)BY z5$H6!`f}mT!XvKFYjh1`MFQ@|noN3;!I+gt7J-AX0gIL&uGv2)+~_1|6I}sYrtfLr zKv4UbSo;iMU}Orci74lffhxHnzm)(ca#gN>O}%sIZfN^;je?%Tolt)tJzJ}==UX&< zu61jwl|qP_4phf6!kDoUxnKUf3CbkWabi<9eE>bl{i&i|eCM6dzQ{S={mz<}dJAFs z`8mGd7rZ!JHD=p#!c2g-tjlfaVyae_DpD;DA@(y@>DtmdzYDVG*C2k%-NGbz|5^lM zfKLBJ4u7nOmH(gCc(7b#=&aUOx;}EH4PUhw0P{Z9ZW-Om~FcaCe;V5H)P^gP>!ZMWDYxw@#u+Y-W%wV9fzHbb{33^*uUf8=PvmS% zDy^uR?s&dBIHZ8id-Yx+Z&Gyc%zumQA}g}g7z)!;bl>7gI0O?D+@k3Hqqv7*1v4+*bWV5 zzFF|4GqM}=u{`hhH?N0s{lY}p1iUQ1Rkx>C`+IEA^Koqgb$-1A8!0k{5S%c%z}@*; z;U+4KGVeVnqukUVnZ&@^cd2e6KY2?kv3Nw-J`ZCb@Q7ipJC^z-@D|M01jz+?+NkW1;G#P=0E!&yOvfw zGU2}~0)EMHWZs>BiM&l%ii)Ke3G~3ZJxKmSSWf?kqXW`Asug06xZ_n~T%<3pUzyl@ zregiMF6@@J{(5ci51QVYNU|#xQeMANtL_7Xfhni?Jk|u$8g=s0cwFE&S3!(B!E_jA zMS@Xy+<}2Hy^s2SuG6Qwb#HB;)WDY`Ld6bnp)zE1*MGSxkwbJ|ZGUC@*&N`peYjJrVFaeRf>KiylV0Z45h8vS~ZZ2CQ@QF)Dzo;Iq%G)y4O3!hwH%32LpR(fH zOx@5Qy-^evp!J(?bcgv0&+F-gi9&r6 z1Em2GkmvJ9(F)xo2eNW)#Mh~hM>}X0#&q<^*Cj43!9g$5G|bgp4V{W<)gx@krFq#Y z#?IkC57})8u~s5j4wj^~);H^KnV|>d$BAhDf#?`pg|Jt*j>byP--|Eqfx55UKw$O&SxMBdnw_0IPq{m`OF- zb=aPqJh5eCO%qk%a{1}tDG$Q9MNWnz z1AFT_b?pjSsv2ErR?$9jtx|gv4r{mCzcJr`r$OjJF1?gCAh&4WIluV>o45Z+M=FR> z!G~{0l{M>GyfLn|=Z5H}62n4Dn8x0x&PY6Y?bUk~xo>z`M4PFG&!bu1Z6^!~{yKQ@ zaxz>d$>dG4YMV6pQyB7tHCrI*8?1H^obR4@oM7#bOAr1?jg68I8M`IBlN{zefV`5o zy_e>xM9VN->6@1C1jj!T^7$nTUG|zs$`~`zM|;akNPQ-GE^WR|RdCPGx!ux&PjI*; zqBiC#q9-(%?E@35`#r`s-;oRV`l|#u@UF``X;h z)`O{0d2e|<&o#?5&lvb5F(yggq#_!GncU~^KUJ1|p$(vBU6?3)izu7&3jJAf{q0hK zhWSBc`s&%DKOM>W@MV_5bjJJghO#T@bVmpc3%_VX;>42`>kwxCQ%2?pTO@7Hh4IqF z0PGZx9Tt|$gz=3AV9c#XMqo%E%(98%gSL2_8K4Fi$sT5e|`zQ*ZM z!jViQMyon*5rMDDR0!#y>rc+~=%n6JJq2<|I^ZRa0TcMgc-rf)idLSD*!vSGF?4rf zt|>oeAH7A0fMbj0Khnkr?LLG

* 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

Cds~Px{BiN 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

1>9UyY^rm+37uHa|q(EKv5>%z-ZZ&y4EJ` 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 Date: Mon, 23 Dec 2019 02:29:45 +0100 Subject: [PATCH 142/911] Add badges to README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 96fc0bc..2bf0522 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Glow +[![GoDoc](https://godoc.org/github.com/golang/gddo?status.svg)](https://godoc.org/github.com/charmbracelet/glow) [![Build Status](https://travis-ci.org/charmbracelet/glow.svg?branch=master)](https://travis-ci.org/charmbracelet/glow) [![Go ReportCard](http://goreportcard.com/badge/charmbracelet/glow)](http://goreportcard.com/report/charmbracelet/glow) + Render markdown on the CLI, with _pizzazz_! ![Glamour Dark Style](https://github.com/charmbracelet/glow/raw/master/example.png) From f090b74c602309c1779c80e146e082347995b13d Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 23 Dec 2019 04:27:27 +0100 Subject: [PATCH 143/911] Fix init when reading from stdin --- main.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index aedcd14..b113073 100644 --- a/main.go +++ b/main.go @@ -122,13 +122,15 @@ func execute(cmd *cobra.Command, args []string) error { style = "notty" } + var baseURL string u, err := url.ParseRequestURI(src.URL) if err == nil { u.Path = filepath.Dir(u.Path) + baseURL = u.String() + "/" } r, err := glamour.NewTermRenderer(style, ansi.Options{ - BaseURL: u.String() + "/", + BaseURL: baseURL, WordWrap: int(width), }) if err != nil { From 5a44b9df926f43eb24a912eb49224273d438e66e Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 23 Dec 2019 20:44:56 +0100 Subject: [PATCH 144/911] Add FreeBSD package to README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 2bf0522..3823e9c 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,9 @@ brew install charmbracelet/homebrew-tap/glow # Arch Linux (btw) yay -S glow + +# FreeBSD +pkg install glow ``` Or download a binary from the [releases][] page. Windows, MacOS, and Linux From aa9ca8ab1e6cb7142c47b1f5dd82c1a99945e5af Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 24 Dec 2019 02:46:46 +0100 Subject: [PATCH 145/911] Bump glamour dependency --- go.mod | 2 +- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 76319f3..c2cbfb9 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.0.0-20191222020039-e4c939e29d53 + github.com/charmbracelet/glamour v0.0.0-20191224014535-3a479d0c8515 github.com/dlclark/regexp2 v1.2.0 // indirect github.com/mattn/go-isatty v0.0.4 github.com/spf13/cobra v0.0.5 diff --git a/go.sum b/go.sum index cae2230..2c4e97e 100644 --- a/go.sum +++ b/go.sum @@ -14,10 +14,8 @@ github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MR github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.0.0-20191220192632-994f646a1953 h1:Q937drUhU2JlhruQIMmiukd/SOfmwnUrgHfqIfju/hI= -github.com/charmbracelet/glamour v0.0.0-20191220192632-994f646a1953/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= -github.com/charmbracelet/glamour v0.0.0-20191222020039-e4c939e29d53 h1:rlx6rlrDUP93OhuqJsndh9Fi1rvzxVn12+i7b9R11s8= -github.com/charmbracelet/glamour v0.0.0-20191222020039-e4c939e29d53/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= +github.com/charmbracelet/glamour v0.0.0-20191224014535-3a479d0c8515 h1:veOhtHNb5vZMTYneGZOj7A1S+0gU9df6ftoWaTo6Gfo= +github.com/charmbracelet/glamour v0.0.0-20191224014535-3a479d0c8515/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= From fa9d64c4ef81e16e303dafdda05de24bdb9f3d47 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 25 Dec 2019 07:01:56 +0100 Subject: [PATCH 146/911] Trim unstyled padding spaces from output --- main.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index b113073..5d2ee3b 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "net/url" "os" "path/filepath" + "strings" "github.com/mattn/go-isatty" "github.com/spf13/cobra" @@ -138,8 +139,21 @@ func execute(cmd *cobra.Command, args []string) error { } out, err := r.RenderBytes(b) - fmt.Printf("%s", string(out)) - return err + if err != nil { + return err + } + + lines := strings.Split(string(out), "\n") + for i, s := range lines { + fmt.Print(strings.TrimSpace(s)) + + // don't add an artifical newline after the last split + if i+1 < len(lines) { + fmt.Println() + } + } + + return nil } func main() { From 79fad4d06c74925af7d8be8fcc8a04f693465bd6 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 28 Dec 2019 03:03:20 +0100 Subject: [PATCH 147/911] Bump glamour dependency and adopt functional options API --- go.mod | 2 +- go.sum | 4 ++-- main.go | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index c2cbfb9..641f4a1 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.0.0-20191224014535-3a479d0c8515 + github.com/charmbracelet/glamour v0.0.0-20191228015520-339b3e9df8f4 github.com/dlclark/regexp2 v1.2.0 // indirect github.com/mattn/go-isatty v0.0.4 github.com/spf13/cobra v0.0.5 diff --git a/go.sum b/go.sum index 2c4e97e..e210b44 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,8 @@ github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MR github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.0.0-20191224014535-3a479d0c8515 h1:veOhtHNb5vZMTYneGZOj7A1S+0gU9df6ftoWaTo6Gfo= -github.com/charmbracelet/glamour v0.0.0-20191224014535-3a479d0c8515/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= +github.com/charmbracelet/glamour v0.0.0-20191228015520-339b3e9df8f4 h1:DrAUDqoZs9kxigJTmKnCECFxxEjtV72prWMOHorJhzM= +github.com/charmbracelet/glamour v0.0.0-20191228015520-339b3e9df8f4/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= diff --git a/main.go b/main.go index 5d2ee3b..c86b92a 100644 --- a/main.go +++ b/main.go @@ -15,7 +15,6 @@ import ( "github.com/spf13/cobra" "github.com/charmbracelet/glamour" - "github.com/charmbracelet/glamour/ansi" ) var ( @@ -130,10 +129,11 @@ func execute(cmd *cobra.Command, args []string) error { baseURL = u.String() + "/" } - r, err := glamour.NewTermRenderer(style, ansi.Options{ - BaseURL: baseURL, - WordWrap: int(width), - }) + r, err := glamour.NewTermRenderer( + glamour.WithStylePath(style), + glamour.WithWordWrap(int(width)), + glamour.WithBaseURL(baseURL), + ) if err != nil { return err } From 66e20b2f7dbcaaed08fe441ea323178d58c7478b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 28 Dec 2019 03:15:29 +0100 Subject: [PATCH 148/911] Add FreeBSD releases to goreleaser config --- .goreleaser.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.goreleaser.yml b/.goreleaser.yml index 3052163..8ee8cc1 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -10,6 +10,7 @@ builds: ldflags: -s -w -X main.Version={{ .Version }} -X main.CommitSHA={{ .Commit }} goos: - linux + - freebsd - windows goarch: - amd64 From 7e9884cc860039908922bc663e1c99f97a338ec7 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 28 Dec 2019 04:47:15 +0100 Subject: [PATCH 149/911] Point out GitLab is also supported in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3823e9c..2b9921f 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ glow README.md # Read from stdin glow - -# Fetch README from GitHub +# Fetch README from GitHub / GitLab glow github.com/charmbracelet/glow # Fetch markdown from HTTP From c1c5dfbb8be780b0bb5b37c7af13c03586133b42 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 28 Dec 2019 06:10:37 +0100 Subject: [PATCH 150/911] Bump glamour dependency --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 641f4a1..fbbc21c 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.0.0-20191228015520-339b3e9df8f4 + github.com/charmbracelet/glamour v0.0.0-20191228050717-d3bde07b2f17 github.com/dlclark/regexp2 v1.2.0 // indirect github.com/mattn/go-isatty v0.0.4 github.com/spf13/cobra v0.0.5 diff --git a/go.sum b/go.sum index e210b44..43afcdc 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,8 @@ github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MR github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.0.0-20191228015520-339b3e9df8f4 h1:DrAUDqoZs9kxigJTmKnCECFxxEjtV72prWMOHorJhzM= -github.com/charmbracelet/glamour v0.0.0-20191228015520-339b3e9df8f4/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= +github.com/charmbracelet/glamour v0.0.0-20191228050717-d3bde07b2f17 h1:I63cxNEodUwsY6awnjaSRgDEp1uj+/MG/gNwvWejHZQ= +github.com/charmbracelet/glamour v0.0.0-20191228050717-d3bde07b2f17/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= From 53e4396a5e32c8f005f67e2ecfbc489996642b39 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 30 Dec 2019 07:09:04 +0100 Subject: [PATCH 151/911] Bump glamour dependency to prevent crashing on irregular markdown --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fbbc21c..1e057db 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.0.0-20191228050717-d3bde07b2f17 + github.com/charmbracelet/glamour v0.0.0-20191230060413-3bd1742b4822 github.com/dlclark/regexp2 v1.2.0 // indirect github.com/mattn/go-isatty v0.0.4 github.com/spf13/cobra v0.0.5 diff --git a/go.sum b/go.sum index 43afcdc..593cdc5 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,8 @@ github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MR github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.0.0-20191228050717-d3bde07b2f17 h1:I63cxNEodUwsY6awnjaSRgDEp1uj+/MG/gNwvWejHZQ= -github.com/charmbracelet/glamour v0.0.0-20191228050717-d3bde07b2f17/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= +github.com/charmbracelet/glamour v0.0.0-20191230060413-3bd1742b4822 h1:l4hl7kdWeN+Z/yhkO/l3u26q1DPdMVHJqHq6bRaCSb8= +github.com/charmbracelet/glamour v0.0.0-20191230060413-3bd1742b4822/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= From c7caed4cac6549bb41fc70001917f444abaae81d Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 31 Dec 2019 06:23:06 +0100 Subject: [PATCH 152/911] Bump indirect goldmark dependency --- go.mod | 3 +-- go.sum | 10 ++++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 1e057db..8e17d0a 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,9 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.0.0-20191230060413-3bd1742b4822 + github.com/charmbracelet/glamour v0.0.0-20191231051734-03172b812196 github.com/dlclark/regexp2 v1.2.0 // indirect github.com/mattn/go-isatty v0.0.4 github.com/spf13/cobra v0.0.5 - github.com/yuin/goldmark v1.1.17 // indirect golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect ) diff --git a/go.sum b/go.sum index 593cdc5..d165719 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,8 @@ github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MR github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.0.0-20191230060413-3bd1742b4822 h1:l4hl7kdWeN+Z/yhkO/l3u26q1DPdMVHJqHq6bRaCSb8= -github.com/charmbracelet/glamour v0.0.0-20191230060413-3bd1742b4822/go.mod h1:pnwzzHkgr91y3cCdPydiwDkJjApGSkUCXj2kYJyVQM8= +github.com/charmbracelet/glamour v0.0.0-20191231051734-03172b812196 h1:BZTxQWfxPM8Z6CuegHX232UZTaTqxaFW8tPjMafceLk= +github.com/charmbracelet/glamour v0.0.0-20191231051734-03172b812196/go.mod h1:SUlKmbBDXqb1iSm/IrR5nbAG6WDCWptHFMpadJEcHFc= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -84,10 +84,8 @@ github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljT github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.16 h1:S2woQOeBdzkMSw+PPqfuVpYD+tEXhLCDtoWZcqL4jQs= -github.com/yuin/goldmark v1.1.16/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.17 h1:t7bl7JAmainKs/Uhmr1XZVkRJsgL2UwdTCtTuYL7RAY= -github.com/yuin/goldmark v1.1.17/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.19 h1:0s2/60x0XsFCXHeFut+F3azDVAAyIMyUfJRbRexiTYs= +github.com/yuin/goldmark v1.1.19/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20181220203305-927f97764cc3 h1:eH6Eip3UpmR+yM/qI9Ijluzb1bNv/cAU/n+6l8tRSis= From be911b4609565e5258801be22d0334eba3765514 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 31 Dec 2019 05:36:15 +0000 Subject: [PATCH 153/911] Fix typo in comment --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index c86b92a..1470d11 100644 --- a/main.go +++ b/main.go @@ -147,7 +147,7 @@ func execute(cmd *cobra.Command, args []string) error { for i, s := range lines { fmt.Print(strings.TrimSpace(s)) - // don't add an artifical newline after the last split + // don't add an artificial newline after the last split if i+1 < len(lines) { fmt.Println() } From 1d4f5c84808b9e02fae85b58b0743f065d7fbca1 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 31 Dec 2019 08:31:43 +0100 Subject: [PATCH 154/911] Fix goreleaser deprecations --- .goreleaser.yml | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 8ee8cc1..0b27e47 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -47,16 +47,20 @@ archives: darwin: Darwin amd64: x86_64 -nfpm: - vendor: charmbracelet - homepage: "https://charm.sh/" - maintainer: "Christian Muehlhaeuser " - description: "Render markdown on the CLI" - license: MIT - formats: - - deb - - rpm - bindir: /usr/bin +nfpms: + - + builds: + - glow + + vendor: charmbracelet + homepage: "https://charm.sh/" + maintainer: "Christian Muehlhaeuser " + description: "Render markdown on the CLI" + license: MIT + formats: + - deb + - rpm + bindir: /usr/bin brews: - ids: @@ -71,8 +75,8 @@ brews: description: "Render markdown on the CLI" # skip_upload: true -sign: - artifacts: checksum +signs: + - artifacts: checksum checksum: name_template: 'checksums.txt' From e7c92ddfa77bc2fdd1a7143ee07c65b898c22b82 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 31 Dec 2019 11:13:06 +0100 Subject: [PATCH 155/911] Add -p flag to render output in default pager Starts the user's default $PAGER or defaults to 'less -r'. --- main.go | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 1470d11..1108428 100644 --- a/main.go +++ b/main.go @@ -8,6 +8,7 @@ import ( "net/http" "net/url" "os" + "os/exec" "path/filepath" "strings" @@ -22,6 +23,7 @@ var ( CommitSHA = "" readmeNames = []string{"README.md", "README"} + pager bool style string width uint @@ -122,6 +124,7 @@ func execute(cmd *cobra.Command, args []string) error { style = "notty" } + // render var baseURL string u, err := url.ParseRequestURI(src.URL) if err == nil { @@ -143,16 +146,33 @@ func execute(cmd *cobra.Command, args []string) error { return err } + // trim lines lines := strings.Split(string(out), "\n") + var content string for i, s := range lines { - fmt.Print(strings.TrimSpace(s)) + content += strings.TrimSpace(s) // don't add an artificial newline after the last split if i+1 < len(lines) { - fmt.Println() + content += "\n" } } + // display + if cmd.Flags().Changed("pager") { + pager := os.Getenv("PAGER") + if pager == "" { + pager = "less -r" + } + + pa := strings.Split(pager, " ") + c := exec.Command(pa[0], pa[1:]...) + c.Stdin = strings.NewReader(content) + c.Stdout = os.Stdout + return c.Run() + } + + fmt.Print(content) return nil } @@ -172,6 +192,7 @@ func init() { } rootCmd.Version = Version + rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") rootCmd.Flags().StringVarP(&style, "style", "s", "dark", "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 100, "word-wrap at width") } From 4690c265ce6c7b5e816a0029a736092d10c725d4 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 31 Dec 2019 11:22:52 +0100 Subject: [PATCH 156/911] Document paging in the README --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 2b9921f..97603b9 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,11 @@ The `-w` flag lets you set a maximum width at which the output will be wrapped: glow -w 60 ``` +### Paging + +The output can be displayed in the user's preferred pager with the `-p` flag. +This defaults to the ANSI-aware `less -r` if `$PAGER` is not explicitly set. + ### Styles You can choose a style with the `-s` flag (`dark` being the default): From 3262d45d82cae6d146b0262bf1f5895f5ae82467 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 31 Dec 2019 12:15:57 +0100 Subject: [PATCH 157/911] Add go workflow (#119) --- .github/workflows/go.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/go.yml diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 0000000..df5659a --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,33 @@ +name: Go +on: [push, pull_request] +jobs: + test: + strategy: + matrix: + go-version: [1.11.x, 1.12.x, 1.13.x] + platform: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.platform }} + steps: + + - name: Install Go + uses: actions/setup-go@v1 + with: + go-version: ${{ matrix.go-version }} + + - name: Checkout code + uses: actions/checkout@v1 + + - name: Download Go modules + env: + GO111MODULE: "on" + run: go mod download + + - name: Build + env: + GO111MODULE: "on" + run: go build -v ./... + + - name: Test + env: + GO111MODULE: "on" + run: go test ./... From c0fd593c005d3625f29ce61b84067ab40896184e Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 31 Dec 2019 12:23:31 +0100 Subject: [PATCH 158/911] Use GitHub Actions badge in README (#120) * Use GitHub Actions badge in README * Use badge for build workflow * Rename default workflow to build --- .github/workflows/go.yml | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index df5659a..90963b4 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -1,4 +1,4 @@ -name: Go +name: build on: [push, pull_request] jobs: test: diff --git a/README.md b/README.md index 97603b9..e88d7b4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Glow -[![GoDoc](https://godoc.org/github.com/golang/gddo?status.svg)](https://godoc.org/github.com/charmbracelet/glow) [![Build Status](https://travis-ci.org/charmbracelet/glow.svg?branch=master)](https://travis-ci.org/charmbracelet/glow) [![Go ReportCard](http://goreportcard.com/badge/charmbracelet/glow)](http://goreportcard.com/report/charmbracelet/glow) +[![GoDoc](https://godoc.org/github.com/golang/gddo?status.svg)](https://godoc.org/github.com/charmbracelet/glow) [![Build Status](https://github.com/charmbracelet/glow/workflows/build/badge.svg)](https://github.com/charmbracelet/glow/actions) [![Go ReportCard](http://goreportcard.com/badge/charmbracelet/glow)](http://goreportcard.com/report/charmbracelet/glow) Render markdown on the CLI, with _pizzazz_! From b2c253ee17cc3ba2f9aedd60b315a160e34de7e8 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 31 Dec 2019 12:24:38 +0100 Subject: [PATCH 159/911] Remove TravisCI config --- .travis.yml | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ce0904a..0000000 --- a/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -language: go - -os: - - linux - - osx - -go: - - 1.9.x - - 1.10.x - - 1.11.x - - 1.12.x - - 1.13.x - - tip - -matrix: - allow_failures: - - go: tip - -before_install: - - if [[ $TRAVIS_GO_VERSION == 1.13* ]]; then go get github.com/axw/gocov/gocov github.com/modocache/gover github.com/mattn/goveralls; fi - -script: - - go test -v -tags ci ./... - - if [[ $TRAVIS_GO_VERSION == 1.13* ]]; then $GOPATH/bin/goveralls -service=travis-ci; fi - -notifications: - email: - on_success: change - on_failure: always From 1d89273d473db16485370b91727e240c71509ec2 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 6 Jan 2020 13:19:43 -0500 Subject: [PATCH 160/911] Tiny edit to image alt text in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e88d7b4..ac59668 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Render markdown on the CLI, with _pizzazz_! -![Glamour Dark Style](https://github.com/charmbracelet/glow/raw/master/example.png) +![Glow example output](https://github.com/charmbracelet/glow/raw/master/example.png) ## Installation From f04f2a8292ec1d3325b72f3f16b42e08863ac175 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 8 Jan 2020 13:07:47 -0300 Subject: [PATCH 161/911] feat: support multiple files Signed-off-by: Carlos Alexandro Becker --- main.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 1108428..6d94a09 100644 --- a/main.go +++ b/main.go @@ -101,11 +101,15 @@ func readerFromArg(s string) (*Source, error) { } func execute(cmd *cobra.Command, args []string) error { - var arg string - if len(args) > 0 { - arg = args[0] + for _, arg := range args { + if err := executeArg(cmd, arg); err != nil { + return err + } } + return nil +} +func executeArg(cmd *cobra.Command, arg string) error { // create an io.Reader from the markdown source in cli-args src, err := readerFromArg(arg) if err != nil { From b7304db99ee14545a2642ee802fb681212131ab5 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 8 Jan 2020 17:23:04 +0100 Subject: [PATCH 162/911] Fix starting glow without sources --- main.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/main.go b/main.go index 6d94a09..189d779 100644 --- a/main.go +++ b/main.go @@ -101,6 +101,10 @@ func readerFromArg(s string) (*Source, error) { } func execute(cmd *cobra.Command, args []string) error { + if len(args) == 0 { + return executeArg(cmd, "") + } + for _, arg := range args { if err := executeArg(cmd, arg); err != nil { return err From 85c0cde9c7bb57b9399b3907a595c41b3c8e0e83 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 8 Jan 2020 21:50:34 +0100 Subject: [PATCH 163/911] Pass writer to executeArg to make code easier to test --- main.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index 189d779..0d53e02 100644 --- a/main.go +++ b/main.go @@ -102,18 +102,18 @@ func readerFromArg(s string) (*Source, error) { func execute(cmd *cobra.Command, args []string) error { if len(args) == 0 { - return executeArg(cmd, "") + return executeArg(cmd, "", os.Stdout) } for _, arg := range args { - if err := executeArg(cmd, arg); err != nil { + if err := executeArg(cmd, arg, os.Stdout); err != nil { return err } } return nil } -func executeArg(cmd *cobra.Command, arg string) error { +func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { // create an io.Reader from the markdown source in cli-args src, err := readerFromArg(arg) if err != nil { @@ -180,7 +180,7 @@ func executeArg(cmd *cobra.Command, arg string) error { return c.Run() } - fmt.Print(content) + fmt.Fprint(w, content) return nil } From 3b38e3c2b329c1882dfbfaf8ee0f1008fff1e522 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 8 Jan 2020 21:51:22 +0100 Subject: [PATCH 164/911] Add tests for root command --- glow_test.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 glow_test.go diff --git a/glow_test.go b/glow_test.go new file mode 100644 index 0000000..a2c70b6 --- /dev/null +++ b/glow_test.go @@ -0,0 +1,64 @@ +package main + +import ( + "bytes" + "testing" +) + +func TestGlowSources(t *testing.T) { + tt := []string{ + "", + ".", + "README.md", + "github.com/charmbracelet/glow", + "https://github.com/charmbracelet/glow", + } + + for _, v := range tt { + buf := &bytes.Buffer{} + err := executeArg(rootCmd, v, buf) + + if err != nil { + t.Errorf("Error during execution (args: %s): %v", v, err) + } + if buf.Len() == 0 { + t.Errorf("Output buffer should not be empty (args: %s)", v) + } + } +} + +func TestGlowFlags(t *testing.T) { + tt := []struct { + args []string + check func() bool + }{ + { + args: []string{"-p"}, + check: func() bool { + return pager + }, + }, + { + args: []string{"-s", "light"}, + check: func() bool { + return style == "light" + }, + }, + { + args: []string{"-w", "40"}, + check: func() bool { + return width == 40 + }, + }, + } + + for _, v := range tt { + err := rootCmd.ParseFlags(v.args) + if err != nil { + t.Fatal(err) + } + if !v.check() { + t.Errorf("Parsing flag failed: %s", v.args) + } + } +} From 225f822a36e31dbdabbc4548fc78fe216cb1184a Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 8 Jan 2020 22:00:11 +0100 Subject: [PATCH 165/911] Report test coverage in GitHub workflow --- .github/workflows/go.yml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 90963b4..b1699e8 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -7,6 +7,8 @@ jobs: go-version: [1.11.x, 1.12.x, 1.13.x] platform: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.platform }} + env: + GO111MODULE: "on" steps: - name: Install Go @@ -18,16 +20,19 @@ jobs: uses: actions/checkout@v1 - name: Download Go modules - env: - GO111MODULE: "on" run: go mod download - name: Build - env: - GO111MODULE: "on" run: go build -v ./... - name: Test - env: - GO111MODULE: "on" run: go test ./... + + - name: Coverage + env: + COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + go test -race -covermode atomic -coverprofile=profile.cov ./... + GO111MODULE=off go get github.com/mattn/goveralls + $(go env GOPATH)/bin/goveralls -coverprofile=profile.cov -service=github + if: matrix.go-version == '1.13.x' && matrix.platform == 'ubuntu-latest' From a358e8ceca66705b362dbd0e7a2eaf9b1d4df21d Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 9 Jan 2020 11:31:13 +0100 Subject: [PATCH 166/911] Enable ANSI for Windows consoles --- console_windows.go | 23 +++++++++++++++++++++++ go.mod | 1 + 2 files changed, 24 insertions(+) create mode 100644 console_windows.go diff --git a/console_windows.go b/console_windows.go new file mode 100644 index 0000000..2516b16 --- /dev/null +++ b/console_windows.go @@ -0,0 +1,23 @@ +// +build windows + +package main + +import ( + "os" + + "golang.org/x/sys/windows" +) + +// enableAnsiColors enables support for ANSI color sequences in Windows +// default console. Note that this only works with Windows 10. +func enableAnsiColors() { + stdout := windows.Handle(os.Stdout.Fd()) + var originalMode uint32 + + windows.GetConsoleMode(stdout, &originalMode) + windows.SetConsoleMode(stdout, originalMode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING) +} + +func init() { + enableAnsiColors() +} diff --git a/go.mod b/go.mod index 8e17d0a..d198a29 100644 --- a/go.mod +++ b/go.mod @@ -8,4 +8,5 @@ require ( github.com/mattn/go-isatty v0.0.4 github.com/spf13/cobra v0.0.5 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect + golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a ) From 6e831099a39cee8bb24f38a824732abecc9fb325 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 9 Jan 2020 12:16:32 +0100 Subject: [PATCH 167/911] Bump glamour dependency to v0.1.0 --- go.mod | 2 +- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index d198a29..a0b110a 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.0.0-20191231051734-03172b812196 + github.com/charmbracelet/glamour v0.1.0 github.com/dlclark/regexp2 v1.2.0 // indirect github.com/mattn/go-isatty v0.0.4 github.com/spf13/cobra v0.0.5 diff --git a/go.sum b/go.sum index d165719..adb9866 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,8 @@ github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MR github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.0.0-20191231051734-03172b812196 h1:BZTxQWfxPM8Z6CuegHX232UZTaTqxaFW8tPjMafceLk= -github.com/charmbracelet/glamour v0.0.0-20191231051734-03172b812196/go.mod h1:SUlKmbBDXqb1iSm/IrR5nbAG6WDCWptHFMpadJEcHFc= +github.com/charmbracelet/glamour v0.1.0 h1:BHCtc+YJjoBjNUnFKBtXyyM4Bp9u7L2kf49qV+/AGYw= +github.com/charmbracelet/glamour v0.1.0/go.mod h1:Z1C2JkVGBom/RYfoKcPBZ81lHMR3xp3W6OCLNWWEIMc= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -63,8 +63,6 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rakyll/statik v0.1.6 h1:uICcfUXpgqtw2VopbIncslhAmE5hwc4g20TEyEENBNs= -github.com/rakyll/statik v0.1.6/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= From 15459db3fe43ab2437ecbcbd8e3938eabd5e2a42 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 9 Jan 2020 15:42:56 +0100 Subject: [PATCH 168/911] Add release badge to README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ac59668..108aec5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Glow -[![GoDoc](https://godoc.org/github.com/golang/gddo?status.svg)](https://godoc.org/github.com/charmbracelet/glow) [![Build Status](https://github.com/charmbracelet/glow/workflows/build/badge.svg)](https://github.com/charmbracelet/glow/actions) [![Go ReportCard](http://goreportcard.com/badge/charmbracelet/glow)](http://goreportcard.com/report/charmbracelet/glow) +[![Latest Release](https://img.shields.io/github/release/charmbracelet/glow.svg)](https://github.com/charmbracelet/glow/releases) [![GoDoc](https://godoc.org/github.com/golang/gddo?status.svg)](https://godoc.org/github.com/charmbracelet/glow) [![Build Status](https://github.com/charmbracelet/glow/workflows/build/badge.svg)](https://github.com/charmbracelet/glow/actions) [![Go ReportCard](http://goreportcard.com/badge/charmbracelet/glow)](http://goreportcard.com/report/charmbracelet/glow) Render markdown on the CLI, with _pizzazz_! From 4c6633e8a36dde777f4255a13724c54bcd885f5b Mon Sep 17 00:00:00 2001 From: Dawid Dziurla Date: Sun, 12 Jan 2020 16:54:36 +0100 Subject: [PATCH 169/911] Now in Homebrew! --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 108aec5..ddfcf20 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,10 @@ Render markdown on the CLI, with _pizzazz_! Use your fave package manager: ```bash -# MacOS +# macOS or Linux +brew install glow + +# macOS brew install charmbracelet/homebrew-tap/glow # Arch Linux (btw) From 8ef13d49e6a9f745ac4b164079507f87df10660a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sun, 12 Jan 2020 14:18:15 -0500 Subject: [PATCH 170/911] Remove deprecated homebrew tap installation note --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index ddfcf20..b708804 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,9 @@ Render markdown on the CLI, with _pizzazz_! Use your fave package manager: ```bash -# macOS or Linux +# MacOS or Linux brew install glow -# macOS -brew install charmbracelet/homebrew-tap/glow - # Arch Linux (btw) yay -S glow From 85cd31dfc4f772bb69f6a004e838c5b51078041a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sun, 12 Jan 2020 14:24:07 -0500 Subject: [PATCH 171/911] Muesli informs me of the correct capitalization of "macOS" --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b708804..8be1df9 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Render markdown on the CLI, with _pizzazz_! Use your fave package manager: ```bash -# MacOS or Linux +# macOS or Linux brew install glow # Arch Linux (btw) From c5517add192a6d9ab0efc62c269635c858c6af3a Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 13 Jan 2020 01:39:33 +0100 Subject: [PATCH 172/911] Search for READMEs case-insensitively & recursively --- main.go | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/main.go b/main.go index 0d53e02..7497c55 100644 --- a/main.go +++ b/main.go @@ -80,21 +80,37 @@ func readerFromArg(s string) (*Source, error) { } } - // a valid file or directory: + // a directory: + if len(s) == 0 { + // use the current working dir if no argument was supplied + s = "." + } st, err := os.Stat(s) - if len(s) == 0 || (err == nil && st.IsDir()) { - for _, v := range readmeNames { - n := filepath.Join(s, v) - r, err := os.Open(n) - if err == nil { - u, _ := filepath.Abs(n) - return &Source{r, u}, nil + if err == nil && st.IsDir() { + var src *Source + _ = filepath.Walk(s, func(path string, info os.FileInfo, err error) error { + for _, v := range readmeNames { + if strings.EqualFold(filepath.Base(path), v) { + r, err := os.Open(path) + if err != nil { + continue + } + + u, _ := filepath.Abs(path) + src = &Source{r, u} + return errors.New("source found") + } } + return nil + }) + if src != nil { + return src, nil } return nil, errors.New("missing markdown source") } + // a file: r, err := os.Open(s) u, _ := filepath.Abs(s) return &Source{r, u}, err From 52e50a40084e0e21c88c5df3914a5ad6428c1253 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 13 Jan 2020 12:21:08 -0500 Subject: [PATCH 173/911] Update example image with unicode characters --- example.png | Bin 507270 -> 511175 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/example.png b/example.png index 1b724833aa91f6a578780f822b6807f9d2e43d09..b146f2000bed0727c1eb2bc987ceebe4b86e74cf 100644 GIT binary patch literal 511175 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%0AmFRQ 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

-vM)xZ!-kbPUg~-x_^Yy|ia;F10W1 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

nXzt6@7%*{;l265r;Y{ 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�`+AYzO|L|kI8O~tunw8hM^ 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 literal 507270 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

* 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

Hu3MS$8Ql7|)l7^O)rx*NJ)0eO9!bJ< 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℘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 >kNT=3!fYgOkp1u^Y zhpx*oG5dGG#>`_8$9L{jBS8G$c>E1T=<5D4LOhSOk}n&)b*QRQOMP-dhR(E+;51Q) zKL(Hjm&T)x+HP13VIp>Xyd$=UF(3PFjSuc*?rLIBUW*v|DdjIXwT=?g@Rc)8D#u+| z&=h*pJ(vydc+=Xdt8hnT7u2vAdgtqM&W#%Yd*Mw5S2s5oI9zYkY_-4N)a3ZR#5R;h zK|z6ImVJ4d31IEtp4NTJJcP7xb1MLDUle-d<0Zg7zkh%73^{wu;^Z#|gK=SRc6L?~ z*l3GthXtcmGHUcCqp!g4aKI)wlexeFD(G6vHQmWQnX_AP29LmC$z`3J%k zu@6y=WQk90hA?IJSm(|$bpGL1Z960-qBEXpdVh*T;S{b;=CIjyO~UZ#eXK3AW3hvy zCmSbwjrF+{U+j_oq-eTYTu<1-Z`sDtQd3oW0`9O27|_OPg!jRxKnLTX-B!UvQfyxUk51R;BV+& zgKQCf)~QG6MBTO16{+(dGBT2$KR+nQU&ql7*bjk1bgKlIX{)fuE93Ufi0Rc`h-F^T zjxgkwJ$l^m8JT4X(Ff!Czkz@aU)}OJCMByTo+JC{)5m>Tb*!V+^>5Zcc%G&nvRSa- zXpgNso+q)3Xk#vHdfKHN{!4U z8XqTe{Zrwd0G=juwSg$RXU;Q26@E>W)Ts25!K5AmXdVMHwcQ4EmOnP~s2UfHB)0!* zi~04W@$*LToA5F#s2S6LWhIu^|D#>em}ejq+S_>K@t5%2+c_mAC3hs+6Y3q5M*OdQ zp7b`_2+lZ@$X#^z!g)rP&OVeAvT``P-__%?=rByr7^{?udvtVLU$RX$pn5 zR*4sm>~}r>=ue4Bhx298=d4q!!UU@ef?2};k9AHFYLy8Zq{;`D}465m69;0kzl*OibuF5mQ9`FX(sKVF5mn(-_tPk$$o z)JzNRG&MGUJ+G;6h_1rj(9#HX_;Ek|`q_!iVfdvF6{v*YzeO&K@;+JN~^VmIHaWRWmPpzyA?wVXe3_<^^&*s*rc z+HW#@4=S(hU_M@W;o?ej`4GnVG2<-ejDEiN`R;{t6Y~dy&Y{uY>W2<#Q#ie0iu#+&4xl^C*uZSzqKGd2R*}U?|XCZiRB(kUw$w zxnb_hOx8VGO2r`g5lt%Rw%ppc>>5kCKsT>Qv18S3VGc)swkKt8Oz1qm%#|-`DQ+ut9jg6h1 z&Mfm=Cmqm{$q3b%*A~dVvUmnmnfCHNzm0>?Vl2)pAtE3kz+&p)W1|C7*Hw;{+3L7X z``^@4QJI&&U_m$ZzMP=$c;fKEglQs?hNx_A?_v=je3bvzjDR> zP-LH}Op;^*Fv|!H)5{tf_7vD@d`M9aljCQDje=d#-JVO5mLg7PWMpLcy)x(DO%@7& zJy$P~HyXJlqNAGm-OxVy#ZYD@=L8VIPCQZJ)bWX`+Su6ey%oYOdpbuqmLa-f z2oe(&HJnSEzEFi49vN9U%+2qyn3n$G!_$|NhMGBWK&h!PwMJV{Z?kFcIViPvk>6T^ zdw4*g1*<|d`s_0{Gz5D5BHBu`{Bm8byB7pY#m>5?^E&A8 z86EK+|3qHU7V@6%%&+S1?tV!X>{J=d`091|YAut=yguDnRCFky;Utcr_weCEet~o0 zP-x}RcPg*qMBt3D@Nm(`$u5Ya;AQ=f9Y*{2AL#K`m#4*Qhd3`d$|O}rhAu6KF2`-@ z_xV-5p^bR>O*kD;5xO4PiM>%{J5oOYfZQ~UhxZHdD1n-LbmG0e$DeN(;(URPsgfZ~ zqf&bUO%(lG>aJwc-JW_eHh#Spe=KsV$*lgl7alFwF5yS_vR^v>t>!vMg3NcqLe;n-zYRzUEwM)@^A{CtSit*iY9XW$=mI|N0dig7Vc6}12uN}Llc2Ak$iM%5F8Ar1d|%ET^X~OaF!tBT>6?mB;gas{YeCx1 zu^4XWZ|yU@v;H}fXCdKR;F-kR*u8(SDtDd7({*n?70nR`9jnMpG%Gm&y~yt@l>wJu zUYuU~_I8^Ba{!w?J=OW{g2Fg1h&}v z)F}=d&d`BEs}ed-;WundZm#_F^Kaf~k0m~hFgve8yUIm@IoVjcY88)prj!a-R5>W! zng3+_`CP`)`=+vA{g9X=6O!{sOy#~h^FzL(D_Q{ohiRXB575s^SyKs~`!-LG@BbaB zm0??H`Pr8?}X`eCm3}@+i$T_jba^fRFYAG@Wn0poG%r8D|gB>&}72 z3(MtOZ#q3FK9A%K1@?x-NNIDX0-{#xX_aNmR5#@4}$ z@|jntU32fdrYx*~LGjH&km6_ZN2+(S%$A z?l`+G&1e$s^MNY-^4%;k?yGB?`jY(adQ5HaZT!b=R^WmCPkn#dKGoMB#n#@yJ6$^* zm?M4uPIyE9x^m#NKt{-m3$3%`iDSXin|9JcyXVGk+*}VC)r&{gW36c6j+!X>-6M^x zPw~{2b6p`Zp@JIRw>c}=Tq_q6%ivYV<`1b=(ViWSeHgDRBq0#mxi*xt&%i^@ME{J+ z>;jxY>O51Fng&Vv^ zrdw-9KALy+hl}t~N1eZegwDN;uj2T_#l6p4QhOHfrt-nS2K1Bxf9if`ylMBUpiuIY ziO{%(cyQL$>rs*)Y9eUCGkp8eTk=zyS(;N|@-%}8l}@~@sNH#TMq<=?oiEs@kZbtp zuz7;(1TAk}zU{5}M;T{f%tI|p&T7Hc;0(gO&ANT>#Vju`kdxn}E1~ut$fZ_p9b`yE zXAQcyJ?3kmEM=JJiHPiA>wLssfec0lH6muNlLZe+;ilzWevKBb<3b1ei%~?{;lc8| z77*x0?b(=Hwy(mDybgi!8NNDFerX?O;neO{J72(@y7NVm6CZ8p-|Lz&PSD(qFLm-8 z?eI-GJP9Dq`OZ8~B3|q|6-7QYqb!6TM!Slk#auj8un8)cFPZJ@P!w9()?0VjJ975& z+-gFP=+&jW1I8=McX@@cJx!jJw9Pn`Ex4nsBEDcGlhZ04#e0J6E;~^%#5c%+$Iq+@ zcCT}+sJe`2bDa(a;n9-S!%9QtISpL_*YQ!SD9`Yg8+hZ_!0zKdu>W~Njczv&6)e## zcreuX`utm05z=EXP1Htt!LI!S$O8Ua2g$wU0#mUo06meq7Z5>rM9S`-W8yEhT2V5# zcH3vAwD#bB-wtSF z=$CIzDmt~;jA31hZ&{R`v2jpRvPHuqZnim>30(fv;AM4i^Iq@WOJcTbEGtV)Qp}R7 zMSFm^V)sXYxzNvgN=yiMH_@gjIAiDDQr*{%liV}7MjM?wO8MIr&sFXP8`QY3M!IJC zXZ12s z#s-eB6Ue+foBw)qlcx@w6&;ZyV)icn`~`!<|BTI>IB-5MHB!9CPjZ(0@eC5xJqb|r z)ZcZqF1lCVxFkAywA516z~fntgk_XrSe&!`z0s6U!k!%;gH0mEUd<}YZH#2yIrqDA zP>+`E(MxM%2^9|>q>8PmP z?i+tB@@!D8S!wOVLhhh;O46Zd410wF0PlwC!KeqGvJ8@sd<^lF!DM@R8nDe*d=>TE z!L11Aq9g#}<-3jf@PQZfnZrmOlsp1zyiB^vf3Hw(`Dr81SqV$Ehr~a@;mw|>r&yC+ zg84rkcjyLmKo6jL#Q?~xV|S@&^>A~hCH|qI=!ts26m9FDRs1a}6Z^skoN{;1)!wkUkLI8;_2kzF zpX?r~1eg3~hS5PZ>CI~g3#-A=7DtQWHaCy01UHw)FOPMijP`)_(U4;_CRCH66(lh; z_b$Du1)0pHKe;C8v@7;x;vV7TT4g%))7pVrnC``aDKs_XvRX5r?>LL|UHR=oH}XA6 z$AiH?q+Uph%TRf<__D%IHn6!p8NWoYe0k=OOUvM^xink!u1V52@zaS%*|I^yW`Z#6KL?AFZFh+pKwL>j1>XN9^{UeAmZA0VTT{WY|dJn00v8g@Z4+`%XNW z3tP@LQvE3?Ev{a_@K*cipkVZIOWCBHey$5w5^snt-qdgTX?4c+8?5V^zZL3H&vXEj z^78zQ2X=H_u6qB$(0`2uuHO-NNp~jl;1Qu3GcY4C*|iO-`}398(n;~uKy<91CQULz zZKPA4xuh>yJ9B5|;S5xgf2iTY@V$4|zvq=w`Uj(v$?LDaQ3YOs@rBjMvlZIqiokn@ zT%mzBGFr{9(OVOs9~Rf^z1Hh5tjF_IU;VRTp;hs zn=Jyh$_IW|6rxYwz5FaD!|>2n_>+_a<)b4dXJJJHX$n?lcF%JzL?Hm-HnpF!hPJQt z1-TlVtue`ZVGMN-*@-d=YlkI^1TcD@9suTJaSy- zIC>@WE4&yTciHM(VeGl|OOV~(ZQkE=Q2e!oQ=b*72ZSOjoJs{yBH#*%Kj7)gI1bTU zM)uL3dgoV4*Ju|$Py5VS_t*0tlYHV>d-F0KmLZE8l~^m0;t)&(RE!K>KT_EHN;mx7 zzt)wfchT}l;_ij{M3%^hs@V z*D88KA8w0Z8j#F8T6ON$WP^Zn@R?DM0<9VD$LHGK&x|upQs-~STN`8@lp(_wPA|-H zJQYz^V@@5vWaH%ueFiN!_J6VU9#BoJ(b_PIiXIEc1}aU8qEZC`X^9m?nuv->Q$Y|Z zk={Z^MMVXvN{6U4krHVlEkThIT4)lfQ3wPG5RwqmlYh{2?z-RokrEAT+WtV5~ zdH1s$mKr``3JmS0dY}Bz`1t&$xmSYMBDKu1QcIw|AsF=)f%*y&rc6oSa`AH6=p*w| z=;aisAHo4m<~rHU8{8@ewp35=?ecFp_HnDtgBrJu86Qfwgi%FIJ}ks+m(LFAMq7No zhbjEvWiMa2YIr7iv=+M>BQG~_p-a~9+fE)Ftc_t_)dh31S$R3%pGxP6NNQC>UKec) zRX*PYwrVOYi4W^LFL`{k$Fh!spX{?)$Kcb5be{S z+dW>J5bJNI>uoZ+wXR=k{>a}1mc^mW0w{h@2IAJ!O*egjTFtNX)hg?3(qHHTb=P-E z-OZgP-;LP@x1IAoCtRcGd$O1NViA9(u>InLh{PuNwY(8<_vU;Q9Si^h;?>6r{uYF6 zPrulVxRC<{woX!S^HaCj>D%hQQo7zh3DGja*S)~D3>Ut{a&Yj%_9wY<1}}upA>%=% z#btH(zD9K2f5=B7#z0tk<1Z<7&?XJUvV}XMviB_3MYr$^}qw$(! z)qaW(2B)syGzFZ(re8`h5Gt`@iG5$s?x4|1OzYnmR5YsHBDh;N#xQuteEO;H`}s@N2z?Jqvm7*6ZQZ41W# zkWY3uwS7DLjU2y|+h|(Mmv`77%Zc1PW?LTFve)jTZmDm<^@8xP2~V;jXWvG5G$lNM zKtQ%Shg3&@GxFozR+r9v5#y{FZJM)SJiK{Ny}m(D(I8)))WkLY;J+c(xUaOj`SerI zm&?bbf|TIuE}r*y2c3L7^XSo2$ln{J`x?P!jx1Tm%rBL}d!;4f-g%+}g(^G*Qr2Nh zOl<(^+R$8=_=nWfBT2IwFCGD0{!q&6LB_P`-``NGiuYN+qUj_16WnXUT=HvP2F{-R zQq{6P;mSVI;N4I?u1b$;nx;T8Sn zX0)=BYZ2$JjRkovgnUDI=v5M|s;ncD%c19v_7;hh-&E?~f3eAFefpUPoiS><2_l!w zQa5}QmWij$^glYgt#!Ekl8*ePZx6tVyd~_EQG5<}I=}fK`Q_FIb-Sze^ zsc2mRf#UOZ5$LX=kKv5@E}iD@>Z5xk+AqCyCn|F`t)>btfgfe)1U8*iV`VU>Bru8i zw9hr|MPSQ|y-Enqn@^UTFE8rO7O#9t+|sq7+-Fo50bvu9-^NB6|2Tgv)Xzml_$tP0L> zxk)rkID`(^h090ALpXPP9`$Y<&CvJLu`9o> zz#X6u`2Kz!AojkoKOwTK@5wFj``HZ1)=K|;g#u9;87+(i9s5!fcLPEk{%Dl~C}O`? z_81gjxj)5%G+mFY`{DTh_TpcWF|KLDUn0ED$i-4GiU55%YALsUR!!G|a&qwRd6;kH zBx*5(IzNE{)QpzTWRVrF&Ls@}YS{VyA_B51a6dhs#}Dd30qU%U~|>hEvg%i?3lp z2H8VG&tdsRtru>EM@*fKWF_BTy5Od@KkGiN$x&58-a{uTapB10SpC-R8`j63eVW)2 zdkvQ!SDYF`vA8*F+;r8<;n9{O%GSD@@0@142~JKPY-VkLQMIILQW%zodaXW$UVddm zDY%r>|G{ua^x2L3?!#*DCo%6yoJ<$Yqm#il2gZ{%pT~U@FDT8LJ%?Oezw4pVUER!) z%GVd4%K9s7$tD>nHTMdapS(J zt0X!*PwiZ;jWm5%K*w~&s%l)M_xDL}lC#s_aTm9>EfIh7@0zT?v;7w}^c)0P zn0K6ft|{(@DKTR;wI90x)A+S1ZF@mQs@sJ#SCU?D9ol{5)WLPe1f5;0hh4oJoeOVo z3paOhnow>q9hQ6ja_nApo^!_YxS(g_m{|Us{kFf94_XwlWKx?VPP) zLxiiZ&HgerHtu1hJ^XT0bDt^_O%NEoddJs`L=Q8-ySQ}{ zudFNoAZ72=svp)@jku(@FfPI&N6*P=XzA<{NQIRMgC*U>}-|drt#KRlLpZi2Q`uqF8rnT)((y6#`KQK60V&KII9UUxP=Xe{D(oGl-l{rTBk-T zo}Ovics3c=1yx-df+{DWdh9blYvB)LeCJ^IomE zG`#*}Wu+s(GWVNyNxkLk!+ZJ|*G584e>wy4KbREqE~kn_>O<;%{UUg!AAS6SLj|(% z8DxiM?=@oP>P$rRwi(UyXU|5B#Q497x+}KMRkNYAABozox2;u{{LbA=) za`U7Bs5^BkNA=kqtWPZpH9n@mF>LJZtak1t3+Lm{TV-FLx`E$+biKoTGUwsYAzaJF zYZFhnXI{lvWuu;OB`by(9`6*lx!05sn|MInzun1)xDxHxCi2v1)6j;M!%XzP=FNuB z^$ebV7EzkG=Huh@_vX-|$>G_=6Zcu7XQAizxt(Mag?o+8Vh*Z$zP)tN?UPnn_|Oh4 z*9^@TVw<0}?^>~ZCh1Q;8$4L%Ecqo;@zyCsU*U7-hZ7^dq-A62$L|d;nH*dHRrl=A zUuyPe15_y&L+>?&QxD`@pHVtwyyJRhU-QUOzS$XK02DlamC(B-?!1}TIxP0&qAj<*PT|6&uOk(myzYRKBjlQ;g^Sg zj}_0IdGz>1#WwARS^vi`)lTdSpv0;zjn&u9r`wtr&m84nsjkP3kXIng1&Zmt(wZf~ zqVpqLGUWSJ9b@ol_~4xzXhtdQwa!(6k8OytP7sNiZ_8D(eWV=LWm#B?%^0br8)5Ix zCSi0bD6RT?AAa@kN4hQBC-uPj4kh@VPTGy?6bAFx&l*2IA}xsz@-aa# zk}8v{jd(q}={*ioz15yPiMigmB+UGYh3unFx5MChywGNzDqFXMnaHsgy;N`yMLy;~ z)fQ^@5Er==Kq{Jn3fVZkjwRt|4@~6Frzh3`XMl7_4GmHzS|izA9v#ovTE{9&P!0u0 z)w2ntqstiXI0cdoxUL-+)NG#nERf0*L>RmgM0oSLRJv_<>O-f)_R*r(!6W6?!o|^& z5MMK~THcXm{NgJ$K{`f*GTr&9YWw?!Pdy{bhhJ8db!SJj(eX24*!UzEO=fV)Xh4_~ z$wuUOMDdPzN$>bLgp(4z^Vgsjf39_;%Hk~Ni3a@EvH6U77w!nYKyUYhI$f$Ah66U| zVY3NXjmSCk|UW7INChl1Ce`}=|e~l`{D?Y9JCy9I8(j2 zNU_evvMZ6e6=^4BrwKefbH^GjK~vtZ z%AQw8z7$&M59pk+koq;V&q@4_r@xh@=si$?N2I$`t!ClYXir2k{q(S@shb`gw;c^eNl_|5bGovRS>jeZFp@n=3vgY_Jof-^(5r)JI_$?ZU9#Dq@j*4FMU>qgDW0i?!HfpWs^$A~YY{J-0yJuApzoHNf6@kMf zc!>MWkV{a<(p7`o`2r`xKt@UY?UW*H(7Yei`WL$v8=r%*2XIlmit|`JCnB+x%_R#n z2>Uf9#n|>0N!#ukZd)tCJg8XU;lpza-;*5lp*ldX#w)gcP{qukc55-u&^gVicr%gEyNpgqRiBKBoJu5F^aM$qg zQ_3QEmVisKCa`-#dPd2Ai6B_ba#mvC>1|%f!kC=fv|@F>Z{+;89S(-tF&PWCUTCbT z1NUc%FCr4hbh?NhA{>HVK=H+*Xe3!5~TsolnVNUQ2g2zDQzf3M+7Pdx;t-m;lj~oURM9AuNwZ zNd<$#eLs?~<7^|WHbntY1Y!k8oLP^vP6AG@)qt1{Eq|Qh9~?;S(&89es&~jZ2Nhql zH#FQqs~iiumX|>p-A*4@qfeF68bvl;0$G$qc&p$eMYAY^(0~LB9yfub31j`-s5!-2A<3QX<{MMmo<9eQy|NvNZg}H zC~?Djh!e8vT6_x~Tw$7B=SZ7!M?>}a5jrj=PjE>nJS<75#Sk83Uk2+E)+$QKM%U~q z^GPPg7esxsr#y^POTIhZMI@NqFsuk#Ot1~;8N-Ta^AxuCNG{b1PPPNr=+hB($#DDK z<4hUiXx`dTG|$NVG}$R4f}!>-rk0E^dfnk37(R@&%jM9IG3Kvsa=vQ6>D-gUP(8&8 zpX)$K4vG@d7Bn=KzdN#CfR5xpnNjX0oNNW@X*XzYGuVq=&zaPtIf%=@%K zd`z{h3b=^mYi`(7!&TW=a;SDaEN}-8T>0|5V5aG%g2?i%%$I-jC@W2zN+)nf9f)Af z2BAzyW-7GZ!Ty@G0O=^hSfnn6Xmw7mD5c8nuba|9e8e-98?qY#w!S4 zI;{hn zT!g`g*{h$~PXK6Asn_EO0d=kBI<)!7_TiEcpCJ4`zr_PTaUD|qpJ$v4N@8R(t1r&X z>`T@$S$N8(AB4&#$QiJUiSecnK#2fP)}Lqt3wQWBf%6!;311KWjuT+?MgR}wM<()= z_?zA)0~Fq};ZXa9Nt zPnJ7R?jhTW98v#M8=~2JvtE#yC&&mH0v6XXNcT_ix$ik#P>`kA{%Fy)LeYH_@-rRW zp|PD3^#fm7`m~!$pUtMEl>ixHVFo1^Q_rSu$J)&WXS@I2uBI+oV_O#&agqC$e8$=9 zK#of?JeikG5K=`7)<{&WvJI;&3Z9j_+tvo8UZ1t_@TJv~^j_u>+h(qN`FksZhuxIf z4c86W_GOVNltcH>S(P($fm){_6q2N1AGAt%>vwg9h_<%p%%TviM=U5%(pjL5WW-JTc9SJ!Tg*}2?{F`N{+I{M8S1C zWf-3e^O)IQLQx^RYiP+>yw=moHPUd$;w%vdN*o|i6M-Kd^?PpM56pxgl0`{Jh43BB z1i#iq?=f8$eO84N;K|~66{Ka28syec)Z;x9FuF1el~AVP2*i!emS^(~oBxy)h=_=T zT$f^apa`%|qL5a2zZZG=shXK5>zP+VgFZlC~X>CQ@+ zww7YQO~!-^;*R#NJ;LNf9x`-xo51;ktSX_{BuIATQ)d~VYL45-cB zv)@1+tPC6q&mKB2Y_J7_K_j&?%b-lr7bVzu(T^7R^_s8~_aWV8z+Wp09j}f~AIEZs zJP$6?goLZU?&a<={vN|)Szbf%VIYM!fzW}*(x&4++Z&Wv9$2Zxx)@Qqh@2RYLoSF1 z)4GJNx+nX8uW~jE903`BS-gxvvgJF@qt3sw`gvWqRCuwmVF(ko?bVB1cu`O$(b{0~ zGZC!Lbtn|%=*?4{>r*&2SsEP=YR%{oVg8o(tJVYMA|?++m!H}ncyE8;G-WfhO`(H4 zl5X7TVV=AD+a}rid zeMdH5U1NtPP~F+#xet)86YbDFYi=QV2Ss5=fqtJM;f2!n;r`gP9<7cs)014%Fg@Rf zq1O3qX{F&5fhwAvLK=Bf8yp_c*sKm(zah6Yi$ei+tBHNzPahZxOTa93;ZR3}fl*`^1GX*H z1r&?>l^}bkh=})~i`)%hM>YqR!l9JXENL$FoO<=~qijf8SuKJBoRnP~yO&`@exHTb z86zw8z@bBC{vK&&rd4r|%GhSKT%v~9beq&nv@aTi*#SO)n_Ip1U`?>#7#uy@y$COH zL+Dg3;Qd7=JTVUDb7$C3Jf=@0W@qHKuNnQZjWZ#MwY`n?#b{D?V~cA17ie;Qm!o%q zr+o+!Cq^Wtw!6qBz()UQ*Pq9Bd5_o#w~N1rf|d?i*j5I}CCE+txd;;1RIS~~^{qE; zSXHL_{3<@xl~=9zbRtb6AfRDl@288V4X-U}^oQ&Lm982Un%KtQT*eR5jUU3-D#YX; z(+@N3=5Z)psCjhFT7g4)0&u7Mo8BAXajIi15h!ls(A zgU_RbXlFGr5MN^SOSrN4lizMMFexsEV13X9WJ-IG{<<`Ki5I0p#ykn$7M;x?g`Vdd zQr-j6_>Y1z{w5n*GNqW^wpM!k(L&wKm9ia;$qDQhPd6B&n9xb(KFfKh(e=tuGX&ZO zQKtZP(XGiw9>Q$)=hH&W1R!(;X>Ha@;#uQU47=3Ev+zm*S*C$Y#{7E0sagC0)Z@zq zzLxGOyd!O;&O*rAu0FV0aEek2WE&!*>%P}F5_f#GAKFsXHWz+KS>GjN3?7zkL@Hp< zC{{+ZYX^4v*3in#oFYHk2z$ie1BJ#6 zX6AIgYW7cd4#*~7EONcTYhABrO=GSDe)T@bU|Y|f?CLW!1;?G$agtan-xzlSAiX*< z#7?}O1QZTnSb`)9CDV~mr45t;5p;MWuXY&fsQpC#_j}*i&OR4;a4={t8Go-a_qx~T z%ke?o3ppcxj<_NQ4C|7aHMs5DU)h`xS)xagndGNL3Q&j)c?HFi8w?3xj$KS9U7ZBo z*0lM)$gSS%>0>%}ZngCml!VF(Y;EdHR`Ch+bP)VGk4T!EvDWKx5o3Frq8s68ITgId z@Ar#b-?2`lt3)QYN>}FxxRGIvMg=PKxZp|-^CY2zE;>)~1o#Bg{7!_8`&DD}gM8Tb=>8#(k~K7Pl00A-0bzQK1w0Y=ZvJ+A3s4Wyg)%!-sOo=VxI zLtdH94uZUESPeQi@6pYrIitN}PGoWFmK@TFVxD>CR=sdfq7Fd{4uIIy`v5cFO_v=* zF>DajYQN@GW*lPoQQY?YnX3r6OmZ71>#^k^i;NVMcDczOC$#oP?!2d8tfzrJ;YY>5zyy)R386)bZ_r#X{UFdyvU1E*g4k1SMJlr{R|pv_)nZ&s+DWoO z+}{&Y{dToARGW|?oy@zPXvmsJm%@i9>ZEIC8C*idHF{JIJ*n~pK(C~oY!~l7{woO? zn6dKjCj9I)xmY?(##xSEO)28NK`WC($nEzQSDe&I4*9$5m+CJn)BD}>+?7^6?fB#A zL}e_h+8bn=uqTW*2+%4nhT|lT@eq8@2oFzQ7uvQSgcX|W9fv-x;={$V^jJlDhdu|s zlYBcYEDM7z#-^a@tsuw8Fe&gpB5mv#Nc)>P=kJ)ro2*iVhNJ)BGLSBzSjZU}xh(9~ z`nxkv;B^`3vE&a=yx}kfaHq0CI_WU<9{{3c-`q@G`mCS_-8FgNaxWC;s5f^~9p0UY zKrEG{Cf!5BPv3SYchDtw@LuvzQ~uLp2BmH<IbKKbMSbWiZds8&~;B458+Gp`@PD8^J}4-u~?%Mtk;=cLH3#p#Ibe|LJ8r>iYDcD4P+ za77&B8ejj!K%U)DprbN$!s|;^AI_dunn|(19U>=d+|U?;7ePBSe%6yIoRBcS3%#wa zD@k}{4aRD^d^)&22eQfMide|IZZ!KYZRYd8ffrHNrQq)KBsqSTpa!Z5^;uK;0l3in z6)HsQ-@Ubc0~-Xkk_Ums4;=a;nE*)|qYpe}gVOIHd$|!!8*NU}@Tpj)X*d24G6Yxt!Oov|>NTA@ zIfuv?n|Vy~wvQe0H-rcth{o#<$y~tm1>(QcH&yGto7f)cIoOt>rpw*rq*CvThK017uJ1O$u~cWMPT=r94hu|AvqR-dBPgWvh{k4%X?u;E`dQ78oKtL;s6 zBgEJY2I(hBW(ZR#HHfixU{It;8cE1J!offqO5|pG+4@rkxBhqhhK9Wq*9TsCUb;Tt({T}rsd9bI^91_J4@nJ5H)C`?`9;EKnG*BTbqS0MEs9x7M#+nbXQsl zUA|WOtHa=XIa-6F)*Vo+STH?iZ%{k_dBUq(KiR_2*$s;#8M7hHoO)06P<**A{h^- z^KKiuK;)c&A@V;hDnL?#fqcc%;jhLF0(@#MmGGS*D2HUl=s3BkRoFV1ZCq47>VtxLMSW6fK7NoN(j*C@jP9?K>SaD7apB*!p-Ku z{nz=whUTs&Su|G+1?aL*Yi9&>Wn((?5{Gy{(tD;YXepfp?XJ|LHy;r*8^EC4Dh9pZu)ScCM9lYN2(ES~_kw)a~qMa9_Ws z*Jj`esXGZd9euVt9zVkkGhpY)1QV6JnQ=bYR5@!f1M^?OmR>ew&@+Z@1bp=-UiL%KuW;z zAO>Zu7y$0hQ_A$-LBfU2ifeq)2fdzlB_|i*vQON7>)ZcKqEhd3|H1ksV{uyYf&-Ft z3-OEH`H~i-wyzsW7|temb+y$O!|qAcN{Y6amTzq9Z?)~O+HT0gn}%u zCTKue&;X{KD6M!X>(H@6d@&!iwjvQvVltK$n^Yx)`1WtGP zqj4WF5lfm-bF^7oBlgJ3)Y>EVzQ~ z6#sY-j{|kiJ6$E(1e52MlIAHnE2WfwRhlr6NEX z2Q1E0YO&9gpk^L5j$on)^bl!*p^|mM)u<4#tzc6(#mLY+d(P%j;K@P|_8?yI^075i z#0U@8Nszp2>j3XC-h|!nnUm*=p2>8?fVty;X1!V7;s)@V1LGT+sfAntc1SS@HvHi# zfhvO%R4iz$6rg1<0bpV&=d~F7EfO$VOJ-9WJPS*Rz0A9V{_7TP+UZlPUXMV=Y`;hYF0fgDE~pXklT>{=v+>zodB=wl?$q@~f+?@XQc=A>%*-3wzTuA@jJm4!|nj%NVD_z6@B~4Pt6&J|6t~_6V9-kUzAh zvtM}s$l4kl#zh+J^?bicu{9S^&nBXKOwr!TwNpO(r^OM^?jq)i(JFMy15_LIb`-&7 z^oUEr*CM2SfJK7gG=c$kL|hVP46h71z$~r*@P>(qyt+}8ZkZo^UuFY%~%P`>>70x;sEX_K@iEeVZJIn{Z9({!M>^5Yhb$o_38m(SS}}EDE}zG zdJy0;DE9NMAckOGCF4*5d?&FaP_(A5VFbS|(Dgfitr%Swo`Z^aOWetzs)qc?pE>D- zA}W#0ZKp{WaunGu!GdFL_Q}GBJSQDOMnFjt4AG?t)x|dsk&<9qT8@APZvl@HFxYKl zrch4b+;FAGfbG9gPrk{Gd-?9VuSe##0*Va$v5S1WRN@JHsRlbh{Si>GW~&T~gx79e z0<4;OZD2nJ^Z*(3>a&a`*ERdt>xr|J3iP}lQ-{F{4%@zCk^CjIEcCR^5re#$hEM4f z*<p^vg1r1CjM4jwJhd!t_{%5ChON2@T91LyD2G-4vn~xd5iHXToxF{_swLVLyrO zsHj%mA3}&^vSUW(gc>@7Jx68-16O-4i%&QJJ%(i5z{`2Ur%Hh@>YV^_l}|v5VN)A^ zk7@JBb?l0=eW4-Mgs!R^^2~miI2IG@ZH3^mgBFOR2chh#B`_O}KP*&Y=Yqjj*>-x+ zi?ne5QXq~&!rE)!;{grKi3orJR*eYH)>cwMn&!~q95>~EafkuNJaT1e$v50aJ5qRl zaRp;Nu!5Pt;DtI3!s*6>%naPn%<&0Z;FAqMELULo0U(JDVkEIHHDpQ)h(Rk{Ud??M z7XuCJLB06X2KQB*Iu)^jM=DFU-_~N7`yObn&9SE0d8#(vTAgwo2=zjbC&RkqAAU}R zHNtBJSBLET$SBfDHY1f+d4yzbDOT$Y)J9P~*81rI9B`~G(>wQ&*6_*Q1Ikb~)<1Ph zs`2o@L;to9SKWI2*n5GI z&mg7{gci+kr%i!r7>od!!8^iW9{dv*+_ao>U-U|sFeX2{U)$Mfh;{OojT*C&%=dH3 z;N|BO=h)E}b9nd9gO;+k8%0Xx5!o%4G=}@b3O=i4H5cS%!SIujyu83iNMJT{-WGW* ze!8r!VyRndVE;e1^MMt`K+(PQ$xshPQl}pyVB-M6>Ius`D@B83NLqRPNLa)2_Spjc$HyKbYAh_HQvU29iNTDUTRgq z&(+|hdLg~?%5hSVu+AS`M-XE26{xpG5_it#$p4my@hYoD$@P#DPOtcC_YnXZWM$4yA6g>pu&Io-x2iv3?=vc_}n(HliN0LmTEiIrErg( zwCvPRvj58bS=<5@CAfR4M2o;}n31C`&}R5P$a>DlsCYEyQOap(X2I~4t3lPysLV3* zL{@+Ugz?>fWXYs zqO#$+@qmY?gX~_f6q|p4SKFX~{j6pV*WS?;`e~_q(Y0sK;~-jce0HUgLCT&MFX2NR ztDfb=drrt;orS*`kk)_<-R5B=i?glZs&PR=;o!16_jTe0w@sl6iTi(6D0dtMZdzx` zTX~OcNtik^IS&~QWogAY_6(G#8%Nq4BoIRczx3egev1*2^!m1`du+)?;@kYR#vJhZ}tDZE?Cuc1Ul3Yiq4z{6|tXXK4N?$>m~w9Oq_(+MN- zKYz$0ffsmvm&}t|+|ihpY*KoVdQSqCu8s>ix=Pk9l(t?VHV0L%l719T2`58(D0n2m z3h1fik6ci?EMg7b;K!vr+kW-Ge%R)CJUu~jU9H01M_e!kYjrtCH~Kh18nBni5q{Al z3GWzhX1logvtXmo?BoF6Rv}1Qni2qs&>&5Qy_m?(@`kO#?6}3f>PrC&%!4S{^{%@b zBUMx8f}w&5L3rt17lT-7S8Y~Eqd>YX!n3$8;BX5&I&cHk&pIcWvQ4;YQJnxVNna_} zEc&7UyCQ3AMBf6a^3Fzr{wp%+Z&LC*hCBqBp5?aR+fzGdVExj^=NF;y)@Ov}(YKwR zwheqidjPkEy#wy!^BQ7arZK?GJ`q3e=n|r!*b6^q##rpEIu;qk+U>=7XPl_1o z4BO1aeT5>I+syxuu>2OEsVx{u!RO^n?jD`6?wF5tSvnhUX8LvQ8b~=v5(flK5>jfG`E(amhm#Y=%L_AR5brihQ*I6w;-pk~Pr;R<)-_{#x#`}D& zON+v~)+H^O-5ZUtg1^W#GA*=-m5FB3YVWZ9HL_s-JiY8MvA-yVpSvlSdzawu1}c|N zlCsj0r>J0?9ojK^p&Ebb3dV1p@Z0pstRYD}#!e{O?6-@x@YXe=Z1?0aWikYQG>gov zU2PNNhYi52+5eCJ{L!fROabo=w5u&E12}FNCc&0AxOHJ`_dGSMb6bH32~4PnVtA(6$z2*;1O_hXA=q5}Jgr0&## zf}17g7M*gV(X2FxA-p~8$URAj1k!=$^n$)Y@C{b4YCg~cJR_u_C8G;jffa`UYR!2; zWrrNj@EZ%h1C9~2Y!g_f@aI^UH#2*9@|~B{DV^!`;YRHXq*nohkfDBM*rU~gW}~Wh z>(FRNgW;?;!|KJO|3B*@2Ni_#3MU@EbMOK%LPhZ!jeE3dQZdxTdA?wt|G!v@&_zKyG^@JPOXJa;=17ekpsZ56VL zs00Q}*i>`XfQl{Ey9X-3*9%HoqDG1B+m>&;S5riLaNo5~IiE-kfU2(s1v`_(u||mI%2Wi_ zsbd$-tEK`}r{aJM^5GX{EfElNIr1w4gI&OlAH7T^)(u0(9(O6ElDld@kcCY@Iew5< z8>+roTgns){q9lxPUNKUj>?-g<;hudJ{qgMv}P$u09$5c590t zMTG8busxGU&X2E+L9qdqRh@EP%XsyBhbnfNj1BqJ?#6ax&tX9X+gc}vXZ?bA{k!nU zv(AX_!dw-Ij8aa-9$~W$dmQczo1sGt>aItVthuUm<%V1r5>%>u^?4!x|Mfh-H7Cs+ znRer&S{rff}FxHWZBxxH!?!Q?eX&X!vNyXp#Xda~kWx z%=g>e6J6=YAMNo-%%@VVz0tt!`H=7tSsh0Y1Arx^i=OCyk6`mdFdC7Q%$5J`kpCEz zDLJ|2nytdcugLk%unbn$iB?S3QS}zQ=m#2fQZwl25GVd|cy{tHmhj?XntPsB9lrI&Y6GXp>5{k*Z1sx^r6xW;uJgImFS z?6^q|l{`%;_tDb3*2~VfQE;cY=RDrwDC?D)m{p|S2$J%IHH2;Pn%u^15IE7}j0DS8 ziaze>bHic8+TAX3UlQUd{m3T-EFm(-fhhdzzl_H>4^Qu-ffA7OP2!wrmL>0~c4px| z%T$RPg<1?sR;VyRq+9nCRz^mK1v1P3!W3(y)NFZ3VRLivOE6Yx3}FyYHI);7OAh$S z^%&t7Y;2Y5q~gPQjgj|x{3_~PI1f;Vqs0O2HqhT{H|+*RL^-Y2^1|`U23J0LY>&Tj zf$6H>vnnfp#ALv8bULVE(#G2W&8ioEAq6C2)I56-lPBweU}TsYlJwB}%Z=4B*-2(K zj&e^@aFjy$MheX-#%G`g`-OeV-WUF{52K?!t&f0zl1V@f=H&E^!y5 z1iaG!QV@O=BBG5lPbNy!BQf{jNc)%8v-%T(NihSS@aRd1L1~e)HOyfuk_(%@Ft%icBH=^xV3thtF|4|Js z(X98B>$yLEOf%(M0@N<<2t!h~eDx>S^K8EN^ye-cLhDfxrgTm}Wr;ql3NWKtrK*Uj znkOjjT4nIR@I~#&XO)9%#O5M-NaInz2K{U6c)-!K)q{+OWk_+m-q3*@}l!|Sw+lUbti^eJxa zeSL~t)>&rfOeE3z?I?|843}k+6ackL$Z)6Qcu3n1)oHN(CcJn=ZlFzA#fKq;1>6P{ zN6@L$>Jp0yD0vCs7%UVwNp4XMf)PIX7h)WJ5OJxb3JQO0REVi`#JzhD@%EJ9b;FU= z#?`roK4F02IE@kwig3zM>m_2Z#Z$!CX z`Uz$qFe%+qa+lWPON`ghk3GK=`Sla4KiEP`-u=5E%e7C?vTNdYb_;{V8xfpaoa*^- zQ;ltHTp$YsVn#F^Mqtef*7WD)`+zo98m5>sMPYpS>$T8O0+jeYzi)@yz<9}A`^k() z6_UwYR{IkVT@PJ(qygpT`~-C!l8pNxfq9PcjJq88{SIEP0ro2($BE|z@2bYQQY(#j zh0x^u9q|O8u)v025Rhqo8xa{Y6d6{~Q;y#Cu)#NkArS$k;`ms0uVE}FnHR~Ek+W^XEGDvy zxBh&7?yukXhVz!Sxg`#y7o>(~-Q;@8ttk1<)rHGdGhwRSl28`HR0_Q(F8(WFnr+E{ zr)VB=NfYLeSS_Ame_4Rh^{9scCfku!Ga^SnQU(p#c-xZv_bu5ZX74J#(Q~;}^rbyv zr~V|F=i$kq|*=%5ad7NCr;=T{Ir+Bkk!xO;T##8NUQ3!{O8P64p<0^;dC=t!Y1mFdq* zM3#fwQ`$zriX*8mL0xT!K;J;&j;#m7&sk{ALj?FoBTypZtN|=?4@cMpbY!QG%tc(V zskFD*SJTN}h|^Y^ry+*THwvY)cOHGkU077leh>TH|7AISE}2v-YR!|u81t5l;QExO zI4@$Xwas{Bxh~Zhkd08ht7p+DVL2lFC>?neaPE?`m2u#5(vz4;f%({)uV!=$N`UBTkq^NmU{r&)+38NAKwBQ%SydXk-}la z;JPPCGk&yozezd&aRUspU`1* zH;JKWQuE#aiJ*=?VBQW^10BJzu$PnVX1N5RLnpJMZdc$gw*Hd#__do=$O&EQq-T>l zdF*jY9``W9g(VfQOAg;7P+cNQRbeD@yfAk=<216*@Z8x`;*>PH@l;4-4_xCowr2iZ z=Qs*B8AB3k+wiQnk(zRM&k3sPVR%6+{hQZ+P4`+tAm*1wD{>4;rYdWMe!x-CD1CN7 zNvJg7#QN5@!t(;^+kricP&Hw=$;#2TNjj>FK+j(@=SD!RJq}&Q%p?VXhcO5OK8C_& z!75ADsmvI&06KZ^{}{JO%;Fpn+IU~Jr5$$pResvN7DspU7-(qKS3`*I#;ZIho;)J; zP;))Yl2*!V>>!MIEW#$O>G(zA@;hCG%|5w(R|Q7aZCk;l6%gRPh-8%xUp8-OrLbgN zdZIDUVKS~*Ib>66oEE#haK|Sn)Ch^OJ1S0S{$K7qlNAe;@|Uz9Q6;Bbx@m3mDVTV` zuSC+`nyLm+tvi8n0bO(vxOi)oRZGU5LmEOz->H~tmzU7_>#*bX5tBeDul&~cDGbCf zhF7AwBsdaz`-4ztEgoEpkdHp#YLU=9J)kOmorSlq;c!f?_?*#2)A*_Uw2K}aF#+oE z;oT9=tY}ss`XrjXYmt?M;Sv=EdYy!=qlS>S00e#Rt}#KN+%`4Z4{0F%ypA#KW0q3W zXTLK@@Ko+jpF7Iqbfi)LX;R${ffRbt^u)488B_pogGvY#gx3F+W3pXlPz$5VOZ(+s zqn#4&_H*aJ>$=pr*p67Ao^Hso8y_Wsh&H*UfrmRW&#fK&Aauz^ zAPpDR)54Iu-MVoFC`_~!*@>8Ye@e%n?QP#m-3 zsKJYo+VSimuAJud)+v$~vS$isOWVhilLihiv%Tpt8V_?WVM7)0cgW!Qxp}`8T zG9;E#`TZoPAStz5b3CRVoJdQo>1`J*C~7@PM$gkC3SQ(&!!F5qMz~YK?0v}X0oOS7 zYc{5DYcV3~AOQuFJk4&Gtyl$ysRs1CxW|fU@`Pw{9%Ks80DPr+5kjl_*R6iK-HC+5zvLCg zlYaG|FdEPc&MBh2hZ9BiyBxoAq?Dum9sF)>kLH~9B)kPkeMuXHntL+LcBDUlk(rFz zdPkj%fHQbu;4ihvj;_11s+i@fDOJ|N^MKnjZFCFm1gj+Rsy-VP zu1jZ+Mg|$}=t>aDqfw&uec*lHG&#%Oh&yH55kM4ow+J^w3j;F&h7O2!SUG+ z^+GBa*V7tWj4lR_JGs2WboSzgFkuj4>N!mHADjk-(O6I@I2a8^N}3tXVJW~S%;jiC zab*%*MIaAn_Y5>l+ruL@0bCobv&;-!i9a|=O95H~%JDvRUAP|3 zdpXejR792gZ~{lZzHX$AV%T5qoC+F^aef+Fu70rQ7cv<8J6{49@>TYhn5Yg6IIXAq z0wGE31wd~FHkn=0x`Fa8Sq58U7T65vOUB;r0lh~BKTNb60v=D-Y&eaAo3RI2jhz1t z0DfK{*8mQ9e%(k~QYo~iNb?qZ*8G#3HXKK)}A_^e<68{TQ=vPqSm*g9-7L6o*pZ-r!wlTIR zk{+_YXaROTJZp&u|FlJ!)!#)k|D}9Dar@^sDDxR_uJOtbYL$nF_`M(JL6shQcD!$^ zn@eHmnq7tq9{Dc(RoEl5W9AA~ZE0c@Iy<#QQkz6o#6DOv#y!^>H=2eo#Or^{U5ACe zq#wkfglTS^B;bs_w3L^1N?ARO*2vCcM(>XB7Xw*4CP7UjBqvr^DWXf%zy-Dl76zcj zcb`UfKG<-dfLRsE3c(Okq8FJ#$+T2F4Hx)+=KRO)1!M%|cOT5xN9o`A&aIEqboN!= zuXvL(aEoe(3I56dO+yh^*9ZP!y*nH@(@QBH_ccUI>X z@6PvdWLBT6GGa_V%2>LZuz*`9?aZNmCb_=VacyE#;74r7q!<1jNz!*a54LBQTJdV@ zr;&LebKprM_yDmtW@nMe14c{R=5Og!XAlf zEP#0oUCMG}7+vb4M!RNmB~uSk`20+RYdznn}qb{(uqVRGc@rw-Hbz#^W6#e&80YMI&=<{g-_8Nx}-EAFuRm(fm@Bk@hk4 zk@3K3=!P5iO2+s?8Lg}h)GP$~;}mgzn({e4U;BBim6E0}2W>Iz0?Jy6t)d9-xQxz^ zb@4P;#IlUL6Or=yX^5voKhr7}d;YYxWhJ{^zp_a)8x&No`W)us1Fm{9!#_8BEuJym z?RqE@Q>h0je5L>T!?p@SeVim6`ni$Ru$46&Tr5;ehNBr&fo}?duqRFE8_XLkxW!bkUqop`VNtdR{8Imd+ZB4{R4y~_g><9N`lzk0oocwtMOG>pYJ){So{UX9Y#*Z zf^V1^sd>^ltr49K+`Yao8Y91(k2^hUlL_rj#h(WRI7`#0is0#5gRGZ4u+>PHJNYE< zp}ofqNbl(GXq{Y*?3i137yngF;-YqJ2~+G*Mr|AwkRadwcZN|dn@8FLgaSEa9xZ<3 z(qu(YSD^{-90TktBbM#72ws6lL-9Rp-~NZ_iQk>>b~OWip{hM)ULJClf0lA5w#U6T zf<1+s8fka%?c+aACZ4m{HPjqLM;Kpxq#ysmMY+=6SgY(!tYQ0L6)XAu8B!1bT)9UR zjUl8xG|`8a@D?1(SRl7Z&@6_`8a8jM{ie?Kg`qyTjVB(k@gr36Yl2g=$||kP$l{(e zh;mw_K@SFts}kro!G(Rvv6LHBu_`eBixQKXxPCfG4pTa@+LO5G5h`O*&%ZDOmS|<% zgKGs~g!ZPAYLE4vL%oaE$O;<)0c9o~)mAMh0P=mlz0mN(*NbX3<+CLrBg&3Vj~w?@ z!)1*<*OnBPeJgEnPc2ysY*porIEQ+e=D>qSHK_Xpa^RBMxvtu7P%er@v-t^pew1d& z7LH4(R=vqLWFn4`vS!F*Zwp*xsg2Vs*=^RLzl-BYVH;D)_}9Eh@Wup8)fj39`17Dg zWGx%T<^p$sX<(#!5%?3DBto4g=qA{&%Dsw2eM;QYxOm~lP(}Wk(8C)e-7j=%9#Ryu zwehbYw_e_s2F@)jMPcpX)me7+1Q&{#y6BUsL%NfC&V9qFIP!g?Q$Ve`XjsGc3*8VK zjN-e{hyPzG9SbjSJLIcGY$&zfbPXB;UD424XlXu|vq4@!|NyB>^M{IJtL#HbR+BELsYrt9Y!h+Vd!sJc^xz zd7zAii-7h|kNl6El^Ojj64Ve*J|Eq)H~}t{_YAQ{>N(0#TZ1+K5nR|OYu5k7Hmuja zeWzO6&NmqZUhAK@dt|t)mq4PnIq8~UUbkbkZ`ykC8Kk|}c3k6Wb+IV>NIb;YO0i{{ zfaT9MGDt5fK^=gusmN(MKZaFJII|!>z7b4~M)!+ZK@_Se&4%Jy#XrB-2n50lbDDAA zL747~yA@s2*W|;?agk;-z_fH<88M~c?MKdEvrK1EKV^)SKqExO@LL)GB$TVq&#%6* z_HFFc_DwU7d%BplbTr!UOfNQZ>PF4&FDdq%&zTW$5L2`i z@`8awvzE;R^t%D9W15>pwQ1NsIN~V!ghJwV`VW0Bx-enH(08XT?^za&60`{j8iSb zo$#xl5>~xvX#46Lw>P`qS#a5yQhU^*WLflaoWG5W+k7Jp1NFT|OiFgE;oSJWK^=$fptLY_LYei>9j& zM_n69bI9M}s~UDQXfMJZlSQ|=w;r(Ou)>$_%n?V^oNunCV%PJ!;{z6KI`-`CQP*g_ zJ`vf0CecN;j=WcwtTdJWSwe!rEu95&YKyJ%*;kWZT)H=eSW23dJT{*Kf~NaeAuy=|dtXJ$|D8KbaMI~cY8wKe+mz(ld6{2Xe;aJX3EOI9Qz ze(}A5p+9?I`7$>`85fXfUHHstqJR-lV}pI?Z-;$o7w>1lcy%&A*ZA^sJT7n}`!&dT zBkuh2r7}a&KQ$gkiQ;GN}t z6_Zsh#<1MrtJBhl2m;9=7AYBd>Xv!~RYju3a(*~#h3u?{&wZX@7lu*i-rl(TYqRea zvFvjxj!cP8JF?Kf99{_41OsQg+c534)HL!rL`DP9W{sH%u)#vRFQpL>#Y>H{+x=4T zgHmANZi@to)Gscjf}^kLwq1ZRR(u9Oua%uf(|+gC8ZuDELyC5(2pWheI*ryc4Qhlc z&ZIpfpvW;Jg3F5gS-AH&o-4?cGhQp*PArl5zs)@NIkbD#`Lxf*cBDs*qN#MSIpVZK zvoC6Rwk8o05vRZis?MdFS3xnwUTO=mZ1PS^hD6a96n>sZ%E~uGHf}oi&fifRZf+{f ze;8&BVS`Qc!`8pnjOmiw><@8)b3a9vW9ymGpnT}(v&I;f#?((MMDjdz^m+I`n#Ru> zJ>{AzGHtk;ap0egCW(Pbo{jTQ%|KJhHm%1G6(fFGmp#I~8w>I$M*Xxm@#pvA=i)!o zylM+9X<>%sJHsZD}|W-5*LLwQ26a2BYnoq)5@@DMWptDn?u~PEOsT4V|e15 zD@_|;y9UcVyu;ycW=oewLRiidqjTi7ZF}<%Wl(vV>V5XJWCB?dQfj2Iz}9OuaTF~u z=l_(d{}gSk<4V{|_*=4}P@bQXk5;7Z$sbFt z_Fu!lTnVbt>LI>?=HG=Vk472`8)Pp9PtBI&9FA@b;T&jcflmTuH-09UQbUn zXDPSSt_Ge|qjRh}l_T1|Q++Um@d3Qs(k??E(XYv5;y%-nc49X?w4bmSECGy}V#A`b zxNYf5WX)o4!h+OK8W`9&(rD=wd0CfGm>|CxQAK-`WeY2L8@rB{Y_Fj;&j1Br1%_yd zvyX-~P<+E5xADnf(p%HH=feIBzjxKI&l#Pzy7D?)7{zr2kn%JNT$9Q(^0>j2kpiV>NzIUbxE6+zpMkB6_y(PVv&cL z5rO8BnpBSh)UA=xPTGvw%I#T0{J@uxBbErgg3}!}>Z8J)iY9Q=pto3-Rz9e+!S;NM zT_p&i2<|9h8?;ZC9704%#8b5Y!*29RLRvp{zW=@B7D{uBZ&t35`z@AOVKURl;cL?; zJEd;%VYaIE_dTx|Lvg$YXC^1W{)Ij1ebR5aJVkZuVG~gEp_!XTmAyCzT%`@kTsivr z=UaFGC;++%k47?}HMF_sBS9*|1}=UJHpbB1!1Oy*?4b+or{~FR%Br(xC>P@4Yj?ID z#||%X<~K*2Ju{bw5CTS&2e}~aNo$HRU`)|J7L`~1qt(7e(5Jcw#p!Ln`hoXYq82;b z76B%0Tws8@1;d9vNk@NphwQfPKfnxPhs>?&O`24O9Qxhr1L|S9L+RkmmhFQJBty%4)xbM=?cQ)( znh2+beX`_!(nUW*EOrJPX1K?=TouR9kt^ho1$fm@e z$B1I8WQcDIrI5&HTeXRn^(6jTyK%lGc=PVD4+`E&5tKr%whuvthG8xXN>fGaOUEm<@}d`=0&yb_b$_BN{)kZjmJ#a=-LU4~%#RI| zWJea}vJza75HoBtGfWj`FtP)0Tvxj8KS-e!bD{)+n;!grg!6H|^k_DjF+plIF`VMT* zPU((6Bx?)Jo`d=$hrTOMHBwwp4Y)yWI2Ow_(Po&L{eqfM8U_zy6P(R}!_GvL8}ZPc z)w1>39ez#>DEZuVs*K0G0kbnIEQ1&n{iyzYgeHHGFK$>!@`?BB9l6YpRy~<6L^s7- z$dp8I^$SF_#fb{4mJy?_=B>ul7{@HOX!*CG+e=}AwvB6d7c!~U77RyNoh=VQmx90$ z!oC)*e>SXoKgd0%??Z$lnSscq>azb?GU`Jvjc126|Kz!Es+vFYPlObaZp?e$U##D} zVaemXWx6lH#em>xYClC391JShU9y4Z zt%-+9C*}b!#rwm5!q1XyoQ|V6EhLOOQ)=}S5j^;3E86~uA3 z`Jr})WbR9W>(uO^)}z@0ldDWx`NgxOmfC7+gA7^H(LgHm5cVif0n(HB!)X9LdOm70 zwvB4XVF3z65Rb2iD3w$@W#McUFd~X4=r7__)#G9UW=?VHxhA2;G9YG&aWKVe1 z_PqG3=<&$b2E?X;@ES&i*fs(Uv{cB$e+}zAdPjpv|M!F)0xLRscfeS_tuXHL(*-ld z4_+SHIP|P3ZuF_V)0oNot!*QAIn-=fS8lHf`oi8$up0MAh;9|GcP=p4UtW-_XD~Ih zxbcT3dIyV}Dnp~31&ct@Xo}>3JG1bWi^D@BCxtT}OC(V!gQAUAh<9R!$)CX++t@b9$2Q| z(UKj`eDfXXI5ImG@O`5`GtsvH02twuAASV8M84;qiYnKhZL9;^%`Oi_BwAQ&<7S8E7&zk#u+$OJ{a7b`T zKhbZOnxXOVse7olW%#cDiH=N~n=7>0tut5$LekOp-$V%>@;lC8mqtyx3o#yECYx6- zXgaz_{3RUzoUA^;6B~3|mrB`J*h6iTK65$ZQpsOrEals~NCPSToYnX?j69up)=0A) zh|4_(?CT$%l`_d_t$Z}(LtH%QMAv%YZwBkNr(89s@Bv>sV{5RhgJ%xDu?wi4 zT$`~2JrSBrZLpMAO>C=IG`yE0iDfLAwCA`i*BZMFmnXo-mg_hP)E3Ph)G#d|BKjco zTHtA*fM`qU_Sjm{r6m_73UbH?w4aiFT(N0_L#2piQ8|%8aWx&&r~!1F zyGd;)IyPeo{NOT=f=OcK0L4(r4aj6a|NggoQ}03^|FAy^c*ib=PMIg8`Q;hqLKhxB zn3ctk7;rA#=`3P8V^zYIFA-rlDqv+cXaL_3Wrav|9+N0E(3ww2a3rENib{ynvRY>o zrZ~go#T+Y((=NYtwhg|}e>B?ZXny>{?U7sLXtOh$9kr{>p8LIdxRXJsFX!Lvm|Iwl zz~c{R*!sMyWXe~p0$J!hk`XQ9D=3-1ikO*MDgG8PZji6XtcOe89VpRTJFpm@%tI%l z4^6XWso)gPk#PTlM5-MyBBb~kp3Ep9AQL8pS<(PF&}KbBnnw$&^c;_7#}=>fBo1*5 zV&HG8kxayhQ3MSibl*2XoP7ny^JfLwD4UQy|Ko#Y2fBNbt49Y}-#@pr!7a7_|0V)rU`!Ax8@tZBa(P^FGoPY6|N%X$S5t}St0@YCa zrp{Vjsy^-;1MlKpetxstS!SU<*92^sl#Aj>YnUsIWUJwkdL z?RFaZTc3x5m%zG4ttV_hU#*H^TBAJ<-=J^89ZF$uJ*C9ENN7v&WJ&JALLrG4P#tDy zmVu=v!()0cz1WP_wPBj)hlaJu<`H*qjn%vY`g{~q>(m!Iyj%0l#MtxlO?=PtC?{+% z&`n{f6>yEqC7)5XWVClSqbuwqHqnOJ7U2bKlD?D-;mbS?!2AD+jy|>IE7Y#NN49GO zMUHX3%TEp~OW=1w7g)y|CTct9nbMfU?@;TlkmunOO_6-?m(8K=Ir1_C=_Uz_#C$nb z2I3Uj&!CapiGHN`NRfzwx;j9VC;U`?#9B^v}T4*LI*Qlcb6JRl11eH;bGX2JfmE=Ym4~G7W z=q7fyx5<9LI4K@2eXGd*?QwMf(&nD=1Zq8etm&Rb^9#med{wG(Rif3ciR@pkD@z95 zrM3!7@nIb$w^x~et;Qha5AnC`pOu5={ex`=Xy#;Qb9LCqEoX_YkSk9_YUM)mq;T5# zJVQH0?EqxG2R5LFIuN-%St)NSlyC>eBv|jD$F}S&f?eUf&e%?-G_K#U=g6wA-a`GrK^0qbg2hUTxPKYfWgdve8o^7YBcjr2{n296`qSu_pr(=_ zk{!MVl!|&yv2Z>1HQs=jED+ru{7_Fyr}7CmbWp8Hl|G7N87@}~oZxzD!Hxv#IaZj}M1&J@4kIz& zAxxm20@Rr=hKIjULAbDVde zUn09YUtO>Q($AOkh8FdpFE3q*sov%C$FYQbG+84U-sUtgRXiTj<TTrEKhz&(6M7Zzus%yh_;EC7nSq!gmFat+s`I~`JvPl-&0}e+N?SFGtY?mXh z4W~5WN40vfb4w67c{x-+GxRtm2hWvPVou=(XVN5L?|Y~xb~G0V2Jr78gVldX<^P*a z^_Du}EL7o+mB@{hJ?4Wna$0L#6C}Um#uwG|+EM%7xgumx_58gi4l7-*J()S_UF#eg zw^LKC&7lfl!%k~+eXgm4>jgvn%-d=knI%}4A2^8pYB~?@dXh}GUG^$$IO3WU(ABn=57CAIiB9Ry z_^gdGkHX3$e4v^HY6BhWB$20?gB9^<@CmXw(1qF(?RuLpcK@h{ZwTn_FO&of$QgLH(>c;!_VX z?N+*SlT5qh0@wmOZBIrJm5LZAAZe4yjgxv@z$Y4mMLv4J)i-{ak^$$U*B@wJBtCaP z1}F}xglBTzJvwQ|BYFZOhYd&r#c~Ghu!tV+f5I)IRh?gLp)k60&kck9V(Z1uiPqp6 zn|jXum*|POvvK|La#rhognsCD6cP76{ZE{~7Nlj>(}wtbfI%%kLbRXEYh+;R(N(gAw@+qQqxvr{$(#LQvo`M z2OGY^Iaj`4U5s~sp-cLH0LHOseT{seth=FnchJv*qM)s^12vSP3PZM|Nv2ivOMCOI z%!>ZBi-Ycz_ZJify4pzWF-t5z-kg*`U5mTw=|BPpB2#`eE%a#!R4BLnJ*->)5naZLj-_ypwN&^HchJtR&b~P{IV-uadc9%3WAKQXvpj z^+%*27Xv#@c5u3`cLH(j4L%{K!%4W0&W;enQ?A{APl zlev;w$ipw|ZsMa9P?)L->>aleXl) z2i`pF9qeokKDVG~;^dFCiOmd#?8^8+v?6-cu8(FiXlczmXul-8lORsQ$DgV#Gfr^D z#M@2hrb2@tqLI?YZu5|+lTD8_u>%p7A zrr?UKnh0N0o3;2vT%gTxvwaI_8pI4l1-xR#`chF_RJh^JJLxukAZ1)fw4|XbLtFsb zLtp)lz#aeLcqi`d+*=#xCi};)#~Txuo{m2y_bga%^UL}JK0$v6BL>=<&Vn`aO&h_7 z%&_QVmWi8jw~1Gd)~ILvXE25BV=3DNyv(ScBfTrX8;ep*Fm0AB`X2GtUY!#lu*8AX zX}qDJ_z*F{o-FPb`!=I`H((Do44p;UNz{5?og{&;8rt7TEj-!tv?9HtSrMd(4Us75 z;cIb^Wq{`R$A3*6|69^D!gq|lP;Q<<402_5Hwj|=WhV!}0+u2T_R$J`9UW=N2FKzO zpO|3QT3V&2kmhSuBkSl_MPzr~vr^xCVFPiouKq|^2+8C67xVSfng4&%-aJ&1gl#0~ z;PZQJU@C7R9>W9DHuX302XyZTJVOjl*_y>%fWy%ey;@Hcf%$3-Jw%;qEP;VjnV&|a z|2;&nB6)#dxjoG)H@0OtMyij^kaiK;&rd>02s4VZ$fEqX}holxI*n!aOyz94hr0*iJ{u(blUT2 zdVGHHW>-SrXq5XqVUaMET5KSO3!_1W`zidW53PttBT(tbZ)lAGzX7p?L>>eoSFQG7 zoG2rlV3eV-uRe)Ye{5&>RplE`m(X^H&7uiXXR)G!NaE*ky)1$3idT?ZOZngLEy%+U z57DB3SoZ}ikM+Ack`9@S=l6U}qFPZ?oxKFGe+1-*80zRANPK@_zfo#z9!-oNn68Jo zuE>AX9E;yac`c~eQtxTl43NJeMKiMhwnpk~(j4oh^Z zXfkVO;fyHM+4VP=aE5=HWwCkg$okxDp3i5Oe+ljx9SiTx7Iaw`A?M8J0xx;SprD5# zr!XXc8<_7eK-ZVP4w1V}{&wXWU(&n4GW}fd(@exOH8)LN#M+>ZNG*fA^VcNOsrtyn zdc#9FZ*ddf)N!!7W~yPZB0&55w9}V*`nOoAA&+u`jIP2KLP?PGCQN<(Ge>L|VPLRp zuA^wLQ@I?+P4bXAlP%$2zq%M$t?TOL6Ko*l^)G9`R72d!e*Or-FpQU8+)6mS9jZ-5 zX1)ajmGlF%JKP5^tS{+2PBvylJS2|FF_rDBeHXPc-xJy4z<8NHd(!cHQb*-W5RumB z7s`EjbkF$kK6`}`(Y``G@|K(E|1k05|5Nk`$iaLGnlOp3406SG#GB#umRE~E((fiN z5g9QWA8!i%?ARLZju5A6^y=C7%LmRt zFU%M#-uRc_-z*m9&3GPGvsHD5S{X65D*N>WWtBM27pbnvPl5ssG~&1ico5AplFXr{ zAGK8bNIgO(&AXC_!vkN{axo`kZ8fV>EhI>ug#QoR_|I*KL&3vZ!n*VU9kScPPezTD z&MXTtDH*LEECBOdiMQ-%{ioowub`PO^A z2h8Ez2^2peTX4=)5Vmo?YxsFEZn)CX*rfWT>7~y{pCDB?_XvQWw;x<2q_r*Y3;)_@ zfvC{t1N9eb7MM!iV2r{pBL1jEq=3`+mI{*;8en^3%UabUQ?~ z2~DyQ&Y+%CM|vmN6i!o-5#*;x9$o65=9u#&Hh-eR4=4wdK<>6eCNN%YNi5fy2&AP>}n)^fan zs@rV!U7F7Tzg{+vskfv}q%lJr$S4d;>v2q%p-29F>8p8Q4Lfv#uYC+zr9cNUi#1gI zrQRW`0I-AY9sHee<#SmRBDQu+0bb7${kq#w`#ZE2d(%iGV=%r>ZPrR#34q=IS#9RF zfS1cHPFmghn#A1fEAyGm3fZy{Q&u=#FW27E7azSzeQDN`$<9|_babV5cS?m z+QUnik88N<;y%qzfc85e2+5-$VldcFkCGJLx~pm$-1!7EFZb7 zH6zb(C_bBbGg8h6sM_Ma-@<ENz@fYu6c#Qk9$ui%V{*~pJSJ) zf2tGjhK&uC`yewUst(*~&{z^F0??bl_+bR&z0iX1Xv^@9uaO%vH4wpkYihpgQ?`iy zc|+KobIEMc_c38!Q|V47jMu-jA5jx63;GLN?J0wV=>#hx`#G-#lJh7V!^#XgM0OuO!~-wVM>V8L@93WwZ{MXK zT)2H#dCK0y)(?47)nd!Yr5f$qcIN4I=rhOuW$(O{H?#*ui!yK3krLRu8U%ULpaL4y zrc=ckt2p~Ej4ckzt57j}3yL`A5dI8)3`O)C^{p3$W8M>JMIRx%Cf; z*lz#*lJfNCJv3pvN`TF0hWHcJ__W4Yd)=BP6ww5JIhpL`Y6A1%0a9=^Hjq!H7zhs*SId&2Ey zOW1}gtm0ByO&2SAh_e$IDS1usO!3@(gmDjF_vc_B;pUC7Zb(EcqdT1F&rq@TRgU&g zs6;Eki@^lMZ_?@6l4zbU2~Xj^8KK!>&I7k4K^{aL=qhK8EZ%-zCUtDwvU*R~cPVER zdav+{7YKWHtoiQc()i)K4P7A1Rp{G?&t(=s&_}Puw-CcyueLHK=EcR=(ki<_y8O@e zOQF!4AW`=*{e1|(2$4U)3tFMtcPtfWu^50(qSX=u{Wi%V(S_JGi|fq#uCBOP@vEEf z!y2abH3~eiGzxQG{*pFl9ekQbHO?&T61*R^8n>ht0zF_CSIrqQQOO>$b-yl`ec^$Q z#@lNKW6JkInn1(Vf}PY3wxFdQr~GAwNKj!aUZ__gfd_$pIMC351dF!gO}G?>)ZTh5T6-Qi zifWS^p)#v~VZu+)5Z>xj{2^uSwJQn3KUsLqJ%g2P9()uV&bx8LH_}_zbn6$+Te-KK zp1{^+vmapCPnqfV8m1p06+WhYpxyg~<@ zuQN%3#$*jLAV-g>YCq^}b)RCvVQsrQi-e7D%o zur)eipbBnlIv2VDFCSqw5DD-F$Zuz-+)_e^AQZaCZ+^&fBgzp7g_a_Q;k=d*7(B{pmq{iLG2HeRt-*>WkMUv)iq z|bW{T@?`%If$`ELmB)FNy0fu8$MuA zX-E?M#$Td~t2Vq=up@{BxW{10gWt3R3=DXJT~q?EX*kAflELW&^T7f(05I{LuKVaS zcg#*|4rIwmSj?@S*b(n!dX*)$rW2Hw2>m3KtP6yVBE z^*6e9?G(Bn#5)dqPadwDNAw0Nod|*N=rZ`w7>$bSLWtrh4~<8?d1;@}xUR%dw(8Q^ zS#|_eI&-vg*}RrpYfYM_#wQdpGlR-Mk2!g_yib-yz4)onK4b##AwAUFXhB2_(L{ern3DYweRo;9vPCOB1fANHioyK@tYbp|aUrdrx53P#gYG3@ z8^R&t{n{EQ34y^L{dFaI z_zcKcYEbE{?3qUV_R(7;3DBUWY0B73#ej7?H1Xsz>#sFGUrGH54KBmxp<&w$4!ETR zqQzj+r6RsU_Ad;-{My3p=WgX}_PH_j+Nm}l99~&~WSwy{g+HVeXpI?ha!wyVF;xAa zc;fE&G@^}B`Na6Mth5qUW@_$TRrHX|617pW#!w*QuL++xySN?^-cn^?T3xk2=!82o zZV?0A81&A7G=IEB|>7tL3 zDsV60QWmmP_)RmnJgr(EIs~gYXbr|zinIcc0(eSSsiaa~`~~3hs5V&C8ML?v|BPCQ z*CT<|MFhdGY36}TKcQEm3K9WF@u?7YO?7R_J{|RV?U?|ZyrdKK5#;pgMZg}7+k~^Z zBa%zB@=xMJsb$h)x`X-`S*Bm5&q2J5U|OF2`AHL>>9d&Cjb10ZafU(1@Q=ZSR|y|< zL^t@U=Kj#T=F)ZNy_e|y6K9jXh7&d{5!Su8X|r7)uD8KRaU0N1)4L(Ij|xF=Z3EPk z8gG_Q9fc#u-@e^NP|@Gus1|4Zb(INgL~>f0rznQD4;ZHX2(&@^E+xHT*@-EAgNR@9 z)%JhmIgk3QUo_UWM>~HETEcdDU$b`$xoEwz`EN7vVauzxmfu}n8|C()n3|&~lisCr zpOacOaFex{Y=d)UFw;oJzklHxGw!&7`uZ=+EMqUj&j%W$$p$|aO>2;-bO=34tWHvh zOZpdl;tMQ^y-Y!P(z0 z?iQ&PD(t|Urb%aYNM_UZw()iq)ahj)FT?$o0T%!1zsRh+x6F&=D;uIR%il4(yxi_m z=DF=tpgGG|eYa2YEQ0Aa|1dR$DxIsRedzi$bT#m zz-x5$$21{>{+IY7Qgyy758{fn>@nh46eXUjfTMdAEoPr+&rccqm}lGI%7^AF_ioud z5gGEP)GcJ6io*=zH}CI2-;Rgkbuft$mkSfhpiY``k3;+rt|XA3&hS@`3e)qTUYSo6 zMiXy%w~TI%m#GK-_#>bG)*D)Te#+bN`Jte#y|dGk6PNkB0U9nOf9+;E0^gsB)!7Ujs0?IX1H?gwfne! z5m1W>f0-s9kR}F-8gYL+?6828@gtQuB-?<<5>{Qhe&&Q!yO3z|3jg1DI(?VEEUmfM z9TdyE;z----D)TGH(n0=Q=r2wdgn2hlqGTDEa$iHCM8-#p~2-rF$g%lHYyZW#6>__-Bn8$P5GOQ8FYWn%m44*_p1K;kJnx6 z|Jv(E`PXW7!a z-tTJO%Kth0+v?mmEDo*tWBVrm>W}B<^7UK4O>YB_T!ISyq_gQq)I5Dd_6Qm2Z4S22 zU#9M@*88DGa`z$qc`uEfHt&%A0bJnpZxN&EoQwH|Gnb#oC~<%SrEkpp>*L=2KZ0P&uN>UU(c|6^8TWT@{^HClq=6_|wV~8{Msw?cPVumh%tfl_{mV7+_RzJeENr$J##NIeueb#jS!i$&8 z9`4;S$3Nr8l_Pb*_0RTgySrHa{^kBX77z8}!?(ZsyQS`LbpEbMrCaM`ynotaE3QoAVubM;ACA?+TPpPW=@jElB?weNtmk*o$`Q(0zgf3_UCS=WJ? z5Bh;~%=6!}D#D7#&U}XIh;JFYzKhmQ`d zWRRn+&dvdi1{o!q+Y$n#$-7Vh17{;Brene~`W z+Wvlh_kDd!zdLa#w%oY|Y|nAb{Pni@{Jf*WQcowoxjosfQib<}Pv3R Date: Mon, 13 Jan 2020 12:44:52 -0500 Subject: [PATCH 174/911] Add Nix installation instructions + note about Charm loving open source --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8be1df9..ce8d217 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,9 @@ brew install glow # Arch Linux (btw) yay -S glow +# Nix +nix-env -iA nixpkgs.glow + # FreeBSD pkg install glow ``` @@ -100,8 +103,7 @@ glow --help * [Toby Padilla](https://github.com/toby) * [Christian Rocha](https://github.com/meowgorithm) -Part of [Charm](https://charm.sh). For more info see `ssh charm.sh` - +Part of [Charm](https://charm.sh). For more info see `ssh charm.sh`. Charm热爱开源! ## License From 5038a7b69fbcf970f930ea73452313fcfc2ef292 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 14 Jan 2020 02:20:21 +0100 Subject: [PATCH 175/911] Use glamour's 'auto' style per default --- README.md | 4 +++- go.mod | 2 +- go.sum | 10 ++++++---- main.go | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ce8d217..431d8d4 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,9 @@ This defaults to the ANSI-aware `less -r` if `$PAGER` is not explicitly set. ### Styles -You can choose a style with the `-s` flag (`dark` being the default): +You can choose a style with the `-s` flag. When no flag is provided `glow` tries +to detect your terminal's current background color and automatically picks +either the `dark` or the `light` style for you. ```bash glow -s [dark|light] diff --git a/go.mod b/go.mod index a0b110a..c6de070 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.1.0 + github.com/charmbracelet/glamour v0.1.1-0.20200114010931-28cbdae8e7a9 github.com/dlclark/regexp2 v1.2.0 // indirect github.com/mattn/go-isatty v0.0.4 github.com/spf13/cobra v0.0.5 diff --git a/go.sum b/go.sum index adb9866..a1cf1ef 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,8 @@ github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MR github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.1.0 h1:BHCtc+YJjoBjNUnFKBtXyyM4Bp9u7L2kf49qV+/AGYw= -github.com/charmbracelet/glamour v0.1.0/go.mod h1:Z1C2JkVGBom/RYfoKcPBZ81lHMR3xp3W6OCLNWWEIMc= +github.com/charmbracelet/glamour v0.1.1-0.20200114010931-28cbdae8e7a9 h1:bFDASzHqTkOChp6d/vJTec7pezqw0htRcsZLF7wJRow= +github.com/charmbracelet/glamour v0.1.1-0.20200114010931-28cbdae8e7a9/go.mod h1:o4qO9f0Hr86NartqrG8FLNZyNOB1I8r9hN8l8tPNzqw= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -31,6 +31,8 @@ github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55k github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f h1:5CjVwnuUcp5adK4gmY6i72gpVFVnZDP2h5TmPScB6u4= +github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= github.com/gorilla/csrf v1.6.0/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= github.com/gorilla/handlers v1.4.1/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -39,8 +41,6 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/logrusorgru/aurora v0.0.0-20191116043053-66b7ad493a23 h1:Wp7NjqGKGN9te9N/rvXYRhlVcrulGdxnz8zadXWs7fc= -github.com/logrusorgru/aurora v0.0.0-20191116043053-66b7ad493a23/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -55,6 +55,8 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/muesli/reflow v0.0.0-20191216070243-e5efeac4e302 h1:jOh3Kh03uOFkRPV3PI4Am5tqACv2aELgbPgr7YgNX00= github.com/muesli/reflow v0.0.0-20191216070243-e5efeac4e302/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= +github.com/muesli/termenv v0.0.0-20200114005430-a7aeffd54956 h1:OZIYilqRi/+iIIY/9SfuRpZIujheG5Stml2tI1PpAkM= +github.com/muesli/termenv v0.0.0-20200114005430-a7aeffd54956/go.mod h1:QAW21ZWi5eDIAoYsevV52sibdVVCl44P+TvI0C0VKEU= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= diff --git a/main.go b/main.go index 7497c55..de3de52 100644 --- a/main.go +++ b/main.go @@ -217,6 +217,6 @@ func init() { rootCmd.Version = Version rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") - rootCmd.Flags().StringVarP(&style, "style", "s", "dark", "style name or JSON path") + rootCmd.Flags().StringVarP(&style, "style", "s", "auto", "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 100, "word-wrap at width") } From 8d7f683321a13ab7e4141129d38382ebe656baa5 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 23 Jan 2020 19:40:47 +0100 Subject: [PATCH 176/911] Bump glamour dependency --- go.mod | 2 +- go.sum | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index c6de070..2cc038b 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.1.1-0.20200114010931-28cbdae8e7a9 + github.com/charmbracelet/glamour v0.1.1-0.20200123183909-83d2d655c9a5 github.com/dlclark/regexp2 v1.2.0 // indirect github.com/mattn/go-isatty v0.0.4 github.com/spf13/cobra v0.0.5 diff --git a/go.sum b/go.sum index a1cf1ef..be6c428 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,8 @@ github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MR github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.1.1-0.20200114010931-28cbdae8e7a9 h1:bFDASzHqTkOChp6d/vJTec7pezqw0htRcsZLF7wJRow= -github.com/charmbracelet/glamour v0.1.1-0.20200114010931-28cbdae8e7a9/go.mod h1:o4qO9f0Hr86NartqrG8FLNZyNOB1I8r9hN8l8tPNzqw= +github.com/charmbracelet/glamour v0.1.1-0.20200123183909-83d2d655c9a5 h1:/X7YRey5gylBEWLtTgJroGqiDrpAKvncpykj25WrECA= +github.com/charmbracelet/glamour v0.1.1-0.20200123183909-83d2d655c9a5/go.mod h1:hCrjHciiwG2s01wOYnBQe+TTsp0vXTSmBhtjBiNrmTc= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -55,8 +55,8 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/muesli/reflow v0.0.0-20191216070243-e5efeac4e302 h1:jOh3Kh03uOFkRPV3PI4Am5tqACv2aELgbPgr7YgNX00= github.com/muesli/reflow v0.0.0-20191216070243-e5efeac4e302/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= -github.com/muesli/termenv v0.0.0-20200114005430-a7aeffd54956 h1:OZIYilqRi/+iIIY/9SfuRpZIujheG5Stml2tI1PpAkM= -github.com/muesli/termenv v0.0.0-20200114005430-a7aeffd54956/go.mod h1:QAW21ZWi5eDIAoYsevV52sibdVVCl44P+TvI0C0VKEU= +github.com/muesli/termenv v0.2.0 h1:ndm3eEL62aIpsrPlwLLUIFRvM5E/4mmAhtbAI1TaHGY= +github.com/muesli/termenv v0.2.0/go.mod h1:w4z90GOtP0+Cqm08fVBQ1RlXtVQ9MyHrV/ZtQ3869SM= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= From fdaa2ca91ab6d0f8a270a2734f929fa4edc2495c Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 31 Jan 2020 13:09:23 +0100 Subject: [PATCH 177/911] Bump indirect glamour/termenv dependency --- go.mod | 6 +++--- go.sum | 16 ++++++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 2cc038b..e3d6f11 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,10 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.1.1-0.20200123183909-83d2d655c9a5 + github.com/charmbracelet/glamour v0.1.1-0.20200131120649-7467d9e1a515 github.com/dlclark/regexp2 v1.2.0 // indirect - github.com/mattn/go-isatty v0.0.4 + github.com/mattn/go-isatty v0.0.12 github.com/spf13/cobra v0.0.5 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect - golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a + golang.org/x/sys v0.0.0-20200116001909-b77594299b42 ) diff --git a/go.sum b/go.sum index be6c428..96f0bb9 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,8 @@ github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MR github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.1.1-0.20200123183909-83d2d655c9a5 h1:/X7YRey5gylBEWLtTgJroGqiDrpAKvncpykj25WrECA= -github.com/charmbracelet/glamour v0.1.1-0.20200123183909-83d2d655c9a5/go.mod h1:hCrjHciiwG2s01wOYnBQe+TTsp0vXTSmBhtjBiNrmTc= +github.com/charmbracelet/glamour v0.1.1-0.20200131120649-7467d9e1a515 h1:bxb7loDpBJsKqjitMXAttJv4lJOTgca8hfJvQLqiZ4A= +github.com/charmbracelet/glamour v0.1.1-0.20200131120649-7467d9e1a515/go.mod h1:M4PNtslkf+VBLVjFd432kDf5bS0Jc1onuTdWIIDA82Y= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -47,6 +47,8 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= @@ -55,8 +57,8 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/muesli/reflow v0.0.0-20191216070243-e5efeac4e302 h1:jOh3Kh03uOFkRPV3PI4Am5tqACv2aELgbPgr7YgNX00= github.com/muesli/reflow v0.0.0-20191216070243-e5efeac4e302/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= -github.com/muesli/termenv v0.2.0 h1:ndm3eEL62aIpsrPlwLLUIFRvM5E/4mmAhtbAI1TaHGY= -github.com/muesli/termenv v0.2.0/go.mod h1:w4z90GOtP0+Cqm08fVBQ1RlXtVQ9MyHrV/ZtQ3869SM= +github.com/muesli/termenv v0.4.0 h1:8Bz8WDF/6OoL7QENtESkAl3TlMyQq6+c3bjtJO3y9V8= +github.com/muesli/termenv v0.4.0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= @@ -84,8 +86,8 @@ github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljT github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.19 h1:0s2/60x0XsFCXHeFut+F3azDVAAyIMyUfJRbRexiTYs= -github.com/yuin/goldmark v1.1.19/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.22 h1:0e0f6Zee9SAQ5yOZGNMWaOxqVvcc/9/kUWu/Kl91Jk8= +github.com/yuin/goldmark v1.1.22/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20181220203305-927f97764cc3 h1:eH6Eip3UpmR+yM/qI9Ijluzb1bNv/cAU/n+6l8tRSis= @@ -96,6 +98,8 @@ golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From ba7c9a5ea535b5cc663ec8f302ed0c15cf93daed Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 26 Feb 2020 11:47:09 -0500 Subject: [PATCH 178/911] Add Void Linux installation instructions --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 431d8d4..3be5feb 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,9 @@ brew install glow # Arch Linux (btw) yay -S glow +# Void Linux +xbps-install -S glow + # Nix nix-env -iA nixpkgs.glow From 360aca7ee5d7fe784ef7e80e777fe29df9eadc09 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 28 Feb 2020 07:19:23 +0100 Subject: [PATCH 179/911] Bump glamour & reflow dependencies --- go.mod | 2 +- go.sum | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index e3d6f11..3a73856 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.1.1-0.20200131120649-7467d9e1a515 + github.com/charmbracelet/glamour v0.1.1-0.20200228061743-9474015b7936 github.com/dlclark/regexp2 v1.2.0 // indirect github.com/mattn/go-isatty v0.0.12 github.com/spf13/cobra v0.0.5 diff --git a/go.sum b/go.sum index 96f0bb9..fef9211 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,8 @@ github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MR github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.1.1-0.20200131120649-7467d9e1a515 h1:bxb7loDpBJsKqjitMXAttJv4lJOTgca8hfJvQLqiZ4A= -github.com/charmbracelet/glamour v0.1.1-0.20200131120649-7467d9e1a515/go.mod h1:M4PNtslkf+VBLVjFd432kDf5bS0Jc1onuTdWIIDA82Y= +github.com/charmbracelet/glamour v0.1.1-0.20200228061743-9474015b7936 h1:KXzF0CEGJuJB6+w8Z81Qx3XxmqDuro4t7KJyl/DJH7s= +github.com/charmbracelet/glamour v0.1.1-0.20200228061743-9474015b7936/go.mod h1:mMY+wZZBedUk5eLexoy4uNmbJAj4/Q4ePCzEvAm1i8Q= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -55,8 +55,8 @@ github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+i github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/muesli/reflow v0.0.0-20191216070243-e5efeac4e302 h1:jOh3Kh03uOFkRPV3PI4Am5tqACv2aELgbPgr7YgNX00= -github.com/muesli/reflow v0.0.0-20191216070243-e5efeac4e302/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= +github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= +github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/termenv v0.4.0 h1:8Bz8WDF/6OoL7QENtESkAl3TlMyQq6+c3bjtJO3y9V8= github.com/muesli/termenv v0.4.0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= From e4091b0ff60606b1d2225eda18a801be0f7746e9 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 28 Feb 2020 07:19:32 +0100 Subject: [PATCH 180/911] Update README --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3be5feb..7e52aa5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # Glow -[![Latest Release](https://img.shields.io/github/release/charmbracelet/glow.svg)](https://github.com/charmbracelet/glow/releases) [![GoDoc](https://godoc.org/github.com/golang/gddo?status.svg)](https://godoc.org/github.com/charmbracelet/glow) [![Build Status](https://github.com/charmbracelet/glow/workflows/build/badge.svg)](https://github.com/charmbracelet/glow/actions) [![Go ReportCard](http://goreportcard.com/badge/charmbracelet/glow)](http://goreportcard.com/report/charmbracelet/glow) +[![Latest Release](https://img.shields.io/github/release/charmbracelet/glow.svg)](https://github.com/charmbracelet/glow/releases) +[![GoDoc](https://godoc.org/github.com/golang/gddo?status.svg)](https://godoc.org/github.com/charmbracelet/glow) +[![Build Status](https://github.com/charmbracelet/glow/workflows/build/badge.svg)](https://github.com/charmbracelet/glow/actions) +[![Go ReportCard](http://goreportcard.com/badge/charmbracelet/glow)](http://goreportcard.com/report/charmbracelet/glow) Render markdown on the CLI, with _pizzazz_! From e4263b12864e50bc9dfa2feeb0ef7d4be61e922a Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 4 Mar 2020 14:48:22 +0100 Subject: [PATCH 181/911] Bump indirect goldmark & chroma dependencies --- go.mod | 2 +- go.sum | 27 ++++++--------------------- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/go.mod b/go.mod index 3a73856..79c4c74 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.1.1-0.20200228061743-9474015b7936 + github.com/charmbracelet/glamour v0.1.1-0.20200304134224-7e5c90143acc github.com/dlclark/regexp2 v1.2.0 // indirect github.com/mattn/go-isatty v0.0.12 github.com/spf13/cobra v0.0.5 diff --git a/go.sum b/go.sum index fef9211..3c3c3a8 100644 --- a/go.sum +++ b/go.sum @@ -1,26 +1,20 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= -github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= -github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= -github.com/alecthomas/chroma v0.7.0 h1:z+0HgTUmkpRDRz0SRSdMaqOLfJV4F+N1FPDZUZIDUzw= -github.com/alecthomas/chroma v0.7.0/go.mod h1:1U/PfCsTALWWYHDnsIQkxEBM0+6LLe0v8+RSVMOwxeY= +github.com/alecthomas/chroma v0.7.2-0.20200304075647-34d9c7143bf5 h1:yt5ij+XTe1QL+TpFj7i547enM5YuGKp9nZ/WvOoqcsQ= +github.com/alecthomas/chroma v0.7.2-0.20200304075647-34d9c7143bf5/go.mod h1:fv5SzZPFJbwp2NXJWpFIX7DZS4HgV1K4ew4Pc2OZD9s= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= -github.com/alecthomas/kong v0.1.17-0.20190424132513-439c674f7ae0/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= -github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MRgZdU3vrFd05IQ89AxUZ0aYdF39BYoNFa324SodPCA= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.1.1-0.20200228061743-9474015b7936 h1:KXzF0CEGJuJB6+w8Z81Qx3XxmqDuro4t7KJyl/DJH7s= -github.com/charmbracelet/glamour v0.1.1-0.20200228061743-9474015b7936/go.mod h1:mMY+wZZBedUk5eLexoy4uNmbJAj4/Q4ePCzEvAm1i8Q= +github.com/charmbracelet/glamour v0.1.1-0.20200304134224-7e5c90143acc h1:WSZ06evYgfSZYqkcv0+jFVSVCJeYsIvU+J4ILZUrha4= +github.com/charmbracelet/glamour v0.1.1-0.20200304134224-7e5c90143acc/go.mod h1:sC1EP6T+3nFnl5vwf0TYEs1inMigQxZ7n912YKoxJow= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -33,14 +27,9 @@ github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55k github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f h1:5CjVwnuUcp5adK4gmY6i72gpVFVnZDP2h5TmPScB6u4= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= -github.com/gorilla/csrf v1.6.0/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= -github.com/gorilla/handlers v1.4.1/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -59,11 +48,9 @@ github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/termenv v0.4.0 h1:8Bz8WDF/6OoL7QENtESkAl3TlMyQq6+c3bjtJO3y9V8= github.com/muesli/termenv v0.4.0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= -github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -83,11 +70,9 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.22 h1:0e0f6Zee9SAQ5yOZGNMWaOxqVvcc/9/kUWu/Kl91Jk8= -github.com/yuin/goldmark v1.1.22/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.24 h1:K4FemPDr4x/ZcqldoXWnexTLfdMIy2eEfXxsLnotTRI= +github.com/yuin/goldmark v1.1.24/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20181220203305-927f97764cc3 h1:eH6Eip3UpmR+yM/qI9Ijluzb1bNv/cAU/n+6l8tRSis= From 0483c3d42ab26ce54a6ea41334240b65286e83c5 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 4 Mar 2020 17:42:14 +0100 Subject: [PATCH 182/911] Test against Go 1.14 --- .github/workflows/go.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index b1699e8..0f6b72d 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -4,7 +4,7 @@ jobs: test: strategy: matrix: - go-version: [1.11.x, 1.12.x, 1.13.x] + go-version: [1.11.x, 1.12.x, 1.13.x, 1.14.x] platform: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.platform }} env: @@ -35,4 +35,4 @@ jobs: go test -race -covermode atomic -coverprofile=profile.cov ./... GO111MODULE=off go get github.com/mattn/goveralls $(go env GOPATH)/bin/goveralls -coverprofile=profile.cov -service=github - if: matrix.go-version == '1.13.x' && matrix.platform == 'ubuntu-latest' + if: matrix.go-version == '1.14.x' && matrix.platform == 'ubuntu-latest' From b4398fca331198558d53a2275e9eb67dc1aea12b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 4 Mar 2020 17:42:26 +0100 Subject: [PATCH 183/911] Link to pkg.go.dev instead of godoc.org --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7e52aa5..033b8c6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Glow [![Latest Release](https://img.shields.io/github/release/charmbracelet/glow.svg)](https://github.com/charmbracelet/glow/releases) -[![GoDoc](https://godoc.org/github.com/golang/gddo?status.svg)](https://godoc.org/github.com/charmbracelet/glow) +[![GoDoc](https://godoc.org/github.com/golang/gddo?status.svg)](https://pkg.go.dev/github.com/charmbracelet/glow?tab=doc) [![Build Status](https://github.com/charmbracelet/glow/workflows/build/badge.svg)](https://github.com/charmbracelet/glow/actions) [![Go ReportCard](http://goreportcard.com/badge/charmbracelet/glow)](http://goreportcard.com/report/charmbracelet/glow) From 8d6da194eb6466efb938bfdb7cab19c1d04990c3 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 4 Mar 2020 22:36:08 -0500 Subject: [PATCH 184/911] Add Glow logo to README --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 033b8c6..b9863ba 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,15 @@ # Glow -[![Latest Release](https://img.shields.io/github/release/charmbracelet/glow.svg)](https://github.com/charmbracelet/glow/releases) -[![GoDoc](https://godoc.org/github.com/golang/gddo?status.svg)](https://pkg.go.dev/github.com/charmbracelet/glow?tab=doc) -[![Build Status](https://github.com/charmbracelet/glow/workflows/build/badge.svg)](https://github.com/charmbracelet/glow/actions) -[![Go ReportCard](http://goreportcard.com/badge/charmbracelet/glow)](http://goreportcard.com/report/charmbracelet/glow) - Render markdown on the CLI, with _pizzazz_! +

+ Glow Logo + Latest Release + GoDoc + Build Status + Go ReportCard +

+ ![Glow example output](https://github.com/charmbracelet/glow/raw/master/example.png) From 5cdf8294a880f231016c6afa96cacf6a132c9df3 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 31 Mar 2020 06:58:21 +0200 Subject: [PATCH 185/911] Use glamour's WithAutoStyle option as default --- go.mod | 2 +- go.sum | 12 ++++++------ main.go | 9 ++++++++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 79c4c74..b21e4ae 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.1.1-0.20200304134224-7e5c90143acc + github.com/charmbracelet/glamour v0.1.1-0.20200331045007-ba2d2a0ec5d8 github.com/dlclark/regexp2 v1.2.0 // indirect github.com/mattn/go-isatty v0.0.12 github.com/spf13/cobra v0.0.5 diff --git a/go.sum b/go.sum index 3c3c3a8..d07a12a 100644 --- a/go.sum +++ b/go.sum @@ -9,8 +9,8 @@ github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUS github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.1.1-0.20200304134224-7e5c90143acc h1:WSZ06evYgfSZYqkcv0+jFVSVCJeYsIvU+J4ILZUrha4= -github.com/charmbracelet/glamour v0.1.1-0.20200304134224-7e5c90143acc/go.mod h1:sC1EP6T+3nFnl5vwf0TYEs1inMigQxZ7n912YKoxJow= +github.com/charmbracelet/glamour v0.1.1-0.20200331045007-ba2d2a0ec5d8 h1:SY1gbDnzOUuob4JohyN+LF+kzcZ3T3/R2AOs+GpWXk0= +github.com/charmbracelet/glamour v0.1.1-0.20200331045007-ba2d2a0ec5d8/go.mod h1:lH8rLVnKLgwyuP0PAHUCsxZdA7ZSKyqsmX0X5fXAOLs= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -46,8 +46,8 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= -github.com/muesli/termenv v0.4.0 h1:8Bz8WDF/6OoL7QENtESkAl3TlMyQq6+c3bjtJO3y9V8= -github.com/muesli/termenv v0.4.0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= +github.com/muesli/termenv v0.5.0 h1:7uYkBUJ2EE+CdWlBoYzO70I/cq/r3bOm4a40/lvmiAU= +github.com/muesli/termenv v0.5.0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -71,8 +71,8 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.24 h1:K4FemPDr4x/ZcqldoXWnexTLfdMIy2eEfXxsLnotTRI= -github.com/yuin/goldmark v1.1.24/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.26 h1:81MfIApzizD8JqKIjnWy2Vxj7GgmQUrJlh/jYWH8yGk= +github.com/yuin/goldmark v1.1.26/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20181220203305-927f97764cc3 h1:eH6Eip3UpmR+yM/qI9Ijluzb1bNv/cAU/n+6l8tRSis= diff --git a/main.go b/main.go index de3de52..0d5a9ab 100644 --- a/main.go +++ b/main.go @@ -156,8 +156,15 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { baseURL = u.String() + "/" } + var gs glamour.TermRendererOption + if style == "auto" { + gs = glamour.WithAutoStyle() + } else { + gs = glamour.WithStylePath(style) + } + r, err := glamour.NewTermRenderer( - glamour.WithStylePath(style), + gs, glamour.WithWordWrap(int(width)), glamour.WithBaseURL(baseURL), ) From ec9cc0bde48b6a32f6d390c01132a3fcbcb950ca Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 31 Mar 2020 08:53:35 +0200 Subject: [PATCH 186/911] Make source private --- github.go | 4 ++-- gitlab.go | 4 ++-- main.go | 20 +++++++++++++------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/github.go b/github.go index 1b04da7..3b944cc 100644 --- a/github.go +++ b/github.go @@ -22,7 +22,7 @@ func isGitHubURL(s string) (string, bool) { } // findGitHubREADME tries to find the correct README filename in a repository -func findGitHubREADME(s string) (*Source, error) { +func findGitHubREADME(s string) (*source, error) { u, err := url.ParseRequestURI(s) if err != nil { return nil, err @@ -39,7 +39,7 @@ func findGitHubREADME(s string) (*Source, error) { } if resp.StatusCode == http.StatusOK { - return &Source{resp.Body, v.String()}, nil + return &source{resp.Body, v.String()}, nil } } diff --git a/gitlab.go b/gitlab.go index 7c6dfa5..7bebc93 100644 --- a/gitlab.go +++ b/gitlab.go @@ -22,7 +22,7 @@ func isGitLabURL(s string) (string, bool) { } // findGitLabREADME tries to find the correct README filename in a repository -func findGitLabREADME(s string) (*Source, error) { +func findGitLabREADME(s string) (*source, error) { u, err := url.ParseRequestURI(s) if err != nil { return nil, err @@ -38,7 +38,7 @@ func findGitLabREADME(s string) (*Source, error) { } if resp.StatusCode == http.StatusOK { - return &Source{resp.Body, v.String()}, nil + return &source{resp.Body, v.String()}, nil } } diff --git a/main.go b/main.go index 0d5a9ab..80a1b39 100644 --- a/main.go +++ b/main.go @@ -36,14 +36,16 @@ var ( } ) -type Source struct { +// source provides a readable markdown source +type source struct { reader io.ReadCloser URL string } -func readerFromArg(s string) (*Source, error) { +func readerFromArg(s string) (*source, error) { + // from stdin if s == "-" { - return &Source{reader: os.Stdin}, nil + return &source{reader: os.Stdin}, nil } // a GitHub or GitLab URL (even without the protocol): @@ -76,7 +78,7 @@ func readerFromArg(s string) (*Source, error) { if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("HTTP status %d", resp.StatusCode) } - return &Source{resp.Body, u.String()}, nil + return &source{resp.Body, u.String()}, nil } } @@ -87,7 +89,7 @@ func readerFromArg(s string) (*Source, error) { } st, err := os.Stat(s) if err == nil && st.IsDir() { - var src *Source + var src *source _ = filepath.Walk(s, func(path string, info os.FileInfo, err error) error { for _, v := range readmeNames { if strings.EqualFold(filepath.Base(path), v) { @@ -97,12 +99,15 @@ func readerFromArg(s string) (*Source, error) { } u, _ := filepath.Abs(path) - src = &Source{r, u} + src = &source{r, u} + + // abort filepath.Walk return errors.New("source found") } } return nil }) + if src != nil { return src, nil } @@ -113,7 +118,7 @@ func readerFromArg(s string) (*Source, error) { // a file: r, err := os.Open(s) u, _ := filepath.Abs(s) - return &Source{r, u}, err + return &source{r, u}, err } func execute(cmd *cobra.Command, args []string) error { @@ -156,6 +161,7 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { baseURL = u.String() + "/" } + // initialize glamour var gs glamour.TermRendererOption if style == "auto" { gs = glamour.WithAutoStyle() From c5d7aa0155bed83dae75df894e2ae99295a5c524 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 31 Mar 2020 08:57:49 +0200 Subject: [PATCH 187/911] Rename readerFromArg to sourceFromArg --- main.go | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/main.go b/main.go index 80a1b39..4a6bf7e 100644 --- a/main.go +++ b/main.go @@ -36,27 +36,28 @@ var ( } ) -// source provides a readable markdown source +// source provides a readable markdown source. type source struct { reader io.ReadCloser URL string } -func readerFromArg(s string) (*source, error) { +// sourceFromArg parses an argument and creates a readable source for it. +func sourceFromArg(arg string) (*source, error) { // from stdin - if s == "-" { + if arg == "-" { return &source{reader: os.Stdin}, nil } // a GitHub or GitLab URL (even without the protocol): - if u, ok := isGitHubURL(s); ok { + if u, ok := isGitHubURL(arg); ok { src, err := findGitHubREADME(u) if err != nil { return nil, err } return src, nil } - if u, ok := isGitLabURL(s); ok { + if u, ok := isGitLabURL(arg); ok { src, err := findGitLabREADME(u) if err != nil { return nil, err @@ -65,7 +66,7 @@ func readerFromArg(s string) (*source, error) { } // HTTP(S) URLs: - if u, err := url.ParseRequestURI(s); err == nil { + if u, err := url.ParseRequestURI(arg); err == nil { if u.Scheme != "" { if u.Scheme != "http" && u.Scheme != "https" { return nil, fmt.Errorf("%s is not a supported protocol", u.Scheme) @@ -83,14 +84,14 @@ func readerFromArg(s string) (*source, error) { } // a directory: - if len(s) == 0 { + if len(arg) == 0 { // use the current working dir if no argument was supplied - s = "." + arg = "." } - st, err := os.Stat(s) + st, err := os.Stat(arg) if err == nil && st.IsDir() { var src *source - _ = filepath.Walk(s, func(path string, info os.FileInfo, err error) error { + _ = filepath.Walk(arg, func(path string, info os.FileInfo, err error) error { for _, v := range readmeNames { if strings.EqualFold(filepath.Base(path), v) { r, err := os.Open(path) @@ -116,8 +117,8 @@ func readerFromArg(s string) (*source, error) { } // a file: - r, err := os.Open(s) - u, _ := filepath.Abs(s) + r, err := os.Open(arg) + u, _ := filepath.Abs(arg) return &source{r, u}, err } @@ -136,7 +137,7 @@ func execute(cmd *cobra.Command, args []string) error { func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { // create an io.Reader from the markdown source in cli-args - src, err := readerFromArg(arg) + src, err := sourceFromArg(arg) if err != nil { return err } From 18fcf68c0fb48efd9e84b4504bb953accc12f708 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 5 May 2020 07:28:33 +0200 Subject: [PATCH 188/911] Change default rendering width to 80 --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 4a6bf7e..101b86c 100644 --- a/main.go +++ b/main.go @@ -232,5 +232,5 @@ func init() { rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") rootCmd.Flags().StringVarP(&style, "style", "s", "auto", "style name or JSON path") - rootCmd.Flags().UintVarP(&width, "width", "w", 100, "word-wrap at width") + rootCmd.Flags().UintVarP(&width, "width", "w", 80, "word-wrap at width") } From c9af84b75a401f35b01c029c1b12592e0c6bb19e Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 5 May 2020 07:43:11 +0200 Subject: [PATCH 189/911] Automatically detect terminal width, with a 120 char limit --- go.mod | 2 +- main.go | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index b21e4ae..d0c3716 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.13 require ( github.com/charmbracelet/glamour v0.1.1-0.20200331045007-ba2d2a0ec5d8 github.com/dlclark/regexp2 v1.2.0 // indirect - github.com/mattn/go-isatty v0.0.12 github.com/spf13/cobra v0.0.5 + golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect golang.org/x/sys v0.0.0-20200116001909-b77594299b42 ) diff --git a/main.go b/main.go index 101b86c..af39239 100644 --- a/main.go +++ b/main.go @@ -12,8 +12,8 @@ import ( "path/filepath" "strings" - "github.com/mattn/go-isatty" "github.com/spf13/cobra" + "golang.org/x/crypto/ssh/terminal" "github.com/charmbracelet/glamour" ) @@ -147,12 +147,25 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { return err } + isTerminal := terminal.IsTerminal(int(os.Stdout.Fd())) // We want to use a special no-TTY style, when stdout is not a terminal // and there was no specific style passed by arg - if !isatty.IsTerminal(os.Stdout.Fd()) && - !cmd.Flags().Changed("style") { + if !isTerminal && !cmd.Flags().Changed("style") { style = "notty" } + // Detect terminal width + if isTerminal && !cmd.Flags().Changed("width") { + w, _, err := terminal.GetSize(int(os.Stdout.Fd())) + if err == nil { + width = uint(w) + } + } + if width == 0 { + width = 80 + } + if width > 120 { + width = 120 + } // render var baseURL string @@ -232,5 +245,5 @@ func init() { rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") rootCmd.Flags().StringVarP(&style, "style", "s", "auto", "style name or JSON path") - rootCmd.Flags().UintVarP(&width, "width", "w", 80, "word-wrap at width") + rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") } From d433820a1b4c658dca5314de3470d6f267027755 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 5 May 2020 07:48:05 +0200 Subject: [PATCH 190/911] Validate options once --- main.go | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/main.go b/main.go index af39239..a0b1fd4 100644 --- a/main.go +++ b/main.go @@ -122,7 +122,32 @@ func sourceFromArg(arg string) (*source, error) { return &source{r, u}, err } +func validateOptions(cmd *cobra.Command) { + isTerminal := terminal.IsTerminal(int(os.Stdout.Fd())) + // We want to use a special no-TTY style, when stdout is not a terminal + // and there was no specific style passed by arg + if !isTerminal && !cmd.Flags().Changed("style") { + style = "notty" + } + + // Detect terminal width + if isTerminal && !cmd.Flags().Changed("width") { + w, _, err := terminal.GetSize(int(os.Stdout.Fd())) + if err == nil { + width = uint(w) + } + } + if width == 0 { + width = 80 + } + if width > 120 { + width = 120 + } +} + func execute(cmd *cobra.Command, args []string) error { + validateOptions(cmd) + if len(args) == 0 { return executeArg(cmd, "", os.Stdout) } @@ -147,26 +172,6 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { return err } - isTerminal := terminal.IsTerminal(int(os.Stdout.Fd())) - // We want to use a special no-TTY style, when stdout is not a terminal - // and there was no specific style passed by arg - if !isTerminal && !cmd.Flags().Changed("style") { - style = "notty" - } - // Detect terminal width - if isTerminal && !cmd.Flags().Changed("width") { - w, _, err := terminal.GetSize(int(os.Stdout.Fd())) - if err == nil { - width = uint(w) - } - } - if width == 0 { - width = 80 - } - if width > 120 { - width = 120 - } - // render var baseURL string u, err := url.ParseRequestURI(src.URL) From a3552fd2ab6380a2d4082679fdb3431f45f0ced1 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 5 May 2020 07:51:26 +0200 Subject: [PATCH 191/911] Fix goreportcard link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b9863ba..3c928fd 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Render markdown on the CLI, with _pizzazz_! Latest Release GoDoc Build Status - Go ReportCard + Go ReportCard

![Glow example output](https://github.com/charmbracelet/glow/raw/master/example.png) From 6025e736ea3ef5fa0802d637a1fd2b558b6fec7b Mon Sep 17 00:00:00 2001 From: Jesse Millar Date: Thu, 23 Jul 2020 11:03:03 -0500 Subject: [PATCH 192/911] Enable use of the `GLAMOUR_STYLE` environment variable (#152) --- go.mod | 5 ++--- go.sum | 32 +++++++++++++++++--------------- main.go | 2 +- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index d0c3716..2d71cd9 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,9 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.1.1-0.20200331045007-ba2d2a0ec5d8 - github.com/dlclark/regexp2 v1.2.0 // indirect + github.com/charmbracelet/glamour v0.2.0 github.com/spf13/cobra v0.0.5 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect - golang.org/x/sys v0.0.0-20200116001909-b77594299b42 + golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 ) diff --git a/go.sum b/go.sum index d07a12a..664488d 100644 --- a/go.sum +++ b/go.sum @@ -1,16 +1,16 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= -github.com/alecthomas/chroma v0.7.2-0.20200304075647-34d9c7143bf5 h1:yt5ij+XTe1QL+TpFj7i547enM5YuGKp9nZ/WvOoqcsQ= -github.com/alecthomas/chroma v0.7.2-0.20200304075647-34d9c7143bf5/go.mod h1:fv5SzZPFJbwp2NXJWpFIX7DZS4HgV1K4ew4Pc2OZD9s= +github.com/alecthomas/chroma v0.7.3 h1:NfdAERMy+esYQs8OXk0I868/qDxxCEo7FMz1WIqMAeI= +github.com/alecthomas/chroma v0.7.3/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= -github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= +github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.1.1-0.20200331045007-ba2d2a0ec5d8 h1:SY1gbDnzOUuob4JohyN+LF+kzcZ3T3/R2AOs+GpWXk0= -github.com/charmbracelet/glamour v0.1.1-0.20200331045007-ba2d2a0ec5d8/go.mod h1:lH8rLVnKLgwyuP0PAHUCsxZdA7ZSKyqsmX0X5fXAOLs= +github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= +github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -20,8 +20,6 @@ github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dlclark/regexp2 v1.1.6 h1:CqB4MjHw0MFCDj+PHHjiESmHX+N7t0tJzKvC6M97BRg= -github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -33,25 +31,26 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= -github.com/muesli/termenv v0.5.0 h1:7uYkBUJ2EE+CdWlBoYzO70I/cq/r3bOm4a40/lvmiAU= -github.com/muesli/termenv v0.5.0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= +github.com/muesli/termenv v0.6.0 h1:zxvzTBmo4ZcxhNGGWeMz+Tttm51eF5bmPjfy4MCRYlk= +github.com/muesli/termenv v0.6.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -71,20 +70,23 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.26 h1:81MfIApzizD8JqKIjnWy2Vxj7GgmQUrJlh/jYWH8yGk= -github.com/yuin/goldmark v1.1.26/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.0 h1:WOOcyaJPlzb8fZ8TloxFe8QZkhOOJx87leDa9MIT9dc= +github.com/yuin/goldmark v1.2.0/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20181220203305-927f97764cc3 h1:eH6Eip3UpmR+yM/qI9Ijluzb1bNv/cAU/n+6l8tRSis= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 h1:opSr2sbRXk5X5/givKrrKj9HXxFpW2sdCiP8MJSKLQY= +golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/main.go b/main.go index a0b1fd4..e93de34 100644 --- a/main.go +++ b/main.go @@ -183,7 +183,7 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { // initialize glamour var gs glamour.TermRendererOption if style == "auto" { - gs = glamour.WithAutoStyle() + gs = glamour.WithEnvironmentConfig() } else { gs = glamour.WithStylePath(style) } From 294e4e292dc7dc1b565dc7f4d132219a791cbc8c Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 11 Sep 2020 06:24:30 +0200 Subject: [PATCH 193/911] Bump glamour dependency --- go.mod | 2 +- go.sum | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 2d71cd9..e9c561a 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/glamour v0.2.0 + github.com/charmbracelet/glamour v0.2.1-0.20200829234707-48fcb4b0c962 github.com/spf13/cobra v0.0.5 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect diff --git a/go.sum b/go.sum index 664488d..fa14b7d 100644 --- a/go.sum +++ b/go.sum @@ -9,8 +9,8 @@ github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= -github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= +github.com/charmbracelet/glamour v0.2.1-0.20200829234707-48fcb4b0c962 h1:iBIjndrkYi8Rko9pNSILbsEyWrgtWpSsDug2nEm3DlQ= +github.com/charmbracelet/glamour v0.2.1-0.20200829234707-48fcb4b0c962/go.mod h1:CGH6KT1ovzvGpaQFxkm9ulKx6BlfV4dThCDaOMi54qI= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -44,8 +44,8 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= -github.com/muesli/termenv v0.6.0 h1:zxvzTBmo4ZcxhNGGWeMz+Tttm51eF5bmPjfy4MCRYlk= -github.com/muesli/termenv v0.6.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= +github.com/muesli/termenv v0.7.2 h1:r1raklL3uKE7rOvWgSenmEm2px+dnc33OTisZ8YR1fw= +github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -70,8 +70,8 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.2.0 h1:WOOcyaJPlzb8fZ8TloxFe8QZkhOOJx87leDa9MIT9dc= -github.com/yuin/goldmark v1.2.0/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= From a106bc0163b5ac13c091462bf864eab22bd8531c Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Thu, 23 Apr 2020 17:05:38 -0500 Subject: [PATCH 194/911] Working stash command --- go.mod | 13 +++-- go.sum | 150 ++++++++++++++++++++++++++++++++++++++++++++++++------- main.go | 6 +++ stash.go | 68 +++++++++++++++++++++++++ 4 files changed, 217 insertions(+), 20 deletions(-) create mode 100644 stash.go diff --git a/go.mod b/go.mod index e9c561a..da6d762 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,16 @@ module github.com/charmbracelet/glow go 1.13 require ( + github.com/charmbracelet/charm v0.0.0-00010101000000-000000000000 github.com/charmbracelet/glamour v0.2.1-0.20200829234707-48fcb4b0c962 - github.com/spf13/cobra v0.0.5 - golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 + github.com/coreos/go-etcd v2.0.0+incompatible // indirect + github.com/cpuguy83/go-md2man v1.0.10 // indirect + github.com/dlclark/regexp2 v1.2.0 // indirect + github.com/spf13/cobra v1.0.0 + github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 // indirect + golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect - golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 + golang.org/x/sys v0.0.0-20200821140526-fda516888d29 ) + +replace github.com/charmbracelet/charm => ../charm diff --git a/go.sum b/go.sum index fa14b7d..ecd7171 100644 --- a/go.sum +++ b/go.sum @@ -1,92 +1,208 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= github.com/alecthomas/chroma v0.7.3 h1:NfdAERMy+esYQs8OXk0I868/qDxxCEo7FMz1WIqMAeI= github.com/alecthomas/chroma v0.7.3/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= -github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= -github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= +github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/charmbracelet/bubbles v0.5.1/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= +github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= +github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= github.com/charmbracelet/glamour v0.2.1-0.20200829234707-48fcb4b0c962 h1:iBIjndrkYi8Rko9pNSILbsEyWrgtWpSsDug2nEm3DlQ= github.com/charmbracelet/glamour v0.2.1-0.20200829234707-48fcb4b0c962/go.mod h1:CGH6KT1ovzvGpaQFxkm9ulKx6BlfV4dThCDaOMi54qI= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f h1:5CjVwnuUcp5adK4gmY6i72gpVFVnZDP2h5TmPScB6u4= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/meowgorithm/babyenv v1.2.1 h1:DyASQz69kr5Zq6Z/euCb6/+zdwoze/xrt4w9PteaUOM= +github.com/meowgorithm/babyenv v1.2.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= +github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= +github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= +github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= +github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= +github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/muesli/termenv v0.7.2 h1:r1raklL3uKE7rOvWgSenmEm2px+dnc33OTisZ8YR1fw= github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03/go.mod h1:Z9+Ul5bCbBKnbCvdOWbLqTHhJiYV414CURZJba6L8qA= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3 h1:eH6Eip3UpmR+yM/qI9Ijluzb1bNv/cAU/n+6l8tRSis= +golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 h1:opSr2sbRXk5X5/givKrrKj9HXxFpW2sdCiP8MJSKLQY= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200821140526-fda516888d29 h1:mNuhGagCf3lDDm5C0376C/sxh6V7fy9WbdEu/YDNA04= +golang.org/x/sys v0.0.0-20200821140526-fda516888d29/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/main.go b/main.go index e93de34..a4782d5 100644 --- a/main.go +++ b/main.go @@ -251,4 +251,10 @@ func init() { rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") rootCmd.Flags().StringVarP(&style, "style", "s", "auto", "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") + + stashCmd.PersistentFlags().StringVarP(&identityFile, "identity", "i", "", "path to identity file (that is, an ssh private key)") + stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") + stashCmd.Flags().BoolVarP(&forceKey, "force-key", "f", false, "for the use of the SSH key on disk (that is, ignore ssh-agent)") + + rootCmd.AddCommand(stashCmd) } diff --git a/stash.go b/stash.go new file mode 100644 index 0000000..905623e --- /dev/null +++ b/stash.go @@ -0,0 +1,68 @@ +package main + +import ( + "fmt" + "io/ioutil" + "log" + "os" + + "github.com/charmbracelet/charm" + "github.com/spf13/cobra" +) + +var ( + identityFile string + forceKey bool + memo string + stashCmd = &cobra.Command{ + Use: "stash SOURCE", + Hidden: false, + Short: "stash a markdown", + Long: "", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + cc := initCharmClient() + f, err := os.Open(args[0]) + if err != nil { + return fmt.Errorf("bad filename") + } + defer f.Close() + b, err := ioutil.ReadAll(f) + if err != nil { + return fmt.Errorf("error reading file") + } + err = cc.StashMarkdown(memo, string(b)) + if err != nil { + return fmt.Errorf("error stashing markdown") + } + return nil + }, + } +) + +func getCharmConfig() *charm.Config { + cfg, err := charm.ConfigFromEnv() + if err != nil { + log.Fatal(err) + } + if identityFile != "" { + cfg.SSHKeyPath = identityFile + cfg.ForceKey = true + } + if forceKey { + cfg.ForceKey = true + } + return cfg +} + +func initCharmClient() *charm.Client { + cfg := getCharmConfig() + cc, err := charm.NewClient(cfg) + if err == charm.ErrMissingSSHAuth { + log.Fatal("Missing ssh key. Run `ssh-keygen` to make one or set the `CHARM_SSH_KEY_PATH` env var to your private key path.") + } else if err != nil { + fmt.Println(err) + os.Exit(1) + } + return cc +} From 03b7b9200c26e98dff9e4dd233932b5fd2867346 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Thu, 23 Apr 2020 17:36:58 -0500 Subject: [PATCH 195/911] Print successful stash --- stash.go | 1 + 1 file changed, 1 insertion(+) diff --git a/stash.go b/stash.go index 905623e..92aea4d 100644 --- a/stash.go +++ b/stash.go @@ -35,6 +35,7 @@ var ( if err != nil { return fmt.Errorf("error stashing markdown") } + fmt.Println("Stashed!") return nil }, } From 395ae998dd25ee612f13059b847460a2b3c03445 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Thu, 23 Apr 2020 17:47:04 -0500 Subject: [PATCH 196/911] List stash --- main.go | 5 +++-- stash.go | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index a4782d5..03dc81d 100644 --- a/main.go +++ b/main.go @@ -252,9 +252,10 @@ func init() { rootCmd.Flags().StringVarP(&style, "style", "s", "auto", "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") - stashCmd.PersistentFlags().StringVarP(&identityFile, "identity", "i", "", "path to identity file (that is, an ssh private key)") + rootCmd.PersistentFlags().StringVarP(&identityFile, "identity", "i", "", "path to identity file (that is, an ssh private key)") + rootCmd.Flags().BoolVarP(&forceKey, "force-key", "f", false, "for the use of the SSH key on disk (that is, ignore ssh-agent)") stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") - stashCmd.Flags().BoolVarP(&forceKey, "force-key", "f", false, "for the use of the SSH key on disk (that is, ignore ssh-agent)") rootCmd.AddCommand(stashCmd) + rootCmd.AddCommand(stashListCmd) } diff --git a/stash.go b/stash.go index 92aea4d..0250415 100644 --- a/stash.go +++ b/stash.go @@ -39,6 +39,27 @@ var ( return nil }, } + + stashListCmd = &cobra.Command{ + Use: "stash-list", + Hidden: false, + Short: "list your stashed markdowns", + Long: "", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + cc := initCharmClient() + mds, err := cc.GetStash() + if err != nil { + return fmt.Errorf("error getting stash") + } + fmt.Println("ID\tNote") + fmt.Println("--\t----") + for _, md := range mds { + fmt.Printf("%d\t%s\n", md.ID, md.Note) + } + return nil + }, + } ) func getCharmConfig() *charm.Config { From bd52d1cee4a34b74cfff2f22ae1e61a217d6b123 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Thu, 23 Apr 2020 17:55:51 -0500 Subject: [PATCH 197/911] Get markdown command --- main.go | 1 + stash.go | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/main.go b/main.go index 03dc81d..7383980 100644 --- a/main.go +++ b/main.go @@ -258,4 +258,5 @@ func init() { rootCmd.AddCommand(stashCmd) rootCmd.AddCommand(stashListCmd) + rootCmd.AddCommand(stashGetCmd) } diff --git a/stash.go b/stash.go index 0250415..424dc0b 100644 --- a/stash.go +++ b/stash.go @@ -5,6 +5,7 @@ import ( "io/ioutil" "log" "os" + "strconv" "github.com/charmbracelet/charm" "github.com/spf13/cobra" @@ -60,6 +61,27 @@ var ( return nil }, } + + stashGetCmd = &cobra.Command{ + Use: "stash-get", + Hidden: false, + Short: "get a stashed markdown by id", + Long: "", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + id, err := strconv.Atoi(args[0]) + if err != nil { + return fmt.Errorf("invalid markdown id") + } + cc := initCharmClient() + md, err := cc.GetMarkdown(id) + if err != nil { + return fmt.Errorf("error getting markdown") + } + fmt.Println(md.Body) + return nil + }, + } ) func getCharmConfig() *charm.Config { From 4792345f317052845ee58f74108f82baddb8658b Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Thu, 23 Apr 2020 18:02:59 -0500 Subject: [PATCH 198/911] Delete from stash command --- main.go | 4 +--- stash.go | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 7383980..d7fda91 100644 --- a/main.go +++ b/main.go @@ -256,7 +256,5 @@ func init() { rootCmd.Flags().BoolVarP(&forceKey, "force-key", "f", false, "for the use of the SSH key on disk (that is, ignore ssh-agent)") stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") - rootCmd.AddCommand(stashCmd) - rootCmd.AddCommand(stashListCmd) - rootCmd.AddCommand(stashGetCmd) + rootCmd.AddCommand(stashCmd, stashListCmd, stashGetCmd, stashDeleteCmd) } diff --git a/stash.go b/stash.go index 424dc0b..892cad5 100644 --- a/stash.go +++ b/stash.go @@ -82,6 +82,27 @@ var ( return nil }, } + + stashDeleteCmd = &cobra.Command{ + Use: "stash-delete", + Hidden: false, + Short: "get a stashed markdown by id", + Long: "", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + id, err := strconv.Atoi(args[0]) + if err != nil { + return fmt.Errorf("invalid markdown id") + } + cc := initCharmClient() + err = cc.DeleteMarkdown(id) + if err != nil { + return fmt.Errorf("error deleting markdown") + } + fmt.Println("Deleted!") + return nil + }, + } ) func getCharmConfig() *charm.Config { From bbd6b1acc74a5780a9d64e28d8f66b3660cf8bbe Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Thu, 23 Apr 2020 18:21:28 -0500 Subject: [PATCH 199/911] Update charm lib --- go.mod | 2 - go.sum | 208 --------------------------------------------------------- 2 files changed, 210 deletions(-) delete mode 100644 go.sum diff --git a/go.mod b/go.mod index da6d762..bf75751 100644 --- a/go.mod +++ b/go.mod @@ -14,5 +14,3 @@ require ( golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect golang.org/x/sys v0.0.0-20200821140526-fda516888d29 ) - -replace github.com/charmbracelet/charm => ../charm diff --git a/go.sum b/go.sum deleted file mode 100644 index ecd7171..0000000 --- a/go.sum +++ /dev/null @@ -1,208 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= -github.com/alecthomas/chroma v0.7.3 h1:NfdAERMy+esYQs8OXk0I868/qDxxCEo7FMz1WIqMAeI= -github.com/alecthomas/chroma v0.7.3/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= -github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= -github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= -github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= -github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/bubbles v0.5.1/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= -github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= -github.com/charmbracelet/glamour v0.2.1-0.20200829234707-48fcb4b0c962 h1:iBIjndrkYi8Rko9pNSILbsEyWrgtWpSsDug2nEm3DlQ= -github.com/charmbracelet/glamour v0.2.1-0.20200829234707-48fcb4b0c962/go.mod h1:CGH6KT1ovzvGpaQFxkm9ulKx6BlfV4dThCDaOMi54qI= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= -github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= -github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= -github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/meowgorithm/babyenv v1.2.1 h1:DyASQz69kr5Zq6Z/euCb6/+zdwoze/xrt4w9PteaUOM= -github.com/meowgorithm/babyenv v1.2.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= -github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= -github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= -github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= -github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= -github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= -github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= -github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= -github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= -github.com/muesli/termenv v0.7.2 h1:r1raklL3uKE7rOvWgSenmEm2px+dnc33OTisZ8YR1fw= -github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03/go.mod h1:Z9+Ul5bCbBKnbCvdOWbLqTHhJiYV414CURZJba6L8qA= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200821140526-fda516888d29 h1:mNuhGagCf3lDDm5C0376C/sxh6V7fy9WbdEu/YDNA04= -golang.org/x/sys v0.0.0-20200821140526-fda516888d29/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 29b825b5d83a4879eca22a364792c610064105de Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 27 Apr 2020 11:48:11 -0400 Subject: [PATCH 200/911] Remove authors in README --- README.md | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 3c928fd..fb8263c 100644 --- a/README.md +++ b/README.md @@ -107,15 +107,8 @@ For additional usage details see: glow --help ``` - -## Authors - -* [Christian Muehlhaeuser](https://github.com/muesli) -* [Toby Padilla](https://github.com/toby) -* [Christian Rocha](https://github.com/meowgorithm) - -Part of [Charm](https://charm.sh). For more info see `ssh charm.sh`. Charm热爱开源! - ## License [MIT](https://github.com/charmbracelet/glow/raw/master/LICENSE) + +Part of [Charm](https://charm.sh). For more info see `ssh charm.sh`. Charm热爱开源! From 787b988663e558d62a05157d033b93b2819b3f0d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 27 Apr 2020 11:50:31 -0400 Subject: [PATCH 201/911] Add Charm logo, remove SSH stuff --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fb8263c..95e1694 100644 --- a/README.md +++ b/README.md @@ -111,4 +111,10 @@ glow --help [MIT](https://github.com/charmbracelet/glow/raw/master/LICENSE) -Part of [Charm](https://charm.sh). For more info see `ssh charm.sh`. Charm热爱开源! +*** + +Part of [Charm](https://charm.sh). + +the Charm logo + +Charm热爱开源! From 20f716830666990867b55f685ea6359e0c853152 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Tue, 12 May 2020 17:18:48 -0500 Subject: [PATCH 202/911] Add pagination call --- go.mod | 8 +-- go.sum | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ stash.go | 4 +- 3 files changed, 212 insertions(+), 7 deletions(-) create mode 100644 go.sum diff --git a/go.mod b/go.mod index bf75751..405d995 100644 --- a/go.mod +++ b/go.mod @@ -3,14 +3,12 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/charm v0.0.0-00010101000000-000000000000 - github.com/charmbracelet/glamour v0.2.1-0.20200829234707-48fcb4b0c962 - github.com/coreos/go-etcd v2.0.0+incompatible // indirect - github.com/cpuguy83/go-md2man v1.0.10 // indirect + github.com/charmbracelet/charm v0.2.3 + github.com/charmbracelet/glamour v0.2.0 github.com/dlclark/regexp2 v1.2.0 // indirect github.com/spf13/cobra v1.0.0 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 // indirect golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect - golang.org/x/sys v0.0.0-20200821140526-fda516888d29 + golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 ) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..bec0ae5 --- /dev/null +++ b/go.sum @@ -0,0 +1,207 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= +github.com/alecthomas/chroma v0.7.2-0.20200304075647-34d9c7143bf5 h1:yt5ij+XTe1QL+TpFj7i547enM5YuGKp9nZ/WvOoqcsQ= +github.com/alecthomas/chroma v0.7.2-0.20200304075647-34d9c7143bf5/go.mod h1:fv5SzZPFJbwp2NXJWpFIX7DZS4HgV1K4ew4Pc2OZD9s= +github.com/alecthomas/chroma v0.7.3 h1:NfdAERMy+esYQs8OXk0I868/qDxxCEo7FMz1WIqMAeI= +github.com/alecthomas/chroma v0.7.3/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= +github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= +github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= +github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= +github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= +github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/charmbracelet/charm v0.2.3 h1:PknJo1r28itf5Q0p2vuJUewvHyVZl42G0x8zPOK2aHY= +github.com/charmbracelet/charm v0.2.3/go.mod h1:Ll7xHXpIWcIflSyzP01QzwxCF+kqVVCSnVDN0MMOfSs= +github.com/charmbracelet/glamour v0.1.1-0.20200331045007-ba2d2a0ec5d8 h1:SY1gbDnzOUuob4JohyN+LF+kzcZ3T3/R2AOs+GpWXk0= +github.com/charmbracelet/glamour v0.1.1-0.20200331045007-ba2d2a0ec5d8/go.mod h1:lH8rLVnKLgwyuP0PAHUCsxZdA7ZSKyqsmX0X5fXAOLs= +github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= +github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= +github.com/charmbracelet/tea v0.2.0/go.mod h1:lADjwO2mMub9qvXSCA9vAkabVWO0HeUrv4uO/lG3C+k= +github.com/charmbracelet/tea v0.2.1/go.mod h1:uA/DUzCuyIZ1NFyAdCz6k+gF8lspujo6ZvoavcSsLCM= +github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d/go.mod h1:PsGcwPVbwjZv3XGW7qGoJ+EkhKqk2owMVUuX3IBUsTw= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= +github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= +github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f h1:5CjVwnuUcp5adK4gmY6i72gpVFVnZDP2h5TmPScB6u4= +github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= +github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/meowgorithm/babyenv v1.2.1 h1:DyASQz69kr5Zq6Z/euCb6/+zdwoze/xrt4w9PteaUOM= +github.com/meowgorithm/babyenv v1.2.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= +github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= +github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= +github.com/muesli/termenv v0.5.0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= +github.com/muesli/termenv v0.5.2 h1:N1Y1dHRtx6OizOgaIQXd8SkJl4T/cCOV+YyWXiuLUEA= +github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= +github.com/muesli/termenv v0.6.0 h1:zxvzTBmo4ZcxhNGGWeMz+Tttm51eF5bmPjfy4MCRYlk= +github.com/muesli/termenv v0.6.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.26 h1:81MfIApzizD8JqKIjnWy2Vxj7GgmQUrJlh/jYWH8yGk= +github.com/yuin/goldmark v1.1.26/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.0 h1:WOOcyaJPlzb8fZ8TloxFe8QZkhOOJx87leDa9MIT9dc= +github.com/yuin/goldmark v1.2.0/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200430202703-d923437fa56d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 h1:5B6i6EAiSYyejWfvc5Rc9BbI3rzIsrrXfAQBWnYfn+w= +golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/stash.go b/stash.go index 892cad5..91457cf 100644 --- a/stash.go +++ b/stash.go @@ -49,7 +49,7 @@ var ( Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { cc := initCharmClient() - mds, err := cc.GetStash() + mds, err := cc.GetStash(1) if err != nil { return fmt.Errorf("error getting stash") } @@ -74,7 +74,7 @@ var ( return fmt.Errorf("invalid markdown id") } cc := initCharmClient() - md, err := cc.GetMarkdown(id) + md, err := cc.GetStashMarkdown(id) if err != nil { return fmt.Errorf("error getting markdown") } From cd9ee93dcad9cd27035e11359a57658d08207274 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 18 May 2020 11:59:37 -0400 Subject: [PATCH 203/911] Configure git for private modules --- .github/workflows/go.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 0f6b72d..f25d0ed 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -10,6 +10,11 @@ jobs: env: GO111MODULE: "on" steps: + + - name: Configure git for private modules + env: + TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} + run: git config --global url."https://meowgorithm:${TOKEN}@github.com".insteadOf "https://github.com" - name: Install Go uses: actions/setup-go@v1 From b58ee104877a81fee49f38be3637bdee401eddfe Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 11 May 2020 16:13:16 -0400 Subject: [PATCH 204/911] Stub out Tea UI: create Charm client and generate keys if necessary --- go.mod | 8 ++- go.sum | 25 +++---- main.go | 7 +- ui/ui.go | 195 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 214 insertions(+), 21 deletions(-) create mode 100644 ui/ui.go diff --git a/go.mod b/go.mod index 405d995..9fdfb9c 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,14 @@ module github.com/charmbracelet/glow go 1.13 require ( + github.com/charmbracelet/boba v0.5.0 github.com/charmbracelet/charm v0.2.3 github.com/charmbracelet/glamour v0.2.0 + github.com/charmbracelet/tea v0.3.0 + github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d github.com/dlclark/regexp2 v1.2.0 // indirect - github.com/spf13/cobra v1.0.0 - github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 // indirect - golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de + github.com/spf13/cobra v0.0.7 + golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 ) diff --git a/go.sum b/go.sum index bec0ae5..0de20b4 100644 --- a/go.sum +++ b/go.sum @@ -2,12 +2,9 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= -github.com/alecthomas/chroma v0.7.2-0.20200304075647-34d9c7143bf5 h1:yt5ij+XTe1QL+TpFj7i547enM5YuGKp9nZ/WvOoqcsQ= -github.com/alecthomas/chroma v0.7.2-0.20200304075647-34d9c7143bf5/go.mod h1:fv5SzZPFJbwp2NXJWpFIX7DZS4HgV1K4ew4Pc2OZD9s= github.com/alecthomas/chroma v0.7.3 h1:NfdAERMy+esYQs8OXk0I868/qDxxCEo7FMz1WIqMAeI= github.com/alecthomas/chroma v0.7.3/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= -github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -18,14 +15,16 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/charmbracelet/boba v0.5.0/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= github.com/charmbracelet/charm v0.2.3 h1:PknJo1r28itf5Q0p2vuJUewvHyVZl42G0x8zPOK2aHY= github.com/charmbracelet/charm v0.2.3/go.mod h1:Ll7xHXpIWcIflSyzP01QzwxCF+kqVVCSnVDN0MMOfSs= -github.com/charmbracelet/glamour v0.1.1-0.20200331045007-ba2d2a0ec5d8 h1:SY1gbDnzOUuob4JohyN+LF+kzcZ3T3/R2AOs+GpWXk0= -github.com/charmbracelet/glamour v0.1.1-0.20200331045007-ba2d2a0ec5d8/go.mod h1:lH8rLVnKLgwyuP0PAHUCsxZdA7ZSKyqsmX0X5fXAOLs= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= github.com/charmbracelet/tea v0.2.0/go.mod h1:lADjwO2mMub9qvXSCA9vAkabVWO0HeUrv4uO/lG3C+k= github.com/charmbracelet/tea v0.2.1/go.mod h1:uA/DUzCuyIZ1NFyAdCz6k+gF8lspujo6ZvoavcSsLCM= +github.com/charmbracelet/tea v0.3.0 h1:W5F1x/IYeSCKpZl3/hM3Mn5v2KAagckabDFhhzh5sIE= +github.com/charmbracelet/tea v0.3.0/go.mod h1:uA/DUzCuyIZ1NFyAdCz6k+gF8lspujo6ZvoavcSsLCM= +github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d h1:cKZmktu4U8kTcaKM1JjM0jILREm2ABBoh5YLdrfCykQ= github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d/go.mod h1:PsGcwPVbwjZv3XGW7qGoJ+EkhKqk2owMVUuX3IBUsTw= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -41,7 +40,6 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -79,9 +77,7 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -98,7 +94,6 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/termenv v0.5.0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= -github.com/muesli/termenv v0.5.2 h1:N1Y1dHRtx6OizOgaIQXd8SkJl4T/cCOV+YyWXiuLUEA= github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.6.0 h1:zxvzTBmo4ZcxhNGGWeMz+Tttm51eF5bmPjfy4MCRYlk= github.com/muesli/termenv v0.6.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= @@ -110,6 +105,7 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942 h1:A7GG7zcGjl3jqAqGPmcNjd/D9hzL95SuoOQAaFNdLU0= github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -130,9 +126,8 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.7 h1:FfTH+vuMXOas8jmfb5/M7dzEYx7LpcLb7a0LPe34uOU= github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -144,11 +139,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.26 h1:81MfIApzizD8JqKIjnWy2Vxj7GgmQUrJlh/jYWH8yGk= -github.com/yuin/goldmark v1.1.26/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.0 h1:WOOcyaJPlzb8fZ8TloxFe8QZkhOOJx87leDa9MIT9dc= github.com/yuin/goldmark v1.2.0/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -158,8 +150,8 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -178,7 +170,6 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/main.go b/main.go index d7fda91..da73581 100644 --- a/main.go +++ b/main.go @@ -16,6 +16,7 @@ import ( "golang.org/x/crypto/ssh/terminal" "github.com/charmbracelet/glamour" + "github.com/charmbracelet/glow/ui" ) var ( @@ -149,7 +150,11 @@ func execute(cmd *cobra.Command, args []string) error { validateOptions(cmd) if len(args) == 0 { - return executeArg(cmd, "", os.Stdout) + //return executeArg(cmd, "", os.Stdout) + if err := ui.NewProgram().Start(); err != nil { + fmt.Println(err) + os.Exit(1) + } } for _, arg := range args { diff --git a/ui/ui.go b/ui/ui.go new file mode 100644 index 0000000..64456f9 --- /dev/null +++ b/ui/ui.go @@ -0,0 +1,195 @@ +package ui + +import ( + "errors" + + "github.com/charmbracelet/charm" + "github.com/charmbracelet/charm/ui/common" + "github.com/charmbracelet/charm/ui/keygen" + "github.com/charmbracelet/tea" + "github.com/charmbracelet/teaparty/spinner" +) + +// NewProgram returns a new Tea program +func NewProgram() *tea.Program { + return tea.NewProgram(initialize, update, view, subscriptions) +} + +// MESSAGES + +type fatalErrMsg error +type errMsg error +type newCharmClientMsg *charm.Client +type sshAuthErrMsg struct{} + +// MODEL + +type state int + +const ( + stateInitCharmClient state = iota + stateKeygenRunning + stateKeygenFinished + stateReady +) + +type model struct { + cc *charm.Client + user *charm.User + spinner spinner.Model + keygen keygen.Model + state state + err error +} + +// INIT + +func initialize() (tea.Model, tea.Cmd) { + s := spinner.NewModel() + s.Type = spinner.Dot + s.ForegroundColor = common.SpinnerColor + + return model{ + spinner: s, + state: stateInitCharmClient, + }, newCharmClient +} + +// UPDATE + +func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { + m, ok := mdl.(model) + if !ok { + return model{err: errors.New("could not perform assertion on model in update")}, tea.Quit + } + + switch msg := msg.(type) { + + case tea.KeyMsg: + switch msg.String() { + case "ctrl+c": + return m, tea.Quit + default: + return m, nil + } + + case fatalErrMsg: + m.err = msg + return m, tea.Quit + + case errMsg: + m.err = msg + return m, nil + + case sshAuthErrMsg: + // If we haven't run the keygen yet, do that + if m.state != stateKeygenFinished { + m.state = stateKeygenRunning + m.keygen = keygen.NewModel() + return m, keygen.GenerateKeys + } + + // The keygen didn't work + m.err = errors.New("SSH authentication failed") + return m, tea.Quit + + case spinner.TickMsg: + m.spinner, _ = spinner.Update(msg, m.spinner) + return m, nil + + case keygen.DoneMsg: + m.state = stateKeygenFinished + return m, newCharmClient + + case newCharmClientMsg: + m.cc = msg + m.state = stateReady + return m, nil + + default: + switch m.state { + case stateKeygenRunning: + mdl, cmd := keygen.Update(msg, tea.Model(m.keygen)) + keygenModel, ok := mdl.(keygen.Model) + if !ok { + m.err = errors.New("could not perform assertion on keygen model in main update") + return m, tea.Quit + } + m.keygen = keygenModel + return m, cmd + } + return m, nil + } +} + +// VIEW + +func view(mdl tea.Model) string { + m, ok := mdl.(model) + if !ok { + return "could not perform assertion on model in view" + } + + if m.err != nil { + return m.err.Error() + } + + var s string + switch m.state { + case stateInitCharmClient: + s += spinner.View(m.spinner) + " Initializing..." + case stateKeygenRunning: + s += keygen.View(m.keygen) + case stateKeygenFinished: + s += spinner.View(m.spinner) + " Re-initializing..." + case stateReady: + s += "Ready." + } + return s +} + +// SUBSCRIPTIONS + +func subscriptions(mdl tea.Model) tea.Subs { + m, ok := mdl.(model) + if !ok { + return nil + } + + subs := make(tea.Subs) + + switch m.state { + case stateInitCharmClient: + fallthrough + case stateKeygenFinished: + sub, err := spinner.MakeSub(m.spinner) + if err == nil { + subs["glow-spin"] = sub + } + case stateKeygenRunning: + sub, err := keygen.Spin(m.keygen) + if err == nil { + subs["keygen-spin"] = sub + } + } + + return subs +} + +// COMMANDS + +func newCharmClient() tea.Msg { + cfg, err := charm.ConfigFromEnv() + if err != nil { + return fatalErrMsg(err) + } + + cc, err := charm.NewClient(cfg) + if err == charm.ErrMissingSSHAuth { + return sshAuthErrMsg{} + } else if err != nil { + return fatalErrMsg(err) + } + + return newCharmClientMsg(cc) +} From da4e98f74944f59bbc6097c71503bfc7e0ddf3b7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 13 May 2020 12:53:58 -0400 Subject: [PATCH 205/911] Stub out Stash UI + update for Boba v0.5.0 --- go.mod | 4 +-- go.sum | 12 +++---- ui/stash.go | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++ ui/ui.go | 86 ++++++++++++++++++----------------------------- 4 files changed, 137 insertions(+), 62 deletions(-) create mode 100644 ui/stash.go diff --git a/go.mod b/go.mod index 9fdfb9c..f28bdd3 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/boba v0.5.0 - github.com/charmbracelet/charm v0.2.3 + github.com/charmbracelet/charm v0.3.0 github.com/charmbracelet/glamour v0.2.0 github.com/charmbracelet/tea v0.3.0 github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d @@ -12,5 +12,5 @@ require ( github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect - golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 + golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c ) diff --git a/go.sum b/go.sum index 0de20b4..c2512ce 100644 --- a/go.sum +++ b/go.sum @@ -15,16 +15,14 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/charmbracelet/boba v0.5.0 h1:H+4m+yI1aHoE/o0ncrFQpgV2tY49MdzcLsOqethsuDs= github.com/charmbracelet/boba v0.5.0/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= -github.com/charmbracelet/charm v0.2.3 h1:PknJo1r28itf5Q0p2vuJUewvHyVZl42G0x8zPOK2aHY= -github.com/charmbracelet/charm v0.2.3/go.mod h1:Ll7xHXpIWcIflSyzP01QzwxCF+kqVVCSnVDN0MMOfSs= +github.com/charmbracelet/charm v0.3.0 h1:njtvry/gqxUlFyVJ0+VbClcyf6g7mK6RddwT21mJoSA= +github.com/charmbracelet/charm v0.3.0/go.mod h1:bZQON+c4uV9mgbZBvKzH7wA1zGII9Zfg26cL70NYdH0= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= github.com/charmbracelet/tea v0.2.0/go.mod h1:lADjwO2mMub9qvXSCA9vAkabVWO0HeUrv4uO/lG3C+k= -github.com/charmbracelet/tea v0.2.1/go.mod h1:uA/DUzCuyIZ1NFyAdCz6k+gF8lspujo6ZvoavcSsLCM= -github.com/charmbracelet/tea v0.3.0 h1:W5F1x/IYeSCKpZl3/hM3Mn5v2KAagckabDFhhzh5sIE= github.com/charmbracelet/tea v0.3.0/go.mod h1:uA/DUzCuyIZ1NFyAdCz6k+gF8lspujo6ZvoavcSsLCM= -github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d h1:cKZmktu4U8kTcaKM1JjM0jILREm2ABBoh5YLdrfCykQ= github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d/go.mod h1:PsGcwPVbwjZv3XGW7qGoJ+EkhKqk2owMVUuX3IBUsTw= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -149,7 +147,6 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -177,8 +174,9 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200430202703-d923437fa56d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 h1:5B6i6EAiSYyejWfvc5Rc9BbI3rzIsrrXfAQBWnYfn+w= golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c h1:kISX68E8gSkNYAFRFiDU8rl5RIn1sJYKYb/r2vMLDrU= +golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/ui/stash.go b/ui/stash.go new file mode 100644 index 0000000..389c087 --- /dev/null +++ b/ui/stash.go @@ -0,0 +1,97 @@ +package ui + +import ( + "github.com/charmbracelet/boba" + "github.com/charmbracelet/boba/spinner" + "github.com/charmbracelet/charm" + "github.com/charmbracelet/charm/ui/common" +) + +// MSG + +type stashErrMsg error + +type gotStashMsg []*charm.Markdown + +// MODEL + +type stashState int + +const ( + stashStateInit stashState = 1 << iota + stashStateStashLoaded +) + +type stashModel struct { + cc *charm.Client + err error + state stashState + documents []*charm.Markdown + page int + spinner spinner.Model +} + +// INIT + +func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { + s := spinner.NewModel() + s.Type = spinner.Dot + s.ForegroundColor = common.SpinnerColor + + m := stashModel{ + cc: cc, + spinner: s, + } + + return m, boba.Batch( + getStash(m), + spinner.Tick(s), + ) +} + +// UPDATE + +func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { + switch msg := msg.(type) { + + case stashErrMsg: + m.err = msg + + case gotStashMsg: + m.documents = msg + m.state |= stashStateStashLoaded + + case spinner.TickMsg: + if (m.state & stashStateStashLoaded) == 0 { + var cmd boba.Cmd + m.spinner, cmd = spinner.Update(msg, m.spinner) + return m, cmd + } + return m, nil + } + + return m, nil +} + +// VIEW + +func stashView(m stashModel) string { + var s string + if (m.state & stashStateStashLoaded) != 0 { + + } + s += spinner.View(m.spinner) + " Loading stash..." + return s + "\n" +} + +// CMD + +func getStash(m stashModel) boba.Cmd { + return func() boba.Msg { + stash, err := m.cc.GetStash(m.page) + if err != nil { + return stashErrMsg(err) + } + return gotStashMsg(stash) + } +} diff --git a/ui/ui.go b/ui/ui.go index 64456f9..36ec67c 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -3,16 +3,16 @@ package ui import ( "errors" + "github.com/charmbracelet/boba" + "github.com/charmbracelet/boba/spinner" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/charm/ui/keygen" - "github.com/charmbracelet/tea" - "github.com/charmbracelet/teaparty/spinner" ) -// NewProgram returns a new Tea program -func NewProgram() *tea.Program { - return tea.NewProgram(initialize, update, view, subscriptions) +// NewProgram returns a new Boba program +func NewProgram() *boba.Program { + return boba.NewProgram(initialize, update, view) } // MESSAGES @@ -30,7 +30,7 @@ const ( stateInitCharmClient state = iota stateKeygenRunning stateKeygenFinished - stateReady + stateShowStash ) type model struct { @@ -44,38 +44,41 @@ type model struct { // INIT -func initialize() (tea.Model, tea.Cmd) { +func initialize() (boba.Model, boba.Cmd) { s := spinner.NewModel() s.Type = spinner.Dot s.ForegroundColor = common.SpinnerColor return model{ - spinner: s, - state: stateInitCharmClient, - }, newCharmClient + spinner: s, + state: stateInitCharmClient, + }, boba.Batch( + newCharmClient, + spinner.Tick(s), + ) } // UPDATE -func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { +func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { m, ok := mdl.(model) if !ok { - return model{err: errors.New("could not perform assertion on model in update")}, tea.Quit + return model{err: errors.New("could not perform assertion on model in update")}, boba.Quit } switch msg := msg.(type) { - case tea.KeyMsg: + case boba.KeyMsg: switch msg.String() { case "ctrl+c": - return m, tea.Quit + return m, boba.Quit default: return m, nil } case fatalErrMsg: m.err = msg - return m, tea.Quit + return m, boba.Quit case errMsg: m.err = msg @@ -91,11 +94,14 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // The keygen didn't work m.err = errors.New("SSH authentication failed") - return m, tea.Quit + return m, boba.Quit case spinner.TickMsg: - m.spinner, _ = spinner.Update(msg, m.spinner) - return m, nil + if m.state == stateInitCharmClient { + var cmd boba.Cmd + m.spinner, cmd = spinner.Update(msg, m.spinner) + return m, cmd + } case keygen.DoneMsg: m.state = stateKeygenFinished @@ -103,28 +109,30 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case newCharmClientMsg: m.cc = msg - m.state = stateReady + m.state = stateShowStash return m, nil default: switch m.state { case stateKeygenRunning: - mdl, cmd := keygen.Update(msg, tea.Model(m.keygen)) + mdl, cmd := keygen.Update(msg, boba.Model(m.keygen)) keygenModel, ok := mdl.(keygen.Model) if !ok { m.err = errors.New("could not perform assertion on keygen model in main update") - return m, tea.Quit + return m, boba.Quit } m.keygen = keygenModel return m, cmd } return m, nil } + + return m, nil } // VIEW -func view(mdl tea.Model) string { +func view(mdl boba.Model) string { m, ok := mdl.(model) if !ok { return "could not perform assertion on model in view" @@ -142,43 +150,15 @@ func view(mdl tea.Model) string { s += keygen.View(m.keygen) case stateKeygenFinished: s += spinner.View(m.spinner) + " Re-initializing..." - case stateReady: + case stateShowStash: s += "Ready." } - return s -} - -// SUBSCRIPTIONS - -func subscriptions(mdl tea.Model) tea.Subs { - m, ok := mdl.(model) - if !ok { - return nil - } - - subs := make(tea.Subs) - - switch m.state { - case stateInitCharmClient: - fallthrough - case stateKeygenFinished: - sub, err := spinner.MakeSub(m.spinner) - if err == nil { - subs["glow-spin"] = sub - } - case stateKeygenRunning: - sub, err := keygen.Spin(m.keygen) - if err == nil { - subs["keygen-spin"] = sub - } - } - - return subs + return s + "\n" } // COMMANDS -func newCharmClient() tea.Msg { +func newCharmClient() boba.Msg { cfg, err := charm.ConfigFromEnv() if err != nil { return fatalErrMsg(err) From bb6904afe2272dd5fcfdcaa43d4682f5c5e1d6a0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 13 May 2020 16:00:27 -0400 Subject: [PATCH 206/911] Load stash + fix spinner issues + render nothing useful Note that this is we're currently building aginst unreleased versions of Charm and Boba. --- main.go | 8 ++++++-- ui/stash.go | 18 ++++++++++++------ ui/ui.go | 55 +++++++++++++++++++++++++++++++++-------------------- 3 files changed, 52 insertions(+), 29 deletions(-) diff --git a/main.go b/main.go index da73581..e9bd8af 100644 --- a/main.go +++ b/main.go @@ -15,6 +15,7 @@ import ( "github.com/spf13/cobra" "golang.org/x/crypto/ssh/terminal" + "github.com/charmbracelet/boba" "github.com/charmbracelet/glamour" "github.com/charmbracelet/glow/ui" ) @@ -151,9 +152,12 @@ func execute(cmd *cobra.Command, args []string) error { if len(args) == 0 { //return executeArg(cmd, "", os.Stdout) + debug := os.Getenv("GLOW_DEBUG") + if debug != "" { + boba.UseSysLog("glow") + } if err := ui.NewProgram().Start(); err != nil { - fmt.Println(err) - os.Exit(1) + return err } } diff --git a/ui/stash.go b/ui/stash.go index 389c087..9f10013 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -13,12 +13,14 @@ type stashErrMsg error type gotStashMsg []*charm.Markdown +type stashSpinnerTickMsg struct{} + // MODEL type stashState int const ( - stashStateInit stashState = 1 << iota + stashStateInit stashState = iota stashStateStashLoaded ) @@ -37,10 +39,12 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { s := spinner.NewModel() s.Type = spinner.Dot s.ForegroundColor = common.SpinnerColor + s.CustomMsgFunc = newSpinnerTickMsg m := stashModel{ cc: cc, spinner: s, + page: 1, } return m, boba.Batch( @@ -48,6 +52,9 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { spinner.Tick(s), ) } +func newSpinnerTickMsg() boba.Msg { + return stashSpinnerTickMsg{} +} // UPDATE @@ -59,15 +66,14 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case gotStashMsg: m.documents = msg - m.state |= stashStateStashLoaded + m.state = stashStateStashLoaded - case spinner.TickMsg: - if (m.state & stashStateStashLoaded) == 0 { + case stashSpinnerTickMsg: + if m.state == stashStateInit { var cmd boba.Cmd m.spinner, cmd = spinner.Update(msg, m.spinner) return m, cmd } - return m, nil } return m, nil @@ -78,7 +84,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { func stashView(m stashModel) string { var s string if (m.state & stashStateStashLoaded) != 0 { - + return "Loaded stash." } s += spinner.View(m.spinner) + " Loading stash..." return s + "\n" diff --git a/ui/ui.go b/ui/ui.go index 36ec67c..76a6b73 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -31,6 +31,7 @@ const ( stateKeygenRunning stateKeygenFinished stateShowStash + stateQuitting ) type model struct { @@ -40,6 +41,7 @@ type model struct { keygen keygen.Model state state err error + stash stashModel } // INIT @@ -66,14 +68,15 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { return model{err: errors.New("could not perform assertion on model in update")}, boba.Quit } + var cmd boba.Cmd + switch msg := msg.(type) { case boba.KeyMsg: switch msg.String() { case "ctrl+c": + m.state = stateQuitting return m, boba.Quit - default: - return m, nil } case fatalErrMsg: @@ -92,16 +95,20 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { return m, keygen.GenerateKeys } - // The keygen didn't work + // The keygen didn't work and we can't auth m.err = errors.New("SSH authentication failed") return m, boba.Quit case spinner.TickMsg: - if m.state == stateInitCharmClient { - var cmd boba.Cmd + switch m.state { + case stateInitCharmClient: m.spinner, cmd = spinner.Update(msg, m.spinner) - return m, cmd } + return m, cmd + + case stashSpinnerTickMsg: + m.stash, cmd = stashUpdate(msg, m.stash) + return m, cmd case keygen.DoneMsg: m.state = stateKeygenFinished @@ -110,21 +117,25 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case newCharmClientMsg: m.cc = msg m.state = stateShowStash - return m, nil + m.stash, cmd = stashInit(m.cc) + return m, cmd + } - default: - switch m.state { - case stateKeygenRunning: - mdl, cmd := keygen.Update(msg, boba.Model(m.keygen)) - keygenModel, ok := mdl.(keygen.Model) - if !ok { - m.err = errors.New("could not perform assertion on keygen model in main update") - return m, boba.Quit - } - m.keygen = keygenModel - return m, cmd + switch m.state { + + case stateKeygenRunning: + mdl, cmd := keygen.Update(msg, boba.Model(m.keygen)) + keygenModel, ok := mdl.(keygen.Model) + if !ok { + m.err = errors.New("could not perform assertion on keygen model in main update") + return m, boba.Quit } - return m, nil + m.keygen = keygenModel + return m, cmd + + case stateShowStash: + m.stash, cmd = stashUpdate(msg, m.stash) + return m, cmd } return m, nil @@ -139,7 +150,7 @@ func view(mdl boba.Model) string { } if m.err != nil { - return m.err.Error() + return m.err.Error() + "\n" } var s string @@ -151,7 +162,9 @@ func view(mdl boba.Model) string { case stateKeygenFinished: s += spinner.View(m.spinner) + " Re-initializing..." case stateShowStash: - s += "Ready." + s += stashView(m.stash) + case stateQuitting: + s += "Thanks for using Glow!" } return s + "\n" } From 796504238f6dc7330f912b5aa2a539f82a30dd9a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 13 May 2020 19:02:39 -0400 Subject: [PATCH 207/911] Render stash items --- go.mod | 2 ++ ui/stash.go | 60 +++++++++++++++++++++++++++++++++++++++++++++++------ ui/ui.go | 4 ++++ 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index f28bdd3..4ee2eac 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,8 @@ require ( github.com/charmbracelet/tea v0.3.0 github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d github.com/dlclark/regexp2 v1.2.0 // indirect + github.com/muesli/reflow v0.1.0 + github.com/muesli/termenv v0.5.2 github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect diff --git a/ui/stash.go b/ui/stash.go index 9f10013..e0e8ed8 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -1,10 +1,16 @@ package ui import ( + "fmt" + "sort" + "strings" + "github.com/charmbracelet/boba" "github.com/charmbracelet/boba/spinner" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" + "github.com/muesli/reflow/indent" + te "github.com/muesli/termenv" ) // MSG @@ -21,7 +27,7 @@ type stashState int const ( stashStateInit stashState = iota - stashStateStashLoaded + stashStateLoaded ) type stashModel struct { @@ -65,8 +71,9 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { m.err = msg case gotStashMsg: + sort.Sort(charm.MarkdownsByCreatedAt(msg)) // sort by date m.documents = msg - m.state = stashStateStashLoaded + m.state = stashStateLoaded case stashSpinnerTickMsg: if m.state == stashStateInit { @@ -83,11 +90,52 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { func stashView(m stashModel) string { var s string - if (m.state & stashStateStashLoaded) != 0 { - return "Loaded stash." + switch m.state { + case stashStateInit: + s += spinner.View(m.spinner) + " Loading stash..." + case stashStateLoaded: + if len(m.documents) == 0 { + s += stashEmtpyView(m) + break + } + s += stashPopulatedView(m) } - s += spinner.View(m.spinner) + " Loading stash..." - return s + "\n" + return "\n" + indent.String(s, 2) +} + +func stashEmtpyView(m stashModel) string { + return "Nothing stashed yet." +} + +func stashPopulatedView(m stashModel) string { + s := "Here's your markdown stash:\n\n" + for _, v := range m.documents { + s += stashListItemView(*v).renderNormal() + "\n\n" + } + s = strings.TrimSpace(s) + return s +} + +type stashListItemView charm.Markdown + +func (m stashListItemView) renderNormal() string { + line := common.VerticalLine(common.StateNormal) + " " + var s string + s += fmt.Sprintf("%s#%d%s\n", line, m.ID, m.title()) + s += fmt.Sprintf("%sStashed: %s", line, m.date()) + return s +} + +func (m stashListItemView) date() string { + s := m.CreatedAt.Format("02 Jan 2006 15:04:05 MST") + return te.String(s).Foreground(common.Indigo.Color()).String() +} + +func (m stashListItemView) title() string { + if m.Note == "" { + return "" + } + return ": " + te.String(m.Note).Foreground(common.Indigo.Color()).String() } // CMD diff --git a/ui/ui.go b/ui/ui.go index 76a6b73..771e6a4 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -8,6 +8,7 @@ import ( "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/charm/ui/keygen" + "github.com/muesli/reflow/indent" ) // NewProgram returns a new Boba program @@ -166,6 +167,9 @@ func view(mdl boba.Model) string { case stateQuitting: s += "Thanks for using Glow!" } + if m.state != stateShowStash { + s = "\n" + indent.String(s, 2) + } return s + "\n" } From 25340455a775e377e885d55a2db3ef589bc030e3 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 13 May 2020 19:15:39 -0400 Subject: [PATCH 208/911] Do it fullscreen --- go.mod | 2 +- main.go | 7 +++++++ ui/ui.go | 8 ++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 4ee2eac..6245a7c 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d github.com/dlclark/regexp2 v1.2.0 // indirect github.com/muesli/reflow v0.1.0 - github.com/muesli/termenv v0.5.2 + github.com/muesli/termenv v0.6.0 github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect diff --git a/main.go b/main.go index e9bd8af..c57bf9b 100644 --- a/main.go +++ b/main.go @@ -152,13 +152,20 @@ func execute(cmd *cobra.Command, args []string) error { if len(args) == 0 { //return executeArg(cmd, "", os.Stdout) + debug := os.Getenv("GLOW_DEBUG") if debug != "" { boba.UseSysLog("glow") } + + boba.AltScreen() if err := ui.NewProgram().Start(); err != nil { return err } + boba.ExitAltScreen() + + fmt.Println("\n Thanks for using Glow!\n") + return nil } for _, arg := range args { diff --git a/ui/ui.go b/ui/ui.go index 771e6a4..a187c4b 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -32,7 +32,6 @@ const ( stateKeygenRunning stateKeygenFinished stateShowStash - stateQuitting ) type model struct { @@ -75,8 +74,11 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case boba.KeyMsg: switch msg.String() { + case "q": + fallthrough + case "esc": + fallthrough case "ctrl+c": - m.state = stateQuitting return m, boba.Quit } @@ -164,8 +166,6 @@ func view(mdl boba.Model) string { s += spinner.View(m.spinner) + " Re-initializing..." case stateShowStash: s += stashView(m.stash) - case stateQuitting: - s += "Thanks for using Glow!" } if m.state != stateShowStash { s = "\n" + indent.String(s, 2) From 359828a7190b20b780e850be714c69b104bb5517 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 13 May 2020 19:22:46 -0400 Subject: [PATCH 209/911] Silence this Go linter message --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index c57bf9b..2b52b04 100644 --- a/main.go +++ b/main.go @@ -164,7 +164,7 @@ func execute(cmd *cobra.Command, args []string) error { } boba.ExitAltScreen() - fmt.Println("\n Thanks for using Glow!\n") + fmt.Printf("\n Thanks for using Glow!\n\n") return nil } From 5ea351abf5bf1580a030472ee217401d9a9ec8fd Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 13 May 2020 20:21:37 -0400 Subject: [PATCH 210/911] Navigate over unpaginated stash --- ui/stash.go | 55 +++++++++++++++++++++++++++++++++++++++++++---------- ui/ui.go | 16 ++++++++++++++++ 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index e0e8ed8..f273e7f 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -37,6 +37,7 @@ type stashModel struct { documents []*charm.Markdown page int spinner spinner.Model + index int } // INIT @@ -67,6 +68,23 @@ func newSpinnerTickMsg() boba.Msg { func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { switch msg := msg.(type) { + case boba.KeyMsg: + switch msg.String() { + + case "k": + fallthrough + case "up": + m.index = max(0, m.index-1) + return m, nil + + case "j": + fallthrough + case "down": + m.index = min(len(m.documents)-1, m.index+1) + return m, nil + + } + case stashErrMsg: m.err = msg @@ -109,8 +127,12 @@ func stashEmtpyView(m stashModel) string { func stashPopulatedView(m stashModel) string { s := "Here's your markdown stash:\n\n" - for _, v := range m.documents { - s += stashListItemView(*v).renderNormal() + "\n\n" + for i, v := range m.documents { + state := common.StateNormal + if i == m.index { + state = common.StateSelected + } + s += stashListItemView(*v).render(state) + "\n\n" } s = strings.TrimSpace(s) return s @@ -118,24 +140,37 @@ func stashPopulatedView(m stashModel) string { type stashListItemView charm.Markdown -func (m stashListItemView) renderNormal() string { - line := common.VerticalLine(common.StateNormal) + " " +func (m stashListItemView) render(state common.State) string { + line := common.VerticalLine(state) + " " + dateTitleColor := common.NoColor + if state == common.StateDeleting { + dateTitleColor = common.Red + } + dateTitle := te.String("Stashed: ").Foreground(dateTitleColor.Color()).String() var s string - s += fmt.Sprintf("%s#%d%s\n", line, m.ID, m.title()) - s += fmt.Sprintf("%sStashed: %s", line, m.date()) + s += fmt.Sprintf("%s#%d%s\n", line, m.ID, m.title(state)) + s += fmt.Sprintf("%s%s %s", line, dateTitle, m.date(state)) return s } -func (m stashListItemView) date() string { +func (m stashListItemView) date(state common.State) string { + c := common.Indigo + if state == common.StateDeleting { + c = common.FaintRed + } s := m.CreatedAt.Format("02 Jan 2006 15:04:05 MST") - return te.String(s).Foreground(common.Indigo.Color()).String() + return te.String(s).Foreground(c.Color()).String() } -func (m stashListItemView) title() string { +func (m stashListItemView) title(state common.State) string { if m.Note == "" { return "" } - return ": " + te.String(m.Note).Foreground(common.Indigo.Color()).String() + c := common.Indigo + if state == common.StateDeleting { + c = common.Red + } + return ": " + te.String(m.Note).Foreground(c.Color()).String() } // CMD diff --git a/ui/ui.go b/ui/ui.go index a187c4b..0008457 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -190,3 +190,19 @@ func newCharmClient() boba.Msg { return newCharmClientMsg(cc) } + +// ETC + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} From 05340539deeb5325154a96c72615f7b287da4192 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 13 May 2020 22:08:17 -0400 Subject: [PATCH 211/911] Load chosen document into pager --- ui/stash.go | 33 +++++++++++++++++++++++++++------ ui/ui.go | 39 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 9 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index f273e7f..7c85779 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -16,10 +16,9 @@ import ( // MSG type stashErrMsg error - -type gotStashMsg []*charm.Markdown - type stashSpinnerTickMsg struct{} +type gotStashMsg []*charm.Markdown +type gotStashedItemMsg *charm.Markdown // MODEL @@ -28,6 +27,7 @@ type stashState int const ( stashStateInit stashState = iota stashStateLoaded + stashStateLoadingItem ) type stashModel struct { @@ -55,7 +55,7 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { } return m, boba.Batch( - getStash(m), + loadStash(m), spinner.Tick(s), ) } @@ -83,18 +83,27 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { m.index = min(len(m.documents)-1, m.index+1) return m, nil + case "enter": + m.state = stashStateLoadingItem + return m, boba.Batch( + loadStashedItem(m.cc, m.documents[m.index].ID), + spinner.Tick(m.spinner), + ) + } case stashErrMsg: m.err = msg + return m, nil case gotStashMsg: sort.Sort(charm.MarkdownsByCreatedAt(msg)) // sort by date m.documents = msg m.state = stashStateLoaded + return m, nil case stashSpinnerTickMsg: - if m.state == stashStateInit { + if m.state == stashStateInit || m.state == stashStateLoadingItem { var cmd boba.Cmd m.spinner, cmd = spinner.Update(msg, m.spinner) return m, cmd @@ -111,6 +120,8 @@ func stashView(m stashModel) string { switch m.state { case stashStateInit: s += spinner.View(m.spinner) + " Loading stash..." + case stashStateLoadingItem: + s += spinner.View(m.spinner) + " Loading document..." case stashStateLoaded: if len(m.documents) == 0 { s += stashEmtpyView(m) @@ -175,7 +186,7 @@ func (m stashListItemView) title(state common.State) string { // CMD -func getStash(m stashModel) boba.Cmd { +func loadStash(m stashModel) boba.Cmd { return func() boba.Msg { stash, err := m.cc.GetStash(m.page) if err != nil { @@ -184,3 +195,13 @@ func getStash(m stashModel) boba.Cmd { return gotStashMsg(stash) } } + +func loadStashedItem(cc *charm.Client, id int) boba.Cmd { + return func() boba.Msg { + m, err := cc.GetStashMarkdown(id) + if err != nil { + return stashErrMsg(err) + } + return gotStashedItemMsg(m) + } +} diff --git a/ui/ui.go b/ui/ui.go index 0008457..451bf7a 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -4,6 +4,7 @@ import ( "errors" "github.com/charmbracelet/boba" + "github.com/charmbracelet/boba/pager" "github.com/charmbracelet/boba/spinner" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" @@ -32,6 +33,7 @@ const ( stateKeygenRunning stateKeygenFinished stateShowStash + stateShowDocument ) type model struct { @@ -42,6 +44,13 @@ type model struct { state state err error stash stashModel + pager pager.Model +} + +func (m *model) unloadDocument() { + m.pager = pager.Model{} + m.state = stateShowStash + m.stash.state = stashStateLoaded } // INIT @@ -74,10 +83,16 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case boba.KeyMsg: switch msg.String() { + case "q": fallthrough case "esc": - fallthrough + if m.state == stateShowDocument { + m.unloadDocument() + return m, nil + } + return m, boba.Quit + case "ctrl+c": return m, boba.Quit } @@ -122,6 +137,12 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { m.state = stateShowStash m.stash, cmd = stashInit(m.cc) return m, cmd + + case gotStashedItemMsg: + m.state = stateShowDocument + m.pager = pager.NewModel() + m.pager.Content(msg.Body) + return m, pager.GetTerminalSize } switch m.state { @@ -139,6 +160,16 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case stateShowStash: m.stash, cmd = stashUpdate(msg, m.stash) return m, cmd + + case stateShowDocument: + newPagerModel, cmd := pager.Update(msg, boba.Model(m.pager)) + newPagerModel_, ok := newPagerModel.(pager.Model) + if !ok { + m.err = errors.New("could not assert boba.Model to pager.Model in main update") + return m, nil + } + m.pager = newPagerModel_ + return m, cmd } return m, nil @@ -166,11 +197,13 @@ func view(mdl boba.Model) string { s += spinner.View(m.spinner) + " Re-initializing..." case stateShowStash: s += stashView(m.stash) + case stateShowDocument: + s += pager.View(m.pager) } - if m.state != stateShowStash { + if m.state != stateShowStash && m.state != stateShowDocument { s = "\n" + indent.String(s, 2) } - return s + "\n" + return s } // COMMANDS From c9979901fd8bcb42b763ab3c82b7ccf7b683853b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 14 May 2020 15:06:13 -0400 Subject: [PATCH 212/911] Add status bar --- ui/ui.go | 117 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 103 insertions(+), 14 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 451bf7a..4b73d87 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -2,6 +2,9 @@ package ui import ( "errors" + "fmt" + "os" + "strings" "github.com/charmbracelet/boba" "github.com/charmbracelet/boba/pager" @@ -10,6 +13,17 @@ import ( "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/charm/ui/keygen" "github.com/muesli/reflow/indent" + te "github.com/muesli/termenv" + "golang.org/x/crypto/ssh/terminal" +) + +const ( + statusBarHeight = 1 +) + +var ( + statusBarBg = common.NewColorPair("#242424", "#F4F0F4") + statusBarFg = common.NewColorPair("#5A5A5A", "") ) // NewProgram returns a new Boba program @@ -24,6 +38,15 @@ type errMsg error type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} +type terminalSizeMsg struct { + width int + height int + err error +} + +func (t terminalSizeMsg) Size() (int, int) { return t.width, t.height } +func (t terminalSizeMsg) Error() error { return t.err } + // MODEL type state int @@ -37,14 +60,17 @@ const ( ) type model struct { - cc *charm.Client - user *charm.User - spinner spinner.Model - keygen keygen.Model - state state - err error - stash stashModel - pager pager.Model + cc *charm.Client + user *charm.User + spinner spinner.Model + keygen keygen.Model + state state + err error + stash stashModel + pager pager.Model + terminalWidth int + terminalHeight int + docNote string } func (m *model) unloadDocument() { @@ -60,12 +86,20 @@ func initialize() (boba.Model, boba.Cmd) { s.Type = spinner.Dot s.ForegroundColor = common.SpinnerColor + w, h, err := terminal.GetSize(int(os.Stdout.Fd())) + return model{ - spinner: s, - state: stateInitCharmClient, + spinner: s, + state: stateInitCharmClient, + err: err, + terminalWidth: w, + terminalHeight: h, }, boba.Batch( newCharmClient, spinner.Tick(s), + boba.GetTerminalSize(func(w, h int, err error) boba.TerminalSizeMsg { + return terminalSizeMsg{width: w, height: h, err: err} + }), ) } @@ -105,6 +139,16 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { m.err = msg return m, nil + case terminalSizeMsg: + if msg.Error() != nil { + m.err = msg.Error() + return m, nil + } + w, h := msg.Size() + m.terminalWidth = w + m.terminalHeight = h + return m, nil + case sshAuthErrMsg: // If we haven't run the keygen yet, do that if m.state != stateKeygenFinished { @@ -125,7 +169,9 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { return m, cmd case stashSpinnerTickMsg: - m.stash, cmd = stashUpdate(msg, m.stash) + if m.state == stateShowStash { + m.stash, cmd = stashUpdate(msg, m.stash) + } return m, cmd case keygen.DoneMsg: @@ -139,10 +185,18 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { return m, cmd case gotStashedItemMsg: + // TODO: there's a (unlikely) potential race condition that could + // happen here where we start the pager before we have received the + // terminal size. We could solve this in a few ways, including by + // getting the terminal size imperatively and synchronously m.state = stateShowDocument - m.pager = pager.NewModel() + m.pager = pager.NewModel( + m.terminalWidth, + m.terminalHeight-statusBarHeight, + ) + m.docNote = msg.Note m.pager.Content(msg.Body) - return m, pager.GetTerminalSize + return m, nil } switch m.state { @@ -198,7 +252,8 @@ func view(mdl boba.Model) string { case stateShowStash: s += stashView(m.stash) case stateShowDocument: - s += pager.View(m.pager) + //return fmt.Sprintf("\n%s\n%s", statusBarView(m), pager.View(m.pager)) + return fmt.Sprintf("%s\n%s", pager.View(m.pager), statusBarView(m)) } if m.state != stateShowStash && m.state != stateShowDocument { s = "\n" + indent.String(s, 2) @@ -206,6 +261,40 @@ func view(mdl boba.Model) string { return s } +func statusBarView(m model) string { + // Logo + logoText := " Glow " + logo := te.String(logoText). + Bold(). + Foreground(common.YellowGreen.Color()). + Background(common.Fuschia.Color()). + String() + + // Note + noteText := m.docNote + if len(noteText) == 0 { + noteText = "(No title)" + } + noteText = " " + noteText + note := te.String(noteText). + Foreground(statusBarFg.Color()). + Background(statusBarBg.Color()).String() + + // Scroll percent + percentText := fmt.Sprintf(" %3.f%% ", m.pager.ScrollPercent()*100) + percent := te.String(percentText). + Foreground(statusBarFg.Color()). + Background(statusBarBg.Color()). + String() + + emptySpace := te.String(" ").Background(statusBarBg.Color()).String() + + return logo + note + strings.Repeat( + emptySpace, + m.terminalWidth-len(logoText)-len(noteText)-len(percentText), + ) + percent +} + // COMMANDS func newCharmClient() boba.Msg { From 9bc86c1944dbf377674218886b08f575fb3ff602 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 14 May 2020 15:41:17 -0400 Subject: [PATCH 213/911] Fix character-chomping weirdness with a well-placed newline --- ui/ui.go | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 4b73d87..6c68751 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -250,15 +250,12 @@ func view(mdl boba.Model) string { case stateKeygenFinished: s += spinner.View(m.spinner) + " Re-initializing..." case stateShowStash: - s += stashView(m.stash) + return stashView(m.stash) case stateShowDocument: - //return fmt.Sprintf("\n%s\n%s", statusBarView(m), pager.View(m.pager)) - return fmt.Sprintf("%s\n%s", pager.View(m.pager), statusBarView(m)) + return fmt.Sprintf("\n%s\n%s", pager.View(m.pager), statusBarView(m)) } - if m.state != stateShowStash && m.state != stateShowDocument { - s = "\n" + indent.String(s, 2) - } - return s + + return "\n" + indent.String(s, 2) } func statusBarView(m model) string { @@ -287,12 +284,11 @@ func statusBarView(m model) string { Background(statusBarBg.Color()). String() - emptySpace := te.String(" ").Background(statusBarBg.Color()).String() + // Empty space + emptyCell := te.String(" ").Background(statusBarBg.Color()).String() + emptySpace := strings.Repeat(emptyCell, m.terminalWidth-len(logoText)-len(noteText)-len(percentText)) - return logo + note + strings.Repeat( - emptySpace, - m.terminalWidth-len(logoText)-len(noteText)-len(percentText), - ) + percent + return logo + note + emptySpace + percent } // COMMANDS From 6e13ce396835db0adf7722e1e31bb8880b93e789 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 14 May 2020 18:03:24 -0400 Subject: [PATCH 214/911] Fix status bar colors on light backgrouds --- ui/ui.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 6c68751..c72a72b 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -22,8 +22,9 @@ const ( ) var ( - statusBarBg = common.NewColorPair("#242424", "#F4F0F4") - statusBarFg = common.NewColorPair("#5A5A5A", "") + glowLogoTextColor = common.Color("#ECFD65") + statusBarBg = common.NewColorPair("#242424", "#E6E6E6") + statusBarFg = common.NewColorPair("#5A5A5A", "#949494") ) // NewProgram returns a new Boba program @@ -263,7 +264,7 @@ func statusBarView(m model) string { logoText := " Glow " logo := te.String(logoText). Bold(). - Foreground(common.YellowGreen.Color()). + Foreground(glowLogoTextColor). Background(common.Fuschia.Color()). String() From c7e584c68ef96d96593e1ecc64e08b872da6ae17 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 14 May 2020 18:47:59 -0400 Subject: [PATCH 215/911] Improve state on selected items in stash view --- ui/stash.go | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 7c85779..99ab5c0 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -3,6 +3,7 @@ package ui import ( "fmt" "sort" + "strconv" "strings" "github.com/charmbracelet/boba" @@ -153,14 +154,22 @@ type stashListItemView charm.Markdown func (m stashListItemView) render(state common.State) string { line := common.VerticalLine(state) + " " - dateTitleColor := common.NoColor - if state == common.StateDeleting { - dateTitleColor = common.Red + keyColor := common.NoColor + switch state { + case common.StateSelected: + keyColor = common.Fuschia + case common.StateDeleting: + keyColor = common.Red } - dateTitle := te.String("Stashed: ").Foreground(dateTitleColor.Color()).String() + titleKey := strconv.Itoa(m.ID) + if m.Note != "" { + titleKey += ":" + } + titleKey = te.String("#" + titleKey).Foreground(keyColor.Color()).String() + dateKey := te.String("Stashed:").Foreground(keyColor.Color()).String() var s string - s += fmt.Sprintf("%s#%d%s\n", line, m.ID, m.title(state)) - s += fmt.Sprintf("%s%s %s", line, dateTitle, m.date(state)) + s += fmt.Sprintf("%s%s %s\n", line, titleKey, m.title(state)) + s += fmt.Sprintf("%s%s %s", line, dateKey, m.date(state)) return s } @@ -181,7 +190,7 @@ func (m stashListItemView) title(state common.State) string { if state == common.StateDeleting { c = common.Red } - return ": " + te.String(m.Note).Foreground(c.Color()).String() + return te.String(m.Note).Foreground(c.Color()).String() } // CMD From d2e2da70e23ab7f4cdfe10e6c19277865a9b0521 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 14 May 2020 20:23:11 -0400 Subject: [PATCH 216/911] Properly render one page of the stash --- ui/stash.go | 92 ++++++++++++++++++++++++++++++++++++++++++----------- ui/ui.go | 15 +++++++-- 2 files changed, 85 insertions(+), 22 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 99ab5c0..ebe2b6f 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/charmbracelet/boba" + "github.com/charmbracelet/boba/paginator" "github.com/charmbracelet/boba/spinner" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" @@ -14,6 +15,12 @@ import ( te "github.com/muesli/termenv" ) +const ( + itemHeight = 3 + topPadding = 3 + bottomPadding = 2 +) + // MSG type stashErrMsg error @@ -32,13 +39,33 @@ const ( ) type stashModel struct { - cc *charm.Client - err error - state stashState - documents []*charm.Markdown - page int - spinner spinner.Model - index int + cc *charm.Client + err error + state stashState + documents []*charm.Markdown + spinner spinner.Model + index int + terminalWidth int + terminalHeight int + + // This handles the local pagination, which is different than the page + // we're fetching from on the server side + paginator paginator.Model + + // Page we're fetching items from on the server, which is different from + // the local pagination. Generally, the server will return more items than + // we can display at a time so we can paginate locally without having to + // fetch every time. + page int +} + +func (m *stashModel) SetSize(width, height int) { + m.terminalWidth = width + m.terminalHeight = height + + // Update the paginator + perPage := (m.terminalHeight - topPadding - bottomPadding) / itemHeight + m.paginator.PerPage = perPage } // INIT @@ -47,12 +74,13 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { s := spinner.NewModel() s.Type = spinner.Dot s.ForegroundColor = common.SpinnerColor - s.CustomMsgFunc = newSpinnerTickMsg + s.CustomMsgFunc = func() boba.Msg { return stashSpinnerTickMsg{} } m := stashModel{ - cc: cc, - spinner: s, - page: 1, + cc: cc, + spinner: s, + page: 1, + paginator: paginator.NewModel(), } return m, boba.Batch( @@ -60,9 +88,6 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { spinner.Tick(s), ) } -func newSpinnerTickMsg() boba.Msg { - return stashSpinnerTickMsg{} -} // UPDATE @@ -70,6 +95,11 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { switch msg := msg.(type) { case boba.KeyMsg: + // Don't respond to keystrokes if we're still loading + if m.state == stashStateInit { + return m, nil + } + switch msg.String() { case "k": @@ -99,8 +129,9 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case gotStashMsg: sort.Sort(charm.MarkdownsByCreatedAt(msg)) // sort by date - m.documents = msg + m.documents = append(m.documents, msg...) m.state = stashStateLoaded + m.paginator.SetTotalPages(len(m.documents)) return m, nil case stashSpinnerTickMsg: @@ -128,7 +159,16 @@ func stashView(m stashModel) string { s += stashEmtpyView(m) break } - s += stashPopulatedView(m) + + // Blank lines we'll need to fill with newlines fo the viewport is + // properly filled + numBlankLines := (m.terminalHeight - topPadding - bottomPadding) % itemHeight + blankLines := "" + if numBlankLines > 0 { + blankLines = strings.Repeat("\n", numBlankLines) + } + + s += stashPopulatedView(m) + blankLines + helpView(m) } return "\n" + indent.String(s, 2) } @@ -138,16 +178,30 @@ func stashEmtpyView(m stashModel) string { } func stashPopulatedView(m stashModel) string { + start, end := m.paginator.GetSliceBounds(len(m.documents)) + docs := m.documents[start:end] + s := "Here's your markdown stash:\n\n" - for i, v := range m.documents { + for i, v := range docs { state := common.StateNormal if i == m.index { state = common.StateSelected } s += stashListItemView(*v).render(state) + "\n\n" } - s = strings.TrimSpace(s) - return s + return strings.TrimSpace(s) +} + +func helpView(m stashModel) string { + h := []string{"enter: open"} + if len(m.documents) > 0 { + h = append(h, "j/k, ↑/↓: choose") + } + if m.paginator.TotalPages > 1 { + h = append(h, "h/l, ←/→: page") + } + h = append(h, []string{"x: delete", "esc: exit"}...) + return common.HelpView(h...) } type stashListItemView charm.Markdown diff --git a/ui/ui.go b/ui/ui.go index c72a72b..aae38d8 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -98,9 +98,7 @@ func initialize() (boba.Model, boba.Cmd) { }, boba.Batch( newCharmClient, spinner.Tick(s), - boba.GetTerminalSize(func(w, h int, err error) boba.TerminalSizeMsg { - return terminalSizeMsg{width: w, height: h, err: err} - }), + getTerminalSize(), ) } @@ -130,6 +128,10 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case "ctrl+c": return m, boba.Quit + + // Re-render + case "ctrl+l": + return m, getTerminalSize() } case fatalErrMsg: @@ -148,6 +150,7 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { w, h := msg.Size() m.terminalWidth = w m.terminalHeight = h + m.stash.SetSize(w, h) return m, nil case sshAuthErrMsg: @@ -183,6 +186,7 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { m.cc = msg m.state = stateShowStash m.stash, cmd = stashInit(m.cc) + m.stash.SetSize(m.terminalWidth, m.terminalHeight) return m, cmd case gotStashedItemMsg: @@ -293,6 +297,11 @@ func statusBarView(m model) string { } // COMMANDS +func getTerminalSize() boba.Cmd { + return boba.GetTerminalSize(func(w, h int, err error) boba.TerminalSizeMsg { + return terminalSizeMsg{width: w, height: h, err: err} + }) +} func newCharmClient() boba.Msg { cfg, err := charm.ConfigFromEnv() From fd62cebfd1725a58f8ebdfe1c5abd4bba353e0c3 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 14 May 2020 20:52:25 -0400 Subject: [PATCH 217/911] Left/right + h/l to navigate pages --- go.mod | 4 ++++ ui/stash.go | 46 ++++++++++++++++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 6245a7c..00ee7fa 100644 --- a/go.mod +++ b/go.mod @@ -16,3 +16,7 @@ require ( golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c ) + +replace github.com/charmbracelet/charm => ../charm + +replace github.com/charmbracelet/boba => ../boba diff --git a/ui/stash.go b/ui/stash.go index ebe2b6f..c619c4e 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -18,7 +18,7 @@ import ( const ( itemHeight = 3 topPadding = 3 - bottomPadding = 2 + bottomPadding = 4 ) // MSG @@ -76,11 +76,15 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { s.ForegroundColor = common.SpinnerColor s.CustomMsgFunc = func() boba.Msg { return stashSpinnerTickMsg{} } + p := paginator.NewModel() + p.Type = paginator.Dots + p.InactiveDot = common.Subtle("•") + m := stashModel{ cc: cc, spinner: s, page: 1, - paginator: paginator.NewModel(), + paginator: p, } return m, boba.Batch( @@ -92,6 +96,11 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { // UPDATE func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { + var ( + cmd boba.Cmd + cmds []boba.Cmd + ) + switch msg := msg.(type) { case boba.KeyMsg: @@ -111,7 +120,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case "j": fallthrough case "down": - m.index = min(len(m.documents)-1, m.index+1) + m.index = min(m.paginator.PerPage-1, m.index+1) return m, nil case "enter": @@ -125,24 +134,26 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case stashErrMsg: m.err = msg - return m, nil case gotStashMsg: sort.Sort(charm.MarkdownsByCreatedAt(msg)) // sort by date m.documents = append(m.documents, msg...) m.state = stashStateLoaded m.paginator.SetTotalPages(len(m.documents)) - return m, nil case stashSpinnerTickMsg: if m.state == stashStateInit || m.state == stashStateLoadingItem { - var cmd boba.Cmd m.spinner, cmd = spinner.Update(msg, m.spinner) return m, cmd } } - return m, nil + if m.state == stashStateLoaded { + m.paginator, cmd = paginator.Update(msg, m.paginator) + cmds = append(cmds, cmd) + } + + return m, boba.Batch(cmds...) } // VIEW @@ -168,7 +179,10 @@ func stashView(m stashModel) string { blankLines = strings.Repeat("\n", numBlankLines) } - s += stashPopulatedView(m) + blankLines + helpView(m) + s += fmt.Sprintf( + "Here’s your markdown stash:\n\n%s\n\n%s%s\n\n%s", + stashPopulatedView(m), blankLines, paginator.View(m.paginator), helpView(m), + ) } return "\n" + indent.String(s, 2) } @@ -178,10 +192,11 @@ func stashEmtpyView(m stashModel) string { } func stashPopulatedView(m stashModel) string { + var s string + start, end := m.paginator.GetSliceBounds(len(m.documents)) docs := m.documents[start:end] - s := "Here's your markdown stash:\n\n" for i, v := range docs { state := common.StateNormal if i == m.index { @@ -189,7 +204,18 @@ func stashPopulatedView(m stashModel) string { } s += stashListItemView(*v).render(state) + "\n\n" } - return strings.TrimSpace(s) + s = strings.TrimSpace(s) // trim final newlines + + // If there aren't enough items to fill up this page (always the last page) + // then we need to add some newlines to fill up the space to push the + // footer stuff down elsewhere. + itemsOnPage := m.paginator.ItemsOnPage(len(m.documents)) + if itemsOnPage < m.paginator.PerPage { + n := (m.paginator.PerPage - itemsOnPage) * itemHeight + s += strings.Repeat("\n", n) + } + + return s } func helpView(m stashModel) string { From f3a91f0a40ea7c94c5b95625794191475d60bd76 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 14 May 2020 20:57:24 -0400 Subject: [PATCH 218/911] For now, keep selection within current page --- ui/stash.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index c619c4e..7b10661 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -120,7 +120,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case "j": fallthrough case "down": - m.index = min(m.paginator.PerPage-1, m.index+1) + m.index = min(m.paginator.ItemsOnPage(len(m.documents))-1, m.index+1) return m, nil case "enter": From 7ea79793d7c2e713eef8920bbfc7eaa42b3aecae Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 14 May 2020 21:12:13 -0400 Subject: [PATCH 219/911] Add Glow "logo" to stash browser --- ui/stash.go | 10 +++++++--- ui/ui.go | 12 ++++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 7b10661..a2ecf64 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -17,7 +17,7 @@ import ( const ( itemHeight = 3 - topPadding = 3 + topPadding = 5 bottomPadding = 4 ) @@ -180,8 +180,12 @@ func stashView(m stashModel) string { } s += fmt.Sprintf( - "Here’s your markdown stash:\n\n%s\n\n%s%s\n\n%s", - stashPopulatedView(m), blankLines, paginator.View(m.paginator), helpView(m), + "%s\n\nHere’s your markdown stash.\n\n%s\n\n%s%s\n\n%s", + glowLogoView(" Glow "), + stashPopulatedView(m), + blankLines, + paginator.View(m.paginator), + helpView(m), ) } return "\n" + indent.String(s, 2) diff --git a/ui/ui.go b/ui/ui.go index aae38d8..40fb503 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -263,14 +263,18 @@ func view(mdl boba.Model) string { return "\n" + indent.String(s, 2) } -func statusBarView(m model) string { - // Logo - logoText := " Glow " - logo := te.String(logoText). +func glowLogoView(text string) string { + return te.String(text). Bold(). Foreground(glowLogoTextColor). Background(common.Fuschia.Color()). String() +} + +func statusBarView(m model) string { + // Logo + logoText := " Glow " + logo := glowLogoView(logoText) // Note noteText := m.docNote From 8bb2812a6b61cb14fe7bd6f93df7dd71851b90af Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 14 May 2020 22:48:38 -0400 Subject: [PATCH 220/911] Keep page in bounds after resetting terminal size --- ui/stash.go | 6 ++++++ ui/ui.go | 2 ++ 2 files changed, 8 insertions(+) diff --git a/ui/stash.go b/ui/stash.go index a2ecf64..41b6d18 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -66,6 +66,12 @@ func (m *stashModel) SetSize(width, height int) { // Update the paginator perPage := (m.terminalHeight - topPadding - bottomPadding) / itemHeight m.paginator.PerPage = perPage + m.paginator.SetTotalPages(len(m.documents)) + + // Make sure the page stays in bounds + if m.paginator.Page >= m.paginator.TotalPages-1 { + m.paginator.Page = m.paginator.TotalPages - 1 + } } // INIT diff --git a/ui/ui.go b/ui/ui.go index 40fb503..f43c64a 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -151,6 +151,8 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { m.terminalWidth = w m.terminalHeight = h m.stash.SetSize(w, h) + // TODO: load more stash pages if we've resized, are on the last page, + // and haven't loaded more pages yet. return m, nil case sshAuthErrMsg: From 5d2ca090accefab8856dd5001d4d8e5cf0f2c72f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 May 2020 13:09:46 -0400 Subject: [PATCH 221/911] Pass style argument to the Boba program --- main.go | 34 +++++++++++++++++++--------------- ui/ui.go | 40 ++++++++++++++++++++++------------------ 2 files changed, 41 insertions(+), 33 deletions(-) diff --git a/main.go b/main.go index 2b52b04..13c2d71 100644 --- a/main.go +++ b/main.go @@ -151,21 +151,7 @@ func execute(cmd *cobra.Command, args []string) error { validateOptions(cmd) if len(args) == 0 { - //return executeArg(cmd, "", os.Stdout) - - debug := os.Getenv("GLOW_DEBUG") - if debug != "" { - boba.UseSysLog("glow") - } - - boba.AltScreen() - if err := ui.NewProgram().Start(); err != nil { - return err - } - boba.ExitAltScreen() - - fmt.Printf("\n Thanks for using Glow!\n\n") - return nil + return executeArg(cmd, "", os.Stdout) } for _, arg := range args { @@ -177,6 +163,24 @@ func execute(cmd *cobra.Command, args []string) error { } func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { + + // TODO: Put this somewhere where it makes more sense + if arg == "" { + debug := os.Getenv("GLOW_DEBUG") + if debug != "" { + boba.UseSysLog("glow") + } + + boba.AltScreen() + if err := ui.NewProgram(style).Start(); err != nil { + return err + } + boba.ExitAltScreen() + + fmt.Printf("\n Thanks for using Glow!\n\n") + return nil + } + // create an io.Reader from the markdown source in cli-args src, err := sourceFromArg(arg) if err != nil { diff --git a/ui/ui.go b/ui/ui.go index f43c64a..9d2ece8 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -28,8 +28,8 @@ var ( ) // NewProgram returns a new Boba program -func NewProgram() *boba.Program { - return boba.NewProgram(initialize, update, view) +func NewProgram(style string) *boba.Program { + return boba.NewProgram(initialize(style), update, view) } // MESSAGES @@ -61,6 +61,7 @@ const ( ) type model struct { + style string // style to use cc *charm.Client user *charm.User spinner spinner.Model @@ -82,24 +83,27 @@ func (m *model) unloadDocument() { // INIT -func initialize() (boba.Model, boba.Cmd) { - s := spinner.NewModel() - s.Type = spinner.Dot - s.ForegroundColor = common.SpinnerColor +func initialize(style string) func() (boba.Model, boba.Cmd) { + return func() (boba.Model, boba.Cmd) { + s := spinner.NewModel() + s.Type = spinner.Dot + s.ForegroundColor = common.SpinnerColor - w, h, err := terminal.GetSize(int(os.Stdout.Fd())) + w, h, err := terminal.GetSize(int(os.Stdout.Fd())) - return model{ - spinner: s, - state: stateInitCharmClient, - err: err, - terminalWidth: w, - terminalHeight: h, - }, boba.Batch( - newCharmClient, - spinner.Tick(s), - getTerminalSize(), - ) + return model{ + style: style, + spinner: s, + state: stateInitCharmClient, + err: err, + terminalWidth: w, + terminalHeight: h, + }, boba.Batch( + newCharmClient, + spinner.Tick(s), + getTerminalSize(), + ) + } } // UPDATE From 8ba5c1fa0dc3b285004f1298f01a34a95aededd8 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 May 2020 13:25:12 -0400 Subject: [PATCH 222/911] Spilling over top/bottom in stash browser goes to the prev/next page --- ui/stash.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 41b6d18..dd03949 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -120,13 +120,30 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case "k": fallthrough case "up": - m.index = max(0, m.index-1) + m.index-- + if m.index < 0 && m.paginator.Page == 0 { + // Stop + m.index = 0 + } else if m.index < 0 { + // Go to previous page + m.paginator.PrevPage() + m.index = m.paginator.ItemsOnPage(len(m.documents)) - 1 + } return m, nil case "j": fallthrough case "down": - m.index = min(m.paginator.ItemsOnPage(len(m.documents))-1, m.index+1) + itemsOnPage := m.paginator.ItemsOnPage(len(m.documents)) + m.index++ + if m.index >= itemsOnPage && m.paginator.OnLastPage() { + // Stop + m.index = itemsOnPage - 1 + } else if m.index >= itemsOnPage { + // Go to next page + m.index = 0 + m.paginator.NextPage() + } return m, nil case "enter": From c622816a437c67440e778c8e0b15e34f4a7f9548 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 May 2020 13:42:33 -0400 Subject: [PATCH 223/911] Load selected item from stash into the pager --- ui/stash.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index dd03949..2c89469 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -148,8 +148,9 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case "enter": m.state = stashStateLoadingItem + indexToLoad := m.paginator.Page*m.paginator.PerPage + m.index return m, boba.Batch( - loadStashedItem(m.cc, m.documents[m.index].ID), + loadStashedItem(m.cc, m.documents[indexToLoad].ID), spinner.Tick(m.spinner), ) From f5df6888604c0a7f318be269fae536856f99edcf Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 May 2020 15:08:45 -0400 Subject: [PATCH 224/911] Render with glamour asyncronously --- ui/stash.go | 22 ++++++++------ ui/ui.go | 83 ++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 90 insertions(+), 15 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 2c89469..4ef6b9e 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -34,8 +34,8 @@ type stashState int const ( stashStateInit stashState = iota - stashStateLoaded - stashStateLoadingItem + stashStateStashLoaded + stashStateLoadingDocument ) type stashModel struct { @@ -147,7 +147,9 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { return m, nil case "enter": - m.state = stashStateLoadingItem + // Load the document from the server. We'll handle the message + // that comes back in the main update function. + m.state = stashStateLoadingDocument indexToLoad := m.paginator.Page*m.paginator.PerPage + m.index return m, boba.Batch( loadStashedItem(m.cc, m.documents[indexToLoad].ID), @@ -162,17 +164,17 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case gotStashMsg: sort.Sort(charm.MarkdownsByCreatedAt(msg)) // sort by date m.documents = append(m.documents, msg...) - m.state = stashStateLoaded + m.state = stashStateStashLoaded m.paginator.SetTotalPages(len(m.documents)) case stashSpinnerTickMsg: - if m.state == stashStateInit || m.state == stashStateLoadingItem { + if m.state == stashStateInit || m.state == stashStateLoadingDocument { m.spinner, cmd = spinner.Update(msg, m.spinner) return m, cmd } } - if m.state == stashStateLoaded { + if m.state == stashStateStashLoaded { m.paginator, cmd = paginator.Update(msg, m.paginator) cmds = append(cmds, cmd) } @@ -183,13 +185,17 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { // VIEW func stashView(m stashModel) string { + if m.err != nil { + return "\n" + m.err.Error() + } + var s string switch m.state { case stashStateInit: s += spinner.View(m.spinner) + " Loading stash..." - case stashStateLoadingItem: + case stashStateLoadingDocument: s += spinner.View(m.spinner) + " Loading document..." - case stashStateLoaded: + case stashStateStashLoaded: if len(m.documents) == 0 { s += stashEmtpyView(m) break diff --git a/ui/ui.go b/ui/ui.go index 9d2ece8..6f041bf 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -12,6 +12,7 @@ import ( "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/charm/ui/keygen" + "github.com/charmbracelet/glamour" "github.com/muesli/reflow/indent" te "github.com/muesli/termenv" "golang.org/x/crypto/ssh/terminal" @@ -38,6 +39,7 @@ type fatalErrMsg error type errMsg error type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} +type contentRenderedMsg string type terminalSizeMsg struct { width int @@ -78,7 +80,7 @@ type model struct { func (m *model) unloadDocument() { m.pager = pager.Model{} m.state = stateShowStash - m.stash.state = stashStateLoaded + m.stash.state = stashStateStashLoaded } // INIT @@ -196,18 +198,34 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { return m, cmd case gotStashedItemMsg: - // TODO: there's a (unlikely) potential race condition that could - // happen here where we start the pager before we have received the - // terminal size. We could solve this in a few ways, including by - // getting the terminal size imperatively and synchronously - m.state = stateShowDocument + // We've received stashed item data. Render with Glamour and send to + // the pager. + //m.state = stateShowDocument m.pager = pager.NewModel( m.terminalWidth, m.terminalHeight-statusBarHeight, ) m.docNote = msg.Note - m.pager.Content(msg.Body) + + // This could happen asyncronously with a Cmd since there's techincally + // IO happening, but since rendering is fast and Go is an imperative + // language I guess it's fine to just render synchronously here. + /* + md, err := glamourRender(m, msg.Body) + if err != nil { + m.err = err + return m, nil + } + */ + + //m.pager.SetContent(md) + return m, renderWithGlamour(m, msg.Body) + + case contentRenderedMsg: + m.state = stateShowDocument + m.pager.SetContent(string(msg)) return m, nil + } switch m.state { @@ -227,6 +245,7 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { return m, cmd case stateShowDocument: + // Process keys (and eventually mouse) with pager.Update newPagerModel, cmd := pager.Update(msg, boba.Model(m.pager)) newPagerModel_, ok := newPagerModel.(pager.Model) if !ok { @@ -329,8 +348,58 @@ func newCharmClient() boba.Msg { return newCharmClientMsg(cc) } +func renderWithGlamour(m model, md string) boba.Cmd { + return func() boba.Msg { + s, err := glamourRender(m, md) + if err != nil { + return errMsg(err) + } + return contentRenderedMsg(s) + } +} + // ETC +// This is where the magic happens +func glamourRender(m model, markdown string) (string, error) { + + // initialize glamour + var gs glamour.TermRendererOption + if m.style == "auto" { + gs = glamour.WithAutoStyle() + } else { + gs = glamour.WithStylePath(m.style) + } + + r, err := glamour.NewTermRenderer( + gs, + glamour.WithWordWrap(m.terminalWidth), + ) + if err != nil { + return "", err + } + + out, err := r.Render(markdown) + if err != nil { + return "", err + } + + // trim lines + lines := strings.Split(string(out), "\n") + + var content string + for i, s := range lines { + content += strings.TrimSpace(s) + + // don't add an artificial newline after the last split + if i+1 < len(lines) { + content += "\n" + } + } + + return content, nil +} + func min(a, b int) int { if a < b { return a From 1f4970e25b0a09689fc693ef2b920babe2c183e1 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 May 2020 16:22:30 -0400 Subject: [PATCH 225/911] Update for simpler pager library --- ui/ui.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 6f041bf..2853521 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -201,10 +201,12 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { // We've received stashed item data. Render with Glamour and send to // the pager. //m.state = stateShowDocument + m.pager = pager.NewModel( m.terminalWidth, m.terminalHeight-statusBarHeight, ) + m.docNote = msg.Note // This could happen asyncronously with a Cmd since there's techincally @@ -246,13 +248,8 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case stateShowDocument: // Process keys (and eventually mouse) with pager.Update - newPagerModel, cmd := pager.Update(msg, boba.Model(m.pager)) - newPagerModel_, ok := newPagerModel.(pager.Model) - if !ok { - m.err = errors.New("could not assert boba.Model to pager.Model in main update") - return m, nil - } - m.pager = newPagerModel_ + var cmd boba.Cmd + m.pager, cmd = pager.Update(msg, m.pager) return m, cmd } From 211e66c7385a17350dc8fd8ea7235175bdda63ac Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 May 2020 16:27:08 -0400 Subject: [PATCH 226/911] Update Charm and Boba libraries --- go.mod | 10 +++------- go.sum | 11 ++++++----- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 00ee7fa..0a090ee 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/boba v0.5.0 - github.com/charmbracelet/charm v0.3.0 + github.com/charmbracelet/boba v0.5.1 + github.com/charmbracelet/charm v0.3.1 github.com/charmbracelet/glamour v0.2.0 github.com/charmbracelet/tea v0.3.0 github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d @@ -14,9 +14,5 @@ require ( github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect - golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c + golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 ) - -replace github.com/charmbracelet/charm => ../charm - -replace github.com/charmbracelet/boba => ../boba diff --git a/go.sum b/go.sum index c2512ce..b8716ce 100644 --- a/go.sum +++ b/go.sum @@ -15,10 +15,11 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/boba v0.5.0 h1:H+4m+yI1aHoE/o0ncrFQpgV2tY49MdzcLsOqethsuDs= github.com/charmbracelet/boba v0.5.0/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= -github.com/charmbracelet/charm v0.3.0 h1:njtvry/gqxUlFyVJ0+VbClcyf6g7mK6RddwT21mJoSA= -github.com/charmbracelet/charm v0.3.0/go.mod h1:bZQON+c4uV9mgbZBvKzH7wA1zGII9Zfg26cL70NYdH0= +github.com/charmbracelet/boba v0.5.1 h1:vC+2NPZM4ccoRHKzRhvzXNJaACN/EtAn1yQ0VSYGQ+w= +github.com/charmbracelet/boba v0.5.1/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= +github.com/charmbracelet/charm v0.3.1 h1:5cuEcfl8yUdKKJDFoYyZvr6emdRvrIzPBf8zCwwjCdM= +github.com/charmbracelet/charm v0.3.1/go.mod h1:bZQON+c4uV9mgbZBvKzH7wA1zGII9Zfg26cL70NYdH0= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= github.com/charmbracelet/tea v0.2.0/go.mod h1:lADjwO2mMub9qvXSCA9vAkabVWO0HeUrv4uO/lG3C+k= @@ -175,8 +176,8 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200430202703-d923437fa56d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c h1:kISX68E8gSkNYAFRFiDU8rl5RIn1sJYKYb/r2vMLDrU= -golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 h1:YTzHMGlqJu67/uEo1lBv0n3wBXhXNeUbB1XfN2vmTm0= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 531645e73ee5835ba4dc03566af6edaae735453f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 May 2020 17:31:43 -0400 Subject: [PATCH 227/911] Keep selection in-bounds when paginating --- ui/stash.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ui/stash.go b/ui/stash.go index 4ef6b9e..c491226 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -177,6 +177,12 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { if m.state == stashStateStashLoaded { m.paginator, cmd = paginator.Update(msg, m.paginator) cmds = append(cmds, cmd) + + // Keep the index in bounds when paginating + itemsOnPage := m.paginator.ItemsOnPage(len(m.documents)) + if m.index > itemsOnPage-1 { + m.index = itemsOnPage - 1 + } } return m, boba.Batch(cmds...) From e500ed695efca14161bcc6d34054b9c7cb125d7c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 May 2020 18:34:42 -0400 Subject: [PATCH 228/911] Add stash item deletion functionality --- ui/stash.go | 91 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 78 insertions(+), 13 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index c491226..785f43b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -27,6 +27,7 @@ type stashErrMsg error type stashSpinnerTickMsg struct{} type gotStashMsg []*charm.Markdown type gotStashedItemMsg *charm.Markdown +type deletedStashedItemMsg int // MODEL @@ -35,6 +36,7 @@ type stashState int const ( stashStateInit stashState = iota stashStateStashLoaded + stashStatePromptDelete stashStateLoadingDocument ) @@ -47,6 +49,7 @@ type stashModel struct { index int terminalWidth int terminalHeight int + confirmDelete int // This handles the local pagination, which is different than the page // we're fetching from on the server side @@ -129,7 +132,6 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { m.paginator.PrevPage() m.index = m.paginator.ItemsOnPage(len(m.documents)) - 1 } - return m, nil case "j": fallthrough @@ -144,18 +146,47 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { m.index = 0 m.paginator.NextPage() } - return m, nil case "enter": // Load the document from the server. We'll handle the message // that comes back in the main update function. m.state = stashStateLoadingDocument indexToLoad := m.paginator.Page*m.paginator.PerPage + m.index - return m, boba.Batch( + cmds = append(cmds, loadStashedItem(m.cc, m.documents[indexToLoad].ID), spinner.Tick(m.spinner), ) + case "x": + // Confirm deletion + m.state = stashStatePromptDelete + + case "y": + if m.state != stashStatePromptDelete { + break + } + // Deletion confirmed. Delete the stashed item. + + // Index of the documents slice we'll be deleting + i := m.paginator.Page*m.paginator.PerPage + m.index + + // ID of the item we'll be deleting + id := m.documents[i].ID + + // Delete optimistically and remove the stashed item + // before we've received a success response. + m.documents = append(m.documents[:i], m.documents[i+1:]...) + + // Update pagination + m.paginator.SetTotalPages(len(m.documents)) + m.paginator.Page = min(m.paginator.Page, m.paginator.TotalPages-1) + + // Set state and delete + m.state = stashStateStashLoaded + return m, deleteStashedItem(m.cc, id) + + case "n": + m.confirmDelete = -1 } case stashErrMsg: @@ -170,7 +201,6 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case stashSpinnerTickMsg: if m.state == stashStateInit || m.state == stashStateLoadingDocument { m.spinner, cmd = spinner.Update(msg, m.spinner) - return m, cmd } } @@ -185,6 +215,13 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { } } + // If an item is being confirmed for delete, any key (other than the key + // used for confirmation above) cancels the deletion + k, ok := msg.(boba.KeyMsg) + if ok && k.String() != "x" && m.state == stashStatePromptDelete { + m.state = stashStateStashLoaded + } + return m, boba.Batch(cmds...) } @@ -202,6 +239,8 @@ func stashView(m stashModel) string { case stashStateLoadingDocument: s += spinner.View(m.spinner) + " Loading document..." case stashStateStashLoaded: + fallthrough + case stashStatePromptDelete: if len(m.documents) == 0 { s += stashEmtpyView(m) break @@ -215,9 +254,18 @@ func stashView(m stashModel) string { blankLines = strings.Repeat("\n", numBlankLines) } + var header string + if m.state == stashStatePromptDelete { + header = te.String("Delete this item? ").Foreground(common.Red.Color()).String() + + te.String("(y/N)").Foreground(common.FaintRed.Color()).String() + } else { + header = "Here’s your markdown stash:" + } + s += fmt.Sprintf( - "%s\n\nHere’s your markdown stash.\n\n%s\n\n%s%s\n\n%s", + "%s\n\n%s\n\n%s\n\n%s%s\n\n%s", glowLogoView(" Glow "), + header, stashPopulatedView(m), blankLines, paginator.View(m.paginator), @@ -239,7 +287,9 @@ func stashPopulatedView(m stashModel) string { for i, v := range docs { state := common.StateNormal - if i == m.index { + if i == m.index && m.state == stashStatePromptDelete { + state = common.StateDeleting + } else if i == m.index { state = common.StateSelected } s += stashListItemView(*v).render(state) + "\n\n" @@ -259,14 +309,19 @@ func stashPopulatedView(m stashModel) string { } func helpView(m stashModel) string { - h := []string{"enter: open"} - if len(m.documents) > 0 { - h = append(h, "j/k, ↑/↓: choose") + h := []string{} + if m.state == stashStatePromptDelete { + h = append(h, "y: delete", "n: cancel") + } else { + h = append(h, "enter: open") + if len(m.documents) > 0 { + h = append(h, "j/k, ↑/↓: choose") + } + if m.paginator.TotalPages > 1 { + h = append(h, "h/l, ←/→: page") + } + h = append(h, []string{"x: delete", "esc: exit"}...) } - if m.paginator.TotalPages > 1 { - h = append(h, "h/l, ←/→: page") - } - h = append(h, []string{"x: delete", "esc: exit"}...) return common.HelpView(h...) } @@ -334,3 +389,13 @@ func loadStashedItem(cc *charm.Client, id int) boba.Cmd { return gotStashedItemMsg(m) } } + +func deleteStashedItem(cc *charm.Client, id int) boba.Cmd { + return func() boba.Msg { + err := cc.DeleteMarkdown(id) + if err != nil { + return stashErrMsg(err) + } + return deletedStashedItemMsg(id) + } +} From d0542b6d25ec6aa3286a129664ec7123fea04cd3 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 May 2020 18:39:23 -0400 Subject: [PATCH 229/911] Fix stash spinner --- ui/stash.go | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/stash.go b/ui/stash.go index 785f43b..a540b6c 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -201,6 +201,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case stashSpinnerTickMsg: if m.state == stashStateInit || m.state == stashStateLoadingDocument { m.spinner, cmd = spinner.Update(msg, m.spinner) + cmds = append(cmds, cmd) } } From 198a785ac4300f89112d1402ca0511b7ff8d300b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 May 2020 18:44:22 -0400 Subject: [PATCH 230/911] Don't show the paginator if there's only one page --- ui/stash.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index a540b6c..242b908 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -263,13 +263,18 @@ func stashView(m stashModel) string { header = "Here’s your markdown stash:" } + var pageView string + if m.paginator.TotalPages > 1 { + pageView = paginator.View(m.paginator) + } + s += fmt.Sprintf( "%s\n\n%s\n\n%s\n\n%s%s\n\n%s", glowLogoView(" Glow "), header, stashPopulatedView(m), blankLines, - paginator.View(m.paginator), + pageView, helpView(m), ) } From 7a8a1f7aff58c898c5896a27c9f07fbfebc9fe0e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 May 2020 19:16:22 -0400 Subject: [PATCH 231/911] Load more pages, if any, when the user reaches the last page --- ui/stash.go | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 242b908..369704b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -49,7 +49,8 @@ type stashModel struct { index int terminalWidth int terminalHeight int - confirmDelete int + loading bool // are we currently loading something? + fullyLoaded bool // Have we loaded everything from the server? // This handles the local pagination, which is different than the page // we're fetching from on the server side @@ -185,14 +186,21 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { m.state = stashStateStashLoaded return m, deleteStashedItem(m.cc, id) - case "n": - m.confirmDelete = -1 } case stashErrMsg: m.err = msg case gotStashMsg: + // Stash results have come in from the server + m.loading = false + + if len(msg) == 0 { + // If the server comes back with nothing then we've got everything + m.fullyLoaded = true + break + } + sort.Sort(charm.MarkdownsByCreatedAt(msg)) // sort by date m.documents = append(m.documents, msg...) m.state = stashStateStashLoaded @@ -206,6 +214,8 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { } if m.state == stashStateStashLoaded { + + // Update paginator m.paginator, cmd = paginator.Update(msg, m.paginator) cmds = append(cmds, cmd) @@ -214,6 +224,15 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { if m.index > itemsOnPage-1 { m.index = itemsOnPage - 1 } + + // If we're on the last page and we haven't loaded everything, get + // more stuff. + if m.paginator.OnLastPage() && !m.loading && !m.fullyLoaded { + m.page++ + m.loading = true + cmds = append(cmds, loadStash(m)) + } + } // If an item is being confirmed for delete, any key (other than the key @@ -263,9 +282,13 @@ func stashView(m stashModel) string { header = "Here’s your markdown stash:" } - var pageView string + var pagination string if m.paginator.TotalPages > 1 { - pageView = paginator.View(m.paginator) + pagination = paginator.View(m.paginator) + + if !m.fullyLoaded { + pagination += common.Subtle("···") + } } s += fmt.Sprintf( @@ -274,7 +297,7 @@ func stashView(m stashModel) string { header, stashPopulatedView(m), blankLines, - pageView, + pagination, helpView(m), ) } From d06f4914b9d872d10c3b8dc62c70efd43ab58b82 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 May 2020 19:47:34 -0400 Subject: [PATCH 232/911] Add GLOW_DISABLE_GLAMOUR in the env for testing --- ui/ui.go | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 2853521..9237ca5 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -200,27 +200,12 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case gotStashedItemMsg: // We've received stashed item data. Render with Glamour and send to // the pager. - //m.state = stateShowDocument - m.pager = pager.NewModel( m.terminalWidth, m.terminalHeight-statusBarHeight, ) m.docNote = msg.Note - - // This could happen asyncronously with a Cmd since there's techincally - // IO happening, but since rendering is fast and Go is an imperative - // language I guess it's fine to just render synchronously here. - /* - md, err := glamourRender(m, msg.Body) - if err != nil { - m.err = err - return m, nil - } - */ - - //m.pager.SetContent(md) return m, renderWithGlamour(m, msg.Body) case contentRenderedMsg: @@ -360,6 +345,10 @@ func renderWithGlamour(m model, md string) boba.Cmd { // This is where the magic happens func glamourRender(m model, markdown string) (string, error) { + if os.Getenv("GLOW_DISABLE_GLAMOUR") != "" { + return markdown, nil + } + // initialize glamour var gs glamour.TermRendererOption if m.style == "auto" { From f00e5ccdba5d865cf78bdfed8bfe30965cba12f7 Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Sat, 16 May 2020 13:45:32 -0500 Subject: [PATCH 233/911] Only do the dark background check once --- ui/ui.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ui/ui.go b/ui/ui.go index 9237ca5..811c12c 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -93,6 +93,15 @@ func initialize(style string) func() (boba.Model, boba.Cmd) { w, h, err := terminal.GetSize(int(os.Stdout.Fd())) + if style == "auto" { + dbg := te.HasDarkBackground() + if dbg == true { + style = "dark" + } else { + style = "light" + } + } + return model{ style: style, spinner: s, From 131685b5f2a8691e81709ddca56544278e6f8fae Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 18 May 2020 14:37:50 -0400 Subject: [PATCH 234/911] Clearer const names for stash view stuff --- ui/stash.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 369704b..f661c19 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -16,9 +16,10 @@ import ( ) const ( - itemHeight = 3 - topPadding = 5 - bottomPadding = 4 + stashViewItemHeight = 3 + stashViewTopPadding = 5 + stashViewBottomPadding = 4 + stashHorizontalPadding = 2 ) // MSG @@ -68,7 +69,7 @@ func (m *stashModel) SetSize(width, height int) { m.terminalHeight = height // Update the paginator - perPage := (m.terminalHeight - topPadding - bottomPadding) / itemHeight + perPage := (m.terminalHeight - stashViewTopPadding - stashViewBottomPadding) / stashViewItemHeight m.paginator.PerPage = perPage m.paginator.SetTotalPages(len(m.documents)) @@ -268,7 +269,7 @@ func stashView(m stashModel) string { // Blank lines we'll need to fill with newlines fo the viewport is // properly filled - numBlankLines := (m.terminalHeight - topPadding - bottomPadding) % itemHeight + numBlankLines := (m.terminalHeight - stashViewTopPadding - stashViewBottomPadding) % stashViewItemHeight blankLines := "" if numBlankLines > 0 { blankLines = strings.Repeat("\n", numBlankLines) @@ -330,7 +331,7 @@ func stashPopulatedView(m stashModel) string { // footer stuff down elsewhere. itemsOnPage := m.paginator.ItemsOnPage(len(m.documents)) if itemsOnPage < m.paginator.PerPage { - n := (m.paginator.PerPage - itemsOnPage) * itemHeight + n := (m.paginator.PerPage - itemsOnPage) * stashViewItemHeight s += strings.Repeat("\n", n) } From e685dea17aa3231c0b2cdb373ac78bb94655fbf2 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 18 May 2020 15:00:44 -0400 Subject: [PATCH 235/911] Don't query for terminal dimensions when starting up --- ui/ui.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 811c12c..0c8b452 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -15,7 +15,6 @@ import ( "github.com/charmbracelet/glamour" "github.com/muesli/reflow/indent" te "github.com/muesli/termenv" - "golang.org/x/crypto/ssh/terminal" ) const ( @@ -91,8 +90,6 @@ func initialize(style string) func() (boba.Model, boba.Cmd) { s.Type = spinner.Dot s.ForegroundColor = common.SpinnerColor - w, h, err := terminal.GetSize(int(os.Stdout.Fd())) - if style == "auto" { dbg := te.HasDarkBackground() if dbg == true { @@ -103,12 +100,9 @@ func initialize(style string) func() (boba.Model, boba.Cmd) { } return model{ - style: style, - spinner: s, - state: stateInitCharmClient, - err: err, - terminalWidth: w, - terminalHeight: h, + style: style, + spinner: s, + state: stateInitCharmClient, }, boba.Batch( newCharmClient, spinner.Tick(s), From df0a3ba21c73275c4590b2997df31f12bf2590f7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 18 May 2020 16:08:49 -0400 Subject: [PATCH 236/911] Truncate long memos in stash --- ui/stash.go | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index f661c19..e843452 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -19,7 +19,7 @@ const ( stashViewItemHeight = 3 stashViewTopPadding = 5 stashViewBottomPadding = 4 - stashHorizontalPadding = 2 + stashHorizontalPadding = 6 ) // MSG @@ -267,7 +267,7 @@ func stashView(m stashModel) string { break } - // Blank lines we'll need to fill with newlines fo the viewport is + // Blank lines we'll need to fill with newlines if the viewport is // properly filled numBlankLines := (m.terminalHeight - stashViewTopPadding - stashViewBottomPadding) % stashViewItemHeight blankLines := "" @@ -322,7 +322,7 @@ func stashPopulatedView(m stashModel) string { } else if i == m.index { state = common.StateSelected } - s += stashListItemView(*v).render(state) + "\n\n" + s += stashListItemView(*v).render(m.terminalWidth, state) + "\n\n" } s = strings.TrimSpace(s) // trim final newlines @@ -357,8 +357,10 @@ func helpView(m stashModel) string { type stashListItemView charm.Markdown -func (m stashListItemView) render(state common.State) string { +func (m stashListItemView) render(width int, state common.State) string { + line := common.VerticalLine(state) + " " + keyColor := common.NoColor switch state { case common.StateSelected: @@ -366,15 +368,22 @@ func (m stashListItemView) render(state common.State) string { case common.StateDeleting: keyColor = common.Red } + titleKey := strconv.Itoa(m.ID) if m.Note != "" { titleKey += ":" } + + titleVal := truncate(m.Note, width-(stashHorizontalPadding*2)-len(titleKey)) + titleVal = titleView(titleVal, state) + titleKey = te.String("#" + titleKey).Foreground(keyColor.Color()).String() dateKey := te.String("Stashed:").Foreground(keyColor.Color()).String() + dateVal := m.date(state) + var s string - s += fmt.Sprintf("%s%s %s\n", line, titleKey, m.title(state)) - s += fmt.Sprintf("%s%s %s", line, dateKey, m.date(state)) + s += fmt.Sprintf("%s%s %s\n", line, titleKey, titleVal) + s += fmt.Sprintf("%s%s %s", line, dateKey, dateVal) return s } @@ -387,15 +396,15 @@ func (m stashListItemView) date(state common.State) string { return te.String(s).Foreground(c.Color()).String() } -func (m stashListItemView) title(state common.State) string { - if m.Note == "" { +func titleView(title string, state common.State) string { + if title == "" { return "" } c := common.Indigo if state == common.StateDeleting { c = common.Red } - return te.String(m.Note).Foreground(c.Color()).String() + return te.String(title).Foreground(c.Color()).String() } // CMD @@ -429,3 +438,16 @@ func deleteStashedItem(cc *charm.Client, id int) boba.Cmd { return deletedStashedItemMsg(id) } } + +// ETC + +func truncate(str string, num int) string { + s := str + if len(str) > num { + if num > 1 { + num -= 1 + } + s = str[0:num] + "…" + } + return s +} From 95fe84ebb42a3b46fdc5128b7e9d661c97d5d833 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 18 May 2020 17:31:10 -0400 Subject: [PATCH 237/911] Truncate long memo title in pager + fix associated panic --- ui/ui.go | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 0c8b452..432fae4 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -286,16 +286,6 @@ func statusBarView(m model) string { logoText := " Glow " logo := glowLogoView(logoText) - // Note - noteText := m.docNote - if len(noteText) == 0 { - noteText = "(No title)" - } - noteText = " " + noteText - note := te.String(noteText). - Foreground(statusBarFg.Color()). - Background(statusBarBg.Color()).String() - // Scroll percent percentText := fmt.Sprintf(" %3.f%% ", m.pager.ScrollPercent()*100) percent := te.String(percentText). @@ -303,9 +293,20 @@ func statusBarView(m model) string { Background(statusBarBg.Color()). String() + // Note + noteText := m.docNote + if len(noteText) == 0 { + noteText = "(No title)" + } + noteText = truncate(" "+noteText+" ", max(0, m.terminalWidth-len(logoText)-len(percentText))) + note := te.String(noteText). + Foreground(statusBarFg.Color()). + Background(statusBarBg.Color()).String() + // Empty space emptyCell := te.String(" ").Background(statusBarBg.Color()).String() - emptySpace := strings.Repeat(emptyCell, m.terminalWidth-len(logoText)-len(noteText)-len(percentText)) + padding := max(0, m.terminalWidth-len(logoText)-len(noteText)-len(percentText)) + emptySpace := strings.Repeat(emptyCell, padding) return logo + note + emptySpace + percent } From 883fda2b065e94ebd6871280744d30774a29e3f9 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 18 May 2020 17:53:46 -0400 Subject: [PATCH 238/911] Repaint on terminal resize --- go.mod | 4 ++-- go.sum | 8 ++++---- ui/ui.go | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 0a090ee..5c1c988 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/boba v0.5.1 - github.com/charmbracelet/charm v0.3.1 + github.com/charmbracelet/boba v0.6.0 + github.com/charmbracelet/charm v0.4.0 github.com/charmbracelet/glamour v0.2.0 github.com/charmbracelet/tea v0.3.0 github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d diff --git a/go.sum b/go.sum index b8716ce..2e2e5ba 100644 --- a/go.sum +++ b/go.sum @@ -16,10 +16,10 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/boba v0.5.0/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= -github.com/charmbracelet/boba v0.5.1 h1:vC+2NPZM4ccoRHKzRhvzXNJaACN/EtAn1yQ0VSYGQ+w= -github.com/charmbracelet/boba v0.5.1/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= -github.com/charmbracelet/charm v0.3.1 h1:5cuEcfl8yUdKKJDFoYyZvr6emdRvrIzPBf8zCwwjCdM= -github.com/charmbracelet/charm v0.3.1/go.mod h1:bZQON+c4uV9mgbZBvKzH7wA1zGII9Zfg26cL70NYdH0= +github.com/charmbracelet/boba v0.6.0 h1:ktCY611UE4ZJ4MS0FS6eCA/jqjJDyfNgFfdDKBgi07g= +github.com/charmbracelet/boba v0.6.0/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= +github.com/charmbracelet/charm v0.4.0 h1:g76242+CxC7fPiOYTmb81q0ehFb2JpUr6yD7bbe/tM4= +github.com/charmbracelet/charm v0.4.0/go.mod h1:bZQON+c4uV9mgbZBvKzH7wA1zGII9Zfg26cL70NYdH0= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= github.com/charmbracelet/tea v0.2.0/go.mod h1:lADjwO2mMub9qvXSCA9vAkabVWO0HeUrv4uO/lG3C+k= diff --git a/ui/ui.go b/ui/ui.go index 432fae4..9adfaae 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -39,6 +39,7 @@ type errMsg error type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} type contentRenderedMsg string +type terminalResizedMsg struct{} type terminalSizeMsg struct { width int @@ -107,6 +108,7 @@ func initialize(style string) func() (boba.Model, boba.Cmd) { newCharmClient, spinner.Tick(s), getTerminalSize(), + listenForTerminalResize(), ) } } @@ -151,6 +153,12 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { m.err = msg return m, nil + case terminalResizedMsg: + return m, boba.Batch( + getTerminalSize(), + listenForTerminalResize(), + ) + case terminalSizeMsg: if msg.Error() != nil { m.err = msg.Error() @@ -312,6 +320,13 @@ func statusBarView(m model) string { } // COMMANDS + +func listenForTerminalResize() boba.Cmd { + return boba.OnResize(func() boba.Msg { + return terminalResizedMsg{} + }) +} + func getTerminalSize() boba.Cmd { return boba.GetTerminalSize(func(w, h int, err error) boba.TerminalSizeMsg { return terminalSizeMsg{width: w, height: h, err: err} From 2a7006949e014bdb9007c4f2f39c46bdf7b86525 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 18 May 2020 18:58:19 -0400 Subject: [PATCH 239/911] Re-render with Glamour terminal resize --- ui/stash.go | 2 +- ui/ui.go | 25 ++++++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index e843452..5b90879 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -288,7 +288,7 @@ func stashView(m stashModel) string { pagination = paginator.View(m.paginator) if !m.fullyLoaded { - pagination += common.Subtle("···") + pagination += common.Subtle(" ···") } } diff --git a/ui/ui.go b/ui/ui.go index 9adfaae..6795020 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -74,13 +74,17 @@ type model struct { pager pager.Model terminalWidth int terminalHeight int - docNote string + + // Current document being rendered, sans-glamour rendering. We cache + // this here so we can re-render it on resize. + currentDocument *charm.Markdown } func (m *model) unloadDocument() { m.pager = pager.Model{} m.state = stateShowStash m.stash.state = stashStateStashLoaded + m.currentDocument = nil } // INIT @@ -168,9 +172,20 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { m.terminalWidth = w m.terminalHeight = h m.stash.SetSize(w, h) + + if m.state == stateShowDocument { + m.pager.Width = w + m.pager.Height = h + } + + var cmd boba.Cmd + if m.state == stateShowDocument { + cmd = renderWithGlamour(m, m.currentDocument.Body) + } + // TODO: load more stash pages if we've resized, are on the last page, // and haven't loaded more pages yet. - return m, nil + return m, cmd case sshAuthErrMsg: // If we haven't run the keygen yet, do that @@ -216,7 +231,7 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { m.terminalHeight-statusBarHeight, ) - m.docNote = msg.Note + m.currentDocument = msg return m, renderWithGlamour(m, msg.Body) case contentRenderedMsg: @@ -302,7 +317,7 @@ func statusBarView(m model) string { String() // Note - noteText := m.docNote + noteText := m.currentDocument.Note if len(noteText) == 0 { noteText = "(No title)" } @@ -378,7 +393,7 @@ func glamourRender(m model, markdown string) (string, error) { r, err := glamour.NewTermRenderer( gs, - glamour.WithWordWrap(m.terminalWidth), + glamour.WithWordWrap(min(120, m.terminalWidth)), ) if err != nil { return "", err From d299ee3365c230482106686fd789c3a64482146c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 18 May 2020 20:10:28 -0400 Subject: [PATCH 240/911] Fix a panic that could happen with very tiny terminal windows --- ui/stash.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 5b90879..69afe9b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -69,13 +69,13 @@ func (m *stashModel) SetSize(width, height int) { m.terminalHeight = height // Update the paginator - perPage := (m.terminalHeight - stashViewTopPadding - stashViewBottomPadding) / stashViewItemHeight + perPage := max(1, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)/stashViewItemHeight) m.paginator.PerPage = perPage m.paginator.SetTotalPages(len(m.documents)) // Make sure the page stays in bounds if m.paginator.Page >= m.paginator.TotalPages-1 { - m.paginator.Page = m.paginator.TotalPages - 1 + m.paginator.Page = max(0, m.paginator.TotalPages-1) } } @@ -269,7 +269,7 @@ func stashView(m stashModel) string { // Blank lines we'll need to fill with newlines if the viewport is // properly filled - numBlankLines := (m.terminalHeight - stashViewTopPadding - stashViewBottomPadding) % stashViewItemHeight + numBlankLines := max(0, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)%stashViewItemHeight) blankLines := "" if numBlankLines > 0 { blankLines = strings.Repeat("\n", numBlankLines) From f43a0271d2a8855c701f6bd8c950143122cff090 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 18 May 2020 20:17:30 -0400 Subject: [PATCH 241/911] Bugfix: scroll percentage could read higher than 100% ater a resize --- ui/ui.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ui/ui.go b/ui/ui.go index 6795020..89869a0 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -310,7 +310,13 @@ func statusBarView(m model) string { logo := glowLogoView(logoText) // Scroll percent - percentText := fmt.Sprintf(" %3.f%% ", m.pager.ScrollPercent()*100) + scrollPercent := m.pager.ScrollPercent() + if scrollPercent > 1.0 { + // Don't let read more than 100%, which could happen if we resize and + // the bottom of the page ends up in the middle of the window. + scrollPercent = 1.0 + } + percentText := fmt.Sprintf(" %3.f%% ", scrollPercent*100) percent := te.String(percentText). Foreground(statusBarFg.Color()). Background(statusBarBg.Color()). From 3ab3b8fcb4a8f96f546bdba8af35cacb428ccb60 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 18 May 2020 20:19:15 -0400 Subject: [PATCH 242/911] Also keep the scroll percentage at 0% or higher --- ui/ui.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 89869a0..3f33b7e 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -3,6 +3,7 @@ package ui import ( "errors" "fmt" + "math" "os" "strings" @@ -310,12 +311,7 @@ func statusBarView(m model) string { logo := glowLogoView(logoText) // Scroll percent - scrollPercent := m.pager.ScrollPercent() - if scrollPercent > 1.0 { - // Don't let read more than 100%, which could happen if we resize and - // the bottom of the page ends up in the middle of the window. - scrollPercent = 1.0 - } + scrollPercent := math.Max(0.0, math.Min(1.0, m.pager.ScrollPercent())) percentText := fmt.Sprintf(" %3.f%% ", scrollPercent*100) percent := te.String(percentText). Foreground(statusBarFg.Color()). From 51ad1c36195eaab2daaa49ffc7b822a8ee923861 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 18 May 2020 20:45:13 -0400 Subject: [PATCH 243/911] Use relative times when under a week --- go.mod | 1 + go.sum | 2 ++ ui/stash.go | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 5c1c988..0d5ce21 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/charmbracelet/tea v0.3.0 github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d github.com/dlclark/regexp2 v1.2.0 // indirect + github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/muesli/reflow v0.1.0 github.com/muesli/termenv v0.6.0 github.com/spf13/cobra v0.0.7 diff --git a/go.sum b/go.sum index 2e2e5ba..08a5ca0 100644 --- a/go.sum +++ b/go.sum @@ -41,6 +41,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac h1:opbrjaN/L8gg6Xh5D04Tem+8xVcz6ajZlGCs49mQgyg= +github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= diff --git a/ui/stash.go b/ui/stash.go index 69afe9b..0f15128 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -2,15 +2,18 @@ package ui import ( "fmt" + "math" "sort" "strconv" "strings" + "time" "github.com/charmbracelet/boba" "github.com/charmbracelet/boba/paginator" "github.com/charmbracelet/boba/spinner" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" + "github.com/dustin/go-humanize" "github.com/muesli/reflow/indent" te "github.com/muesli/termenv" ) @@ -392,7 +395,7 @@ func (m stashListItemView) date(state common.State) string { if state == common.StateDeleting { c = common.FaintRed } - s := m.CreatedAt.Format("02 Jan 2006 15:04:05 MST") + s := relativeTime(*m.CreatedAt) return te.String(s).Foreground(c.Color()).String() } @@ -451,3 +454,31 @@ func truncate(str string, num int) string { } return s } + +var magnitudes = []humanize.RelTimeMagnitude{ + {D: time.Second, Format: "now", DivBy: time.Second}, + {D: 2 * time.Second, Format: "1 second %s", DivBy: 1}, + {D: time.Minute, Format: "%d seconds %s", DivBy: time.Second}, + {D: 2 * time.Minute, Format: "1 minute %s", DivBy: 1}, + {D: time.Hour, Format: "%d minutes %s", DivBy: time.Minute}, + {D: 2 * time.Hour, Format: "1 hour %s", DivBy: 1}, + {D: humanize.Day, Format: "%d hours %s", DivBy: time.Hour}, + {D: 2 * humanize.Day, Format: "1 day %s", DivBy: 1}, + {D: humanize.Week, Format: "%d days %s", DivBy: humanize.Day}, + {D: 2 * humanize.Week, Format: "1 week %s", DivBy: 1}, + {D: humanize.Month, Format: "%d weeks %s", DivBy: humanize.Week}, + {D: 2 * humanize.Month, Format: "1 month %s", DivBy: 1}, + {D: humanize.Year, Format: "%d months %s", DivBy: humanize.Month}, + {D: 18 * humanize.Month, Format: "1 year %s", DivBy: 1}, + {D: 2 * humanize.Year, Format: "2 years %s", DivBy: 1}, + {D: humanize.LongTime, Format: "%d years %s", DivBy: humanize.Year}, + {D: math.MaxInt64, Format: "a long while %s", DivBy: 1}, +} + +func relativeTime(then time.Time) string { + now := time.Now() + if now.Sub(then) < humanize.Week { + return humanize.CustomRelTime(then, now, "ago", "from now", magnitudes) + } + return then.Format("02 Jan 2006 15:04 MST") +} From 476e01449d90570cc8dea2266e9b59402ae6951d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 18 May 2020 20:52:58 -0400 Subject: [PATCH 244/911] Sort stash in descending order by date --- go.mod | 2 +- go.sum | 4 ++-- ui/stash.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 0d5ce21..164f3c0 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/boba v0.6.0 - github.com/charmbracelet/charm v0.4.0 + github.com/charmbracelet/charm v0.4.1 github.com/charmbracelet/glamour v0.2.0 github.com/charmbracelet/tea v0.3.0 github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d diff --git a/go.sum b/go.sum index 08a5ca0..797a152 100644 --- a/go.sum +++ b/go.sum @@ -18,8 +18,8 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/charmbracelet/boba v0.5.0/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= github.com/charmbracelet/boba v0.6.0 h1:ktCY611UE4ZJ4MS0FS6eCA/jqjJDyfNgFfdDKBgi07g= github.com/charmbracelet/boba v0.6.0/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= -github.com/charmbracelet/charm v0.4.0 h1:g76242+CxC7fPiOYTmb81q0ehFb2JpUr6yD7bbe/tM4= -github.com/charmbracelet/charm v0.4.0/go.mod h1:bZQON+c4uV9mgbZBvKzH7wA1zGII9Zfg26cL70NYdH0= +github.com/charmbracelet/charm v0.4.1 h1:LJjQUDjeJkMTWmovyYiUzglbbbMBQGoDomqBn22qbpI= +github.com/charmbracelet/charm v0.4.1/go.mod h1:bZQON+c4uV9mgbZBvKzH7wA1zGII9Zfg26cL70NYdH0= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= github.com/charmbracelet/tea v0.2.0/go.mod h1:lADjwO2mMub9qvXSCA9vAkabVWO0HeUrv4uO/lG3C+k= diff --git a/ui/stash.go b/ui/stash.go index 0f15128..53b89e3 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -205,7 +205,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { break } - sort.Sort(charm.MarkdownsByCreatedAt(msg)) // sort by date + sort.Sort(charm.MarkdownsByCreatedAtDesc(msg)) // sort by date m.documents = append(m.documents, msg...) m.state = stashStateStashLoaded m.paginator.SetTotalPages(len(m.documents)) From c2bb505182aacb0ad7f83d39dbddf74d90114c54 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 19 May 2020 13:20:39 -0400 Subject: [PATCH 245/911] Break pager off into its own set of Boba functions --- ui/pager.go | 183 +++++++++++++++++++++++++++++++++++++++++++++++++ ui/stash.go | 10 ++- ui/ui.go | 192 +++++++++------------------------------------------- 3 files changed, 225 insertions(+), 160 deletions(-) create mode 100644 ui/pager.go diff --git a/ui/pager.go b/ui/pager.go new file mode 100644 index 0000000..7d498f1 --- /dev/null +++ b/ui/pager.go @@ -0,0 +1,183 @@ +package ui + +import ( + "fmt" + "math" + "os" + "strings" + + "github.com/charmbracelet/boba" + "github.com/charmbracelet/boba/viewport" + "github.com/charmbracelet/charm" + "github.com/charmbracelet/glamour" + te "github.com/muesli/termenv" +) + +// MSG + +type contentRenderedMsg string + +// MODEL + +type pagerState int + +const ( + pagerStateNormal pagerState = iota + pagerStateSetNote +) + +type pagerModel struct { + err error + viewport viewport.Model + glamourStyle string + width int + height int + + // Current document being rendered, sans-glamour rendering. We cache + // this here so we can re-render it on resize. + currentDocument *charm.Markdown +} + +func (m *pagerModel) setSize(w, h int) { + m.width = w + m.height = h + m.viewport.Width = w + m.viewport.Height = h +} + +func (m *pagerModel) setContent(s string) { + m.viewport.SetContent(s) +} + +func (m *pagerModel) unload() { + m.viewport.SetContent("") + m.viewport.Y = 0 +} + +// UPDATE + +func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { + switch msg := msg.(type) { + + // Glow has rendered the content + case contentRenderedMsg: + m.setContent(string(msg)) + return m, nil + + // We've reveived terminal dimensions, either for the first time or + // after a resize + case terminalSizeMsg: + if msg.Error() != nil { + m.err = msg.Error() + return m, nil + } + + var cmd boba.Cmd + if m.currentDocument != nil { + cmd = renderWithGlamour(m, m.currentDocument.Body) + } + return m, cmd + } + + var cmd boba.Cmd + m.viewport, cmd = viewport.Update(msg, m.viewport) + + return m, cmd +} + +// VIEW + +func pagerView(m pagerModel) string { + return fmt.Sprintf( + "\n%s\n%s", + viewport.View(m.viewport), + pagerStatusBarView(m), + ) +} + +func pagerStatusBarView(m pagerModel) string { + // Logo + logoText := " Glow " + logo := glowLogoView(logoText) + + // Scroll percent + scrollPercent := math.Max(0.0, math.Min(1.0, m.viewport.ScrollPercent())) + percentText := fmt.Sprintf(" %3.f%% ", scrollPercent*100) + percent := te.String(percentText). + Foreground(statusBarFg.Color()). + Background(statusBarBg.Color()). + String() + + // Note + noteText := m.currentDocument.Note + if len(noteText) == 0 { + noteText = "(No title)" + } + noteText = truncate(" "+noteText+" ", max(0, m.width-len(logoText)-len(percentText))) + note := te.String(noteText). + Foreground(statusBarFg.Color()). + Background(statusBarBg.Color()).String() + + // Empty space + emptyCell := te.String(" ").Background(statusBarBg.Color()).String() + padding := max(0, m.width-len(logoText)-len(noteText)-len(percentText)) + emptySpace := strings.Repeat(emptyCell, padding) + + return logo + note + emptySpace + percent +} + +// CMD + +func renderWithGlamour(m pagerModel, md string) boba.Cmd { + return func() boba.Msg { + s, err := glamourRender(m, md) + if err != nil { + return errMsg(err) + } + return contentRenderedMsg(s) + } +} + +// This is where the magic happens +func glamourRender(m pagerModel, markdown string) (string, error) { + + if os.Getenv("GLOW_DISABLE_GLAMOUR") != "" { + return markdown, nil + } + + // initialize glamour + var gs glamour.TermRendererOption + if m.glamourStyle == "auto" { + gs = glamour.WithAutoStyle() + } else { + gs = glamour.WithStylePath(m.glamourStyle) + } + + r, err := glamour.NewTermRenderer( + gs, + glamour.WithWordWrap(min(120, m.viewport.Width)), + ) + if err != nil { + return "", err + } + + out, err := r.Render(markdown) + if err != nil { + return "", err + } + + // trim lines + lines := strings.Split(string(out), "\n") + + var content string + for i, s := range lines { + content += strings.TrimSpace(s) + + // don't add an artificial newline after the last split + if i+1 < len(lines) { + content += "\n" + } + } + + return content, nil +} diff --git a/ui/stash.go b/ui/stash.go index 53b89e3..918ac1d 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -67,7 +67,7 @@ type stashModel struct { page int } -func (m *stashModel) SetSize(width, height int) { +func (m *stashModel) setSize(width, height int) { m.terminalWidth = width m.terminalHeight = height @@ -308,6 +308,14 @@ func stashView(m stashModel) string { return "\n" + indent.String(s, 2) } +func glowLogoView(text string) string { + return te.String(text). + Bold(). + Foreground(glowLogoTextColor). + Background(common.Fuschia.Color()). + String() +} + func stashEmtpyView(m stashModel) string { return "Nothing stashed yet." } diff --git a/ui/ui.go b/ui/ui.go index 3f33b7e..1959f0d 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -2,18 +2,12 @@ package ui import ( "errors" - "fmt" - "math" - "os" - "strings" "github.com/charmbracelet/boba" - "github.com/charmbracelet/boba/pager" "github.com/charmbracelet/boba/spinner" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/charm/ui/keygen" - "github.com/charmbracelet/glamour" "github.com/muesli/reflow/indent" te "github.com/muesli/termenv" ) @@ -39,7 +33,6 @@ type fatalErrMsg error type errMsg error type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} -type contentRenderedMsg string type terminalResizedMsg struct{} type terminalSizeMsg struct { @@ -64,7 +57,6 @@ const ( ) type model struct { - style string // style to use cc *charm.Client user *charm.User spinner spinner.Model @@ -72,20 +64,15 @@ type model struct { state state err error stash stashModel - pager pager.Model + pager pagerModel terminalWidth int terminalHeight int - - // Current document being rendered, sans-glamour rendering. We cache - // this here so we can re-render it on resize. - currentDocument *charm.Markdown } func (m *model) unloadDocument() { - m.pager = pager.Model{} m.state = stateShowStash m.stash.state = stashStateStashLoaded - m.currentDocument = nil + m.pager.unload() } // INIT @@ -106,9 +93,11 @@ func initialize(style string) func() (boba.Model, boba.Cmd) { } return model{ - style: style, spinner: s, - state: stateInitCharmClient, + pager: pagerModel{ + glamourStyle: style, + }, + state: stateInitCharmClient, }, boba.Batch( newCharmClient, spinner.Tick(s), @@ -126,7 +115,10 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { return model{err: errors.New("could not perform assertion on model in update")}, boba.Quit } - var cmd boba.Cmd + var ( + cmd boba.Cmd + cmds []boba.Cmd + ) switch msg := msg.(type) { @@ -159,7 +151,7 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { return m, nil case terminalResizedMsg: - return m, boba.Batch( + cmds = append(cmds, getTerminalSize(), listenForTerminalResize(), ) @@ -167,84 +159,59 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case terminalSizeMsg: if msg.Error() != nil { m.err = msg.Error() - return m, nil } w, h := msg.Size() m.terminalWidth = w m.terminalHeight = h - m.stash.SetSize(w, h) - - if m.state == stateShowDocument { - m.pager.Width = w - m.pager.Height = h - } - - var cmd boba.Cmd - if m.state == stateShowDocument { - cmd = renderWithGlamour(m, m.currentDocument.Body) - } + m.stash.setSize(w, h) + m.pager.setSize(w, h) // TODO: load more stash pages if we've resized, are on the last page, // and haven't loaded more pages yet. - return m, cmd case sshAuthErrMsg: // If we haven't run the keygen yet, do that if m.state != stateKeygenFinished { m.state = stateKeygenRunning m.keygen = keygen.NewModel() - return m, keygen.GenerateKeys + cmds = append(cmds, keygen.GenerateKeys) + } else { + // The keygen didn't work and we can't auth + m.err = errors.New("SSH authentication failed") + return m, boba.Quit } - // The keygen didn't work and we can't auth - m.err = errors.New("SSH authentication failed") - return m, boba.Quit - case spinner.TickMsg: switch m.state { case stateInitCharmClient: m.spinner, cmd = spinner.Update(msg, m.spinner) } - return m, cmd - - case stashSpinnerTickMsg: - if m.state == stateShowStash { - m.stash, cmd = stashUpdate(msg, m.stash) - } - return m, cmd + cmds = append(cmds, cmd) case keygen.DoneMsg: m.state = stateKeygenFinished - return m, newCharmClient + cmds = append(cmds, newCharmClient) case newCharmClientMsg: m.cc = msg m.state = stateShowStash m.stash, cmd = stashInit(m.cc) - m.stash.SetSize(m.terminalWidth, m.terminalHeight) - return m, cmd + m.stash.setSize(m.terminalWidth, m.terminalHeight) + cmds = append(cmds, cmd) case gotStashedItemMsg: - // We've received stashed item data. Render with Glamour and send to - // the pager. - m.pager = pager.NewModel( - m.terminalWidth, - m.terminalHeight-statusBarHeight, - ) - - m.currentDocument = msg - return m, renderWithGlamour(m, msg.Body) + m.pager.currentDocument = msg + cmds = append(cmds, renderWithGlamour(m.pager, msg.Body)) case contentRenderedMsg: m.state = stateShowDocument - m.pager.SetContent(string(msg)) - return m, nil } switch m.state { case stateKeygenRunning: + // Process keygen mdl, cmd := keygen.Update(msg, boba.Model(m.keygen)) keygenModel, ok := mdl.(keygen.Model) if !ok { @@ -252,20 +219,20 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { return m, boba.Quit } m.keygen = keygenModel - return m, cmd + cmds = append(cmds, cmd) case stateShowStash: + // Process stash m.stash, cmd = stashUpdate(msg, m.stash) - return m, cmd + cmds = append(cmds, cmd) case stateShowDocument: - // Process keys (and eventually mouse) with pager.Update - var cmd boba.Cmd - m.pager, cmd = pager.Update(msg, m.pager) - return m, cmd + // Process pager + m.pager, cmd = pagerUpdate(msg, m.pager) + cmds = append(cmds, cmd) } - return m, nil + return m, boba.Batch(cmds...) } // VIEW @@ -291,51 +258,12 @@ func view(mdl boba.Model) string { case stateShowStash: return stashView(m.stash) case stateShowDocument: - return fmt.Sprintf("\n%s\n%s", pager.View(m.pager), statusBarView(m)) + return pagerView(m.pager) } return "\n" + indent.String(s, 2) } -func glowLogoView(text string) string { - return te.String(text). - Bold(). - Foreground(glowLogoTextColor). - Background(common.Fuschia.Color()). - String() -} - -func statusBarView(m model) string { - // Logo - logoText := " Glow " - logo := glowLogoView(logoText) - - // Scroll percent - scrollPercent := math.Max(0.0, math.Min(1.0, m.pager.ScrollPercent())) - percentText := fmt.Sprintf(" %3.f%% ", scrollPercent*100) - percent := te.String(percentText). - Foreground(statusBarFg.Color()). - Background(statusBarBg.Color()). - String() - - // Note - noteText := m.currentDocument.Note - if len(noteText) == 0 { - noteText = "(No title)" - } - noteText = truncate(" "+noteText+" ", max(0, m.terminalWidth-len(logoText)-len(percentText))) - note := te.String(noteText). - Foreground(statusBarFg.Color()). - Background(statusBarBg.Color()).String() - - // Empty space - emptyCell := te.String(" ").Background(statusBarBg.Color()).String() - padding := max(0, m.terminalWidth-len(logoText)-len(noteText)-len(percentText)) - emptySpace := strings.Repeat(emptyCell, padding) - - return logo + note + emptySpace + percent -} - // COMMANDS func listenForTerminalResize() boba.Cmd { @@ -366,62 +294,8 @@ func newCharmClient() boba.Msg { return newCharmClientMsg(cc) } -func renderWithGlamour(m model, md string) boba.Cmd { - return func() boba.Msg { - s, err := glamourRender(m, md) - if err != nil { - return errMsg(err) - } - return contentRenderedMsg(s) - } -} - // ETC -// This is where the magic happens -func glamourRender(m model, markdown string) (string, error) { - - if os.Getenv("GLOW_DISABLE_GLAMOUR") != "" { - return markdown, nil - } - - // initialize glamour - var gs glamour.TermRendererOption - if m.style == "auto" { - gs = glamour.WithAutoStyle() - } else { - gs = glamour.WithStylePath(m.style) - } - - r, err := glamour.NewTermRenderer( - gs, - glamour.WithWordWrap(min(120, m.terminalWidth)), - ) - if err != nil { - return "", err - } - - out, err := r.Render(markdown) - if err != nil { - return "", err - } - - // trim lines - lines := strings.Split(string(out), "\n") - - var content string - for i, s := range lines { - content += strings.TrimSpace(s) - - // don't add an artificial newline after the last split - if i+1 < len(lines) { - content += "\n" - } - } - - return content, nil -} - func min(a, b int) int { if a < b { return a From 04f1ebfa23f4adaeb5e0d4d260555193d28c90a0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 20 May 2020 15:18:59 -0400 Subject: [PATCH 246/911] Add functionality for setting document note in the pager --- go.mod | 5 ++- go.sum | 11 ++--- ui/pager.go | 127 +++++++++++++++++++++++++++++++++++++++++++++++++--- ui/stash.go | 24 ++++++---- ui/ui.go | 38 ++++++++++------ 5 files changed, 170 insertions(+), 35 deletions(-) diff --git a/go.mod b/go.mod index 164f3c0..6ce5fca 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/boba v0.6.0 + github.com/charmbracelet/boba v0.6.1 github.com/charmbracelet/charm v0.4.1 github.com/charmbracelet/glamour v0.2.0 github.com/charmbracelet/tea v0.3.0 @@ -12,8 +12,9 @@ require ( github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/muesli/reflow v0.1.0 github.com/muesli/termenv v0.6.0 + github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03 // indirect github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect - golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 + golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 ) diff --git a/go.sum b/go.sum index 797a152..7d84bde 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/boba v0.5.0/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= -github.com/charmbracelet/boba v0.6.0 h1:ktCY611UE4ZJ4MS0FS6eCA/jqjJDyfNgFfdDKBgi07g= -github.com/charmbracelet/boba v0.6.0/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= +github.com/charmbracelet/boba v0.6.1 h1:UwhxBYkYjnRTS8oJBoLxXzh+CpE12yt7utMpP0cjlYc= +github.com/charmbracelet/boba v0.6.1/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= github.com/charmbracelet/charm v0.4.1 h1:LJjQUDjeJkMTWmovyYiUzglbbbMBQGoDomqBn22qbpI= github.com/charmbracelet/charm v0.4.1/go.mod h1:bZQON+c4uV9mgbZBvKzH7wA1zGII9Zfg26cL70NYdH0= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= @@ -106,8 +106,9 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942 h1:A7GG7zcGjl3jqAqGPmcNjd/D9hzL95SuoOQAaFNdLU0= github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= +github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03 h1:pd4YKIqCB0U7O2I4gWHgEUA2mCEOENmco0l/bM957bU= +github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03/go.mod h1:Z9+Ul5bCbBKnbCvdOWbLqTHhJiYV414CURZJba6L8qA= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -178,8 +179,8 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200430202703-d923437fa56d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 h1:YTzHMGlqJu67/uEo1lBv0n3wBXhXNeUbB1XfN2vmTm0= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/ui/pager.go b/ui/pager.go index 7d498f1..4bd88c9 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -1,48 +1,92 @@ package ui import ( + "errors" "fmt" "math" "os" "strings" "github.com/charmbracelet/boba" + "github.com/charmbracelet/boba/textinput" "github.com/charmbracelet/boba/viewport" "github.com/charmbracelet/charm" + "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glamour" te "github.com/muesli/termenv" ) +const ( + statusBarHeight = 1 + gray = "#333333" + yellowGreen = "#ECFD65" + fuschia = "#EE6FF8" + noteHeadingText = " Set Memo " + notePromptText = " > " +) + +var ( + noteHeading = te.String(noteHeadingText). + Foreground(common.Cream.Color()). + Background(common.Green.Color()). + String() +) + // MSG +type pagerErrMsg error type contentRenderedMsg string +type noteSavedMsg *charm.Markdown // MODEL type pagerState int const ( - pagerStateNormal pagerState = iota + pagerStateBrowse pagerState = iota pagerStateSetNote ) type pagerModel struct { err error + cc *charm.Client viewport viewport.Model + state pagerState glamourStyle string width int height int + textInput textinput.Model // Current document being rendered, sans-glamour rendering. We cache // this here so we can re-render it on resize. currentDocument *charm.Markdown } +func newPagerModel(glamourStyle string) pagerModel { + ti := textinput.NewModel() + ti.Prompt = te.String(notePromptText). + Foreground(te.ColorProfile().Color(gray)). + Background(te.ColorProfile().Color(yellowGreen)). + String() + ti.TextColor = gray + ti.BackgroundColor = yellowGreen + ti.CursorColor = fuschia + ti.CharLimit = 128 // totally arbitrary + ti.Focus() + + return pagerModel{ + state: pagerStateBrowse, + glamourStyle: glamourStyle, + textInput: ti, + } +} + func (m *pagerModel) setSize(w, h int) { m.width = w m.height = h m.viewport.Width = w - m.viewport.Height = h + m.viewport.Height = h - statusBarHeight + m.textInput.Width = w - len(noteHeadingText) - len(notePromptText) - 1 } func (m *pagerModel) setContent(s string) { @@ -50,15 +94,55 @@ func (m *pagerModel) setContent(s string) { } func (m *pagerModel) unload() { + m.state = pagerStateBrowse m.viewport.SetContent("") m.viewport.Y = 0 + m.textInput.Reset() } // UPDATE func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { + var ( + cmd boba.Cmd + cmds []boba.Cmd + ) + switch msg := msg.(type) { + case boba.KeyMsg: + switch m.state { + case pagerStateSetNote: + switch msg.String() { + case "q": + fallthrough + case "esc": + m.state = pagerStateBrowse + return m, nil + case "enter": + m.currentDocument.Note = m.textInput.Value // set optimistically + m.state = pagerStateBrowse + m.textInput.Reset() + return m, saveDocumentNote(m.cc, m.currentDocument.ID, m.currentDocument.Note) + } + default: + switch msg.String() { + case "q": + fallthrough + case "esc": + if m.state != pagerStateBrowse { + m.state = pagerStateBrowse + return m, nil + } + case "n": + m.state = pagerStateSetNote + return m, textinput.Blink(m.textInput) + } + } + + case pagerErrMsg: + m.err = msg + // Glow has rendered the content case contentRenderedMsg: m.setContent(string(msg)) @@ -79,19 +163,32 @@ func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { return m, cmd } - var cmd boba.Cmd - m.viewport, cmd = viewport.Update(msg, m.viewport) + switch m.state { + case pagerStateSetNote: + m.textInput, cmd = textinput.Update(msg, m.textInput) + cmds = append(cmds, cmd) + default: + m.viewport, cmd = viewport.Update(msg, m.viewport) + cmds = append(cmds, cmd) + } - return m, cmd + return m, boba.Batch(cmds...) } // VIEW func pagerView(m pagerModel) string { + var footer string + if m.state == pagerStateSetNote { + footer = pagerSetNoteView(m) + } else { + footer = pagerStatusBarView(m) + } + return fmt.Sprintf( "\n%s\n%s", viewport.View(m.viewport), - pagerStatusBarView(m), + footer, ) } @@ -126,6 +223,10 @@ func pagerStatusBarView(m pagerModel) string { return logo + note + emptySpace + percent } +func pagerSetNoteView(m pagerModel) string { + return noteHeading + textinput.View(m.textInput) +} + // CMD func renderWithGlamour(m pagerModel, md string) boba.Cmd { @@ -138,6 +239,20 @@ func renderWithGlamour(m pagerModel, md string) boba.Cmd { } } +func saveDocumentNote(cc *charm.Client, id int, note string) boba.Cmd { + if cc == nil { + return func() boba.Msg { + return pagerErrMsg(errors.New("can't set note; no charm client")) + } + } + return func() boba.Msg { + if err := cc.SetMarkdownNote(id, note); err != nil { + return pagerErrMsg(err) + } + return noteSavedMsg(&charm.Markdown{ID: id, Note: note}) + } +} + // This is where the magic happens func glamourRender(m pagerModel, markdown string) (string, error) { diff --git a/ui/stash.go b/ui/stash.go index 918ac1d..f1a0292 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -39,7 +39,7 @@ type stashState int const ( stashStateInit stashState = iota - stashStateStashLoaded + stashStateReady stashStatePromptDelete stashStateLoadingDocument ) @@ -170,7 +170,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { if m.state != stashStatePromptDelete { break } - // Deletion confirmed. Delete the stashed item. + // Deletion confirmed. Delete the stashed item... // Index of the documents slice we'll be deleting i := m.paginator.Page*m.paginator.PerPage + m.index @@ -187,9 +187,8 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { m.paginator.Page = min(m.paginator.Page, m.paginator.TotalPages-1) // Set state and delete - m.state = stashStateStashLoaded + m.state = stashStateReady return m, deleteStashedItem(m.cc, id) - } case stashErrMsg: @@ -207,7 +206,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { sort.Sort(charm.MarkdownsByCreatedAtDesc(msg)) // sort by date m.documents = append(m.documents, msg...) - m.state = stashStateStashLoaded + m.state = stashStateReady m.paginator.SetTotalPages(len(m.documents)) case stashSpinnerTickMsg: @@ -215,9 +214,18 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { m.spinner, cmd = spinner.Update(msg, m.spinner) cmds = append(cmds, cmd) } + + case noteSavedMsg: + // A note was set on a document. This happened in the pager, so we'll + // find the corresponding document here and update accordingly. + for i := range m.documents { + if m.documents[i].ID == msg.ID { + m.documents[i].Note = msg.Note + } + } } - if m.state == stashStateStashLoaded { + if m.state == stashStateReady { // Update paginator m.paginator, cmd = paginator.Update(msg, m.paginator) @@ -243,7 +251,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { // used for confirmation above) cancels the deletion k, ok := msg.(boba.KeyMsg) if ok && k.String() != "x" && m.state == stashStatePromptDelete { - m.state = stashStateStashLoaded + m.state = stashStateReady } return m, boba.Batch(cmds...) @@ -262,7 +270,7 @@ func stashView(m stashModel) string { s += spinner.View(m.spinner) + " Loading stash..." case stashStateLoadingDocument: s += spinner.View(m.spinner) + " Loading document..." - case stashStateStashLoaded: + case stashStateReady: fallthrough case stashStatePromptDelete: if len(m.documents) == 0 { diff --git a/ui/ui.go b/ui/ui.go index 1959f0d..08d1504 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -12,10 +12,6 @@ import ( te "github.com/muesli/termenv" ) -const ( - statusBarHeight = 1 -) - var ( glowLogoTextColor = common.Color("#ECFD65") statusBarBg = common.NewColorPair("#242424", "#E6E6E6") @@ -71,7 +67,7 @@ type model struct { func (m *model) unloadDocument() { m.state = stateShowStash - m.stash.state = stashStateStashLoaded + m.stash.state = stashStateReady m.pager.unload() } @@ -94,10 +90,8 @@ func initialize(style string) func() (boba.Model, boba.Cmd) { return model{ spinner: s, - pager: pagerModel{ - glamourStyle: style, - }, - state: stateInitCharmClient, + pager: newPagerModel(style), + state: stateInitCharmClient, }, boba.Batch( newCharmClient, spinner.Tick(s), @@ -124,20 +118,26 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case boba.KeyMsg: switch msg.String() { - case "q": fallthrough case "esc": if m.state == stateShowDocument { - m.unloadDocument() - return m, nil + var cmd boba.Cmd + if m.pager.state == pagerStateBrowse { + // Exit pager + m.unloadDocument() + } else { + // Pass message through to pager + m.pager, cmd = pagerUpdate(msg, m.pager) + } + return m, cmd } return m, boba.Quit case "ctrl+c": return m, boba.Quit - // Re-render + // Repaint case "ctrl+l": return m, getTerminalSize() } @@ -192,14 +192,24 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { m.state = stateKeygenFinished cmds = append(cmds, newCharmClient) + case noteSavedMsg: + // A note was saved to a document. This will have be done in the + // pager, so we'll need to find the corresponding note in the stash. + // So, pass the message to the stash for processing. + m.stash, cmd = stashUpdate(msg, m.stash) + cmds = append(cmds, cmd) + case newCharmClientMsg: m.cc = msg m.state = stateShowStash - m.stash, cmd = stashInit(m.cc) + m.stash, cmd = stashInit(msg) m.stash.setSize(m.terminalWidth, m.terminalHeight) + m.pager.cc = msg cmds = append(cmds, cmd) case gotStashedItemMsg: + // Loaded markdown document from the server. We'll render it before + // loading it into the pager. m.pager.currentDocument = msg cmds = append(cmds, renderWithGlamour(m.pager, msg.Body)) From 8695bffa2e4e6d8e1b22f16da7eb0d7e99a24d33 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 20 May 2020 16:17:18 -0400 Subject: [PATCH 247/911] Pre-populate note field with exisiting note --- ui/pager.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index 4bd88c9..3209d5a 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -120,7 +120,7 @@ func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { m.state = pagerStateBrowse return m, nil case "enter": - m.currentDocument.Note = m.textInput.Value // set optimistically + m.currentDocument.Note = m.textInput.Value() // update optimistically m.state = pagerStateBrowse m.textInput.Reset() return m, saveDocumentNote(m.cc, m.currentDocument.ID, m.currentDocument.Note) @@ -136,6 +136,11 @@ func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { } case "n": m.state = pagerStateSetNote + if m.textInput.Value() == "" { + // Pre-populate with existing value + m.textInput.SetValue(m.currentDocument.Note) + m.textInput.CursorEnd() + } return m, textinput.Blink(m.textInput) } } From 1219d22834ee2f9677422a38445c476e10285eb0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 20 May 2020 16:27:19 -0400 Subject: [PATCH 248/911] Don't set a note if the note didn't actually change --- ui/pager.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 3209d5a..5cc8789 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -120,10 +120,14 @@ func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { m.state = pagerStateBrowse return m, nil case "enter": - m.currentDocument.Note = m.textInput.Value() // update optimistically + var cmd boba.Cmd + if m.textInput.Value() != m.currentDocument.Note { // don't update if the note didn't change + m.currentDocument.Note = m.textInput.Value() // update optimistically + cmd = saveDocumentNote(m.cc, m.currentDocument.ID, m.currentDocument.Note) + } m.state = pagerStateBrowse m.textInput.Reset() - return m, saveDocumentNote(m.cc, m.currentDocument.ID, m.currentDocument.Note) + return m, cmd } default: switch msg.String() { From f3021822f3ac7a456bc1d4e7ee022683b9466ab2 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 20 May 2020 16:45:09 -0400 Subject: [PATCH 249/911] More contrasty note titles in pager status bar --- ui/pager.go | 14 +++++++++----- ui/ui.go | 2 -- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 5cc8789..e8c4256 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -27,9 +27,13 @@ const ( var ( noteHeading = te.String(noteHeadingText). - Foreground(common.Cream.Color()). - Background(common.Green.Color()). - String() + Foreground(common.Cream.Color()). + Background(common.Green.Color()). + String() + + statusBarBg = common.NewColorPair("#242424", "#E6E6E6") + statusBarNoteFg = common.NewColorPair("#7D7D7D", "#656565") + statusBarScrollPosFg = common.NewColorPair("#5A5A5A", "#949494") ) // MSG @@ -210,7 +214,7 @@ func pagerStatusBarView(m pagerModel) string { scrollPercent := math.Max(0.0, math.Min(1.0, m.viewport.ScrollPercent())) percentText := fmt.Sprintf(" %3.f%% ", scrollPercent*100) percent := te.String(percentText). - Foreground(statusBarFg.Color()). + Foreground(statusBarScrollPosFg.Color()). Background(statusBarBg.Color()). String() @@ -221,7 +225,7 @@ func pagerStatusBarView(m pagerModel) string { } noteText = truncate(" "+noteText+" ", max(0, m.width-len(logoText)-len(percentText))) note := te.String(noteText). - Foreground(statusBarFg.Color()). + Foreground(statusBarNoteFg.Color()). Background(statusBarBg.Color()).String() // Empty space diff --git a/ui/ui.go b/ui/ui.go index 08d1504..82d494f 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -14,8 +14,6 @@ import ( var ( glowLogoTextColor = common.Color("#ECFD65") - statusBarBg = common.NewColorPair("#242424", "#E6E6E6") - statusBarFg = common.NewColorPair("#5A5A5A", "#949494") ) // NewProgram returns a new Boba program From 1971c8abd85f3a2cf1573709d4baf66f97297ced Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 20 May 2020 16:54:37 -0400 Subject: [PATCH 250/911] Add right padding to markdown rendering --- ui/pager.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index e8c4256..ccf80ec 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -17,12 +17,13 @@ import ( ) const ( - statusBarHeight = 1 - gray = "#333333" - yellowGreen = "#ECFD65" - fuschia = "#EE6FF8" - noteHeadingText = " Set Memo " - notePromptText = " > " + statusBarHeight = 1 + viewportHorizontalPadding = 2 + gray = "#333333" + yellowGreen = "#ECFD65" + fuschia = "#EE6FF8" + noteHeadingText = " Set Memo " + notePromptText = " > " ) var ( @@ -281,9 +282,10 @@ func glamourRender(m pagerModel, markdown string) (string, error) { gs = glamour.WithStylePath(m.glamourStyle) } + width := max(0, min(120, m.viewport.Width-viewportHorizontalPadding)) r, err := glamour.NewTermRenderer( gs, - glamour.WithWordWrap(min(120, m.viewport.Width)), + glamour.WithWordWrap(width), ) if err != nil { return "", err From 1b7c70a82920b2ecc2d8f499db4039a6ce1569b6 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 21 May 2020 11:51:22 -0400 Subject: [PATCH 251/911] Remove right document padding per Glamour update (pinned at current master) --- go.mod | 2 +- go.sum | 5 +++-- ui/pager.go | 16 ++++++++-------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 6ce5fca..edfc859 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,6 @@ require ( github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03 // indirect github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 - golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect + golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 ) diff --git a/go.sum b/go.sum index 7d84bde..d1b5c99 100644 --- a/go.sum +++ b/go.sum @@ -161,8 +161,8 @@ golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 h1:eDrdRpKgkcCqKZQwyZRyeFZgfqt37SL7Kv3tok06cKE= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -175,6 +175,7 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200430202703-d923437fa56d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/ui/pager.go b/ui/pager.go index ccf80ec..271ae66 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -17,13 +17,13 @@ import ( ) const ( - statusBarHeight = 1 - viewportHorizontalPadding = 2 - gray = "#333333" - yellowGreen = "#ECFD65" - fuschia = "#EE6FF8" - noteHeadingText = " Set Memo " - notePromptText = " > " + maxDocumentWidth = 120 + statusBarHeight = 1 + gray = "#333333" + yellowGreen = "#ECFD65" + fuschia = "#EE6FF8" + noteHeadingText = " Set Memo " + notePromptText = " > " ) var ( @@ -282,7 +282,7 @@ func glamourRender(m pagerModel, markdown string) (string, error) { gs = glamour.WithStylePath(m.glamourStyle) } - width := max(0, min(120, m.viewport.Width-viewportHorizontalPadding)) + width := max(0, min(maxDocumentWidth, m.viewport.Width)) r, err := glamour.NewTermRenderer( gs, glamour.WithWordWrap(width), From 055ae6e3c289feaffa9e36bb679dc317fcb913d7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 21 May 2020 15:14:33 -0400 Subject: [PATCH 252/911] Load, browse and render news --- ui/pager.go | 7 ++- ui/stash.go | 158 ++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 135 insertions(+), 30 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 271ae66..9ed844d 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -64,7 +64,7 @@ type pagerModel struct { // Current document being rendered, sans-glamour rendering. We cache // this here so we can re-render it on resize. - currentDocument *charm.Markdown + currentDocument *markdown } func newPagerModel(glamourStyle string) pagerModel { @@ -144,6 +144,11 @@ func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { return m, nil } case "n": + // Users can't set the note on news markdown + if m.currentDocument.markdownType == newsMarkdown { + break + } + m.state = pagerStateSetNote if m.textInput.Value() == "" { // Pre-populate with existing value diff --git a/ui/stash.go b/ui/stash.go index f1a0292..20675d2 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -25,18 +25,46 @@ const ( stashHorizontalPadding = 6 ) +var ( + faintGreen = common.NewColorPair("#2B4A3F", "#ABE5D1") + green = common.NewColorPair("#04B575", "#04B575") +) + // MSG type stashErrMsg error type stashSpinnerTickMsg struct{} type gotStashMsg []*charm.Markdown -type gotStashedItemMsg *charm.Markdown +type gotNewsMsg []*charm.Markdown +type gotStashedItemMsg *markdown type deletedStashedItemMsg int // MODEL type stashState int +type markdownType int + +const ( + userMarkdown markdownType = iota + newsMarkdown +) + +// markdown wraps charm.Markdown so we can differentiate between stashed items +// and news +type markdown struct { + markdownType markdownType + *charm.Markdown +} + +// Sort documents by date in descending order +type markdownsByCreatedAtDesc []*markdown + +// Sort implementation for MarkdownByCreatedAt +func (m markdownsByCreatedAtDesc) Len() int { return len(m) } +func (m markdownsByCreatedAtDesc) Swap(i, j int) { m[i], m[j] = m[j], m[i] } +func (m markdownsByCreatedAtDesc) Less(i, j int) bool { return m[i].CreatedAt.After(*m[j].CreatedAt) } + const ( stashStateInit stashState = iota stashStateReady @@ -48,22 +76,26 @@ type stashModel struct { cc *charm.Client err error state stashState - documents []*charm.Markdown + documents []*markdown spinner spinner.Model - index int terminalWidth int terminalHeight int loading bool // are we currently loading something? fullyLoaded bool // Have we loaded everything from the server? + // This is just the index of the current page in view. To get the index + // of the selected item as it relates to the full set of documents we've + // fetched use the mardownIndex() method of this struct. + index int + // This handles the local pagination, which is different than the page // we're fetching from on the server side paginator paginator.Model - // Page we're fetching items from on the server, which is different from - // the local pagination. Generally, the server will return more items than - // we can display at a time so we can paginate locally without having to - // fetch every time. + // Page we're fetching stash items from on the server, which is different + // from the local pagination. Generally, the server will return more items + // than we can display at a time so we can paginate locally without having + // to fetch every time. page int } @@ -82,6 +114,11 @@ func (m *stashModel) setSize(width, height int) { } } +// markdownIndex returns the index of the currently selected markdown item. +func (m stashModel) markdownIndex() int { + return m.paginator.Page*m.paginator.PerPage + m.index +} + // INIT func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { @@ -103,6 +140,7 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { return m, boba.Batch( loadStash(m), + loadNews(m), spinner.Tick(s), ) } @@ -156,15 +194,17 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { // Load the document from the server. We'll handle the message // that comes back in the main update function. m.state = stashStateLoadingDocument - indexToLoad := m.paginator.Page*m.paginator.PerPage + m.index + doc := m.documents[m.markdownIndex()] cmds = append(cmds, - loadStashedItem(m.cc, m.documents[indexToLoad].ID), + loadStashedItem(m.cc, doc.ID, doc.markdownType), spinner.Tick(m.spinner), ) case "x": // Confirm deletion - m.state = stashStatePromptDelete + if m.documents[m.markdownIndex()].markdownType == userMarkdown { + m.state = stashStatePromptDelete + } case "y": if m.state != stashStatePromptDelete { @@ -204,11 +244,22 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { break } - sort.Sort(charm.MarkdownsByCreatedAtDesc(msg)) // sort by date - m.documents = append(m.documents, msg...) + docs := wrapMarkdowns(userMarkdown, msg) + sort.Sort(markdownsByCreatedAtDesc(docs)) // sort by date + m.documents = append(m.documents, docs...) m.state = stashStateReady m.paginator.SetTotalPages(len(m.documents)) + case gotNewsMsg: + if len(msg) == 0 { + break + } + + docs := wrapMarkdowns(newsMarkdown, msg) + sort.Sort(markdownsByCreatedAtDesc(docs)) + m.documents = append(m.documents, docs...) + m.paginator.SetTotalPages(len(m.documents)) + case stashSpinnerTickMsg: if m.state == stashStateInit || m.state == stashStateLoadingDocument { m.spinner, cmd = spinner.Update(msg, m.spinner) @@ -278,8 +329,8 @@ func stashView(m stashModel) string { break } - // Blank lines we'll need to fill with newlines if the viewport is - // properly filled + // We need to fill any empty height with newlines so the footer reaches + // the bottom. numBlankLines := max(0, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)%stashViewItemHeight) blankLines := "" if numBlankLines > 0 { @@ -310,7 +361,7 @@ func stashView(m stashModel) string { stashPopulatedView(m), blankLines, pagination, - helpView(m), + stashHelpView(m), ) } return "\n" + indent.String(s, 2) @@ -357,8 +408,12 @@ func stashPopulatedView(m stashModel) string { return s } -func helpView(m stashModel) string { - h := []string{} +func stashHelpView(m stashModel) string { + var ( + h []string + isNews bool = m.documents[m.markdownIndex()].markdownType == newsMarkdown + ) + if m.state == stashStatePromptDelete { h = append(h, "y: delete", "n: cancel") } else { @@ -369,16 +424,26 @@ func helpView(m stashModel) string { if m.paginator.TotalPages > 1 { h = append(h, "h/l, ←/→: page") } - h = append(h, []string{"x: delete", "esc: exit"}...) + if !isNews { + h = append(h, []string{"x: delete"}...) + } + h = append(h, []string{"esc: exit"}...) } return common.HelpView(h...) } -type stashListItemView charm.Markdown +// stashListItemView renders items in the stash view +type stashListItemView markdown func (m stashListItemView) render(width int, state common.State) string { - line := common.VerticalLine(state) + " " + var line string + if m.markdownType == newsMarkdown && state != common.StateSelected { + line = te.String("│").Foreground(faintGreen.Color()).String() + } else { + line = common.VerticalLine(state) + } + line += " " keyColor := common.NoColor switch state { @@ -386,18 +451,30 @@ func (m stashListItemView) render(width int, state common.State) string { keyColor = common.Fuschia case common.StateDeleting: keyColor = common.Red + default: + if m.markdownType == newsMarkdown { + keyColor = common.Green + } } - titleKey := strconv.Itoa(m.ID) + titleKey := "#" + strconv.Itoa(m.ID) + if m.markdownType == newsMarkdown { + titleKey = "System Announcement" + } if m.Note != "" { titleKey += ":" } - titleVal := truncate(m.Note, width-(stashHorizontalPadding*2)-len(titleKey)) - titleVal = titleView(titleVal, state) + dateKey := "Stashed:" + if m.markdownType == newsMarkdown { + dateKey = "Posted:" + } - titleKey = te.String("#" + titleKey).Foreground(keyColor.Color()).String() - dateKey := te.String("Stashed:").Foreground(keyColor.Color()).String() + titleVal := truncate(m.Note, width-(stashHorizontalPadding*2)-len(titleKey)) + titleVal = m.title(titleVal, state) + + titleKey = te.String(titleKey).Foreground(keyColor.Color()).String() + dateKey = te.String(dateKey).Foreground(keyColor.Color()).String() dateVal := m.date(state) var s string @@ -415,7 +492,7 @@ func (m stashListItemView) date(state common.State) string { return te.String(s).Foreground(c.Color()).String() } -func titleView(title string, state common.State) string { +func (m stashListItemView) title(title string, state common.State) string { if title == "" { return "" } @@ -438,13 +515,26 @@ func loadStash(m stashModel) boba.Cmd { } } -func loadStashedItem(cc *charm.Client, id int) boba.Cmd { +func loadNews(m stashModel) boba.Cmd { return func() boba.Msg { - m, err := cc.GetStashMarkdown(id) + stash, err := m.cc.GetNews(1) // just fetch the first page if err != nil { return stashErrMsg(err) } - return gotStashedItemMsg(m) + return gotNewsMsg(stash) + } +} + +func loadStashedItem(cc *charm.Client, id int, t markdownType) boba.Cmd { + return func() boba.Msg { + md, err := cc.GetStashMarkdown(id) + if err != nil { + return stashErrMsg(err) + } + return gotStashedItemMsg(&markdown{ + markdownType: t, + Markdown: md, + }) } } @@ -460,6 +550,16 @@ func deleteStashedItem(cc *charm.Client, id int) boba.Cmd { // ETC +func wrapMarkdowns(t markdownType, md []*charm.Markdown) (m []*markdown) { + for _, v := range md { + m = append(m, &markdown{ + markdownType: t, + Markdown: v, + }) + } + return m +} + func truncate(str string, num int) string { s := str if len(str) > num { From f474e2490dfa7d63d30a6f381e2e72f6ee6cb4cb Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 21 May 2020 16:05:13 -0400 Subject: [PATCH 253/911] Don't render stash until both stash and news are loaded --- ui/stash.go | 57 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 20675d2..e1d9c9b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -41,8 +41,6 @@ type deletedStashedItemMsg int // MODEL -type stashState int - type markdownType int const ( @@ -65,6 +63,8 @@ func (m markdownsByCreatedAtDesc) Len() int { return len(m) } func (m markdownsByCreatedAtDesc) Swap(i, j int) { m[i], m[j] = m[j], m[i] } func (m markdownsByCreatedAtDesc) Less(i, j int) bool { return m[i].CreatedAt.After(*m[j].CreatedAt) } +type stashState int + const ( stashStateInit stashState = iota stashStateReady @@ -72,6 +72,17 @@ const ( stashStateLoadingDocument ) +type stashLoadedState byte + +func (s stashLoadedState) done() bool { + return s&loadedStash != 0 && s&loadedNews != 0 +} + +const ( + loadedStash stashLoadedState = 1 << iota + loadedNews +) + type stashModel struct { cc *charm.Client err error @@ -80,8 +91,9 @@ type stashModel struct { spinner spinner.Model terminalWidth int terminalHeight int - loading bool // are we currently loading something? - fullyLoaded bool // Have we loaded everything from the server? + loaded stashLoadedState // what's loaded? we find out with bitmasking + loading bool // are we currently loading something? + fullyLoaded bool // Have we loaded everything from the server? // This is just the index of the current page in view. To get the index // of the selected item as it relates to the full set of documents we've @@ -200,8 +212,8 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { spinner.Tick(m.spinner), ) + // Confirm deletion case "x": - // Confirm deletion if m.documents[m.markdownIndex()].markdownType == userMarkdown { m.state = stashStatePromptDelete } @@ -234,12 +246,12 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case stashErrMsg: m.err = msg + // Stash results have come in from the server case gotStashMsg: - // Stash results have come in from the server m.loading = false + // If the server comes back with nothing then we've got everything if len(msg) == 0 { - // If the server comes back with nothing then we've got everything m.fullyLoaded = true break } @@ -247,18 +259,25 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { docs := wrapMarkdowns(userMarkdown, msg) sort.Sort(markdownsByCreatedAtDesc(docs)) // sort by date m.documents = append(m.documents, docs...) - m.state = stashStateReady m.paginator.SetTotalPages(len(m.documents)) - case gotNewsMsg: - if len(msg) == 0 { - break + m.loaded |= loadedStash + if m.loaded.done() { + m.state = stashStateReady } - docs := wrapMarkdowns(newsMarkdown, msg) - sort.Sort(markdownsByCreatedAtDesc(docs)) - m.documents = append(m.documents, docs...) - m.paginator.SetTotalPages(len(m.documents)) + case gotNewsMsg: + if len(msg) > 0 { + docs := wrapMarkdowns(newsMarkdown, msg) + sort.Sort(markdownsByCreatedAtDesc(docs)) + m.documents = append(m.documents, docs...) + m.paginator.SetTotalPages(len(m.documents)) + } + + m.loaded |= loadedNews + if m.loaded.done() { + m.state = stashStateReady + } case stashSpinnerTickMsg: if m.state == stashStateInit || m.state == stashStateLoadingDocument { @@ -266,9 +285,9 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { cmds = append(cmds, cmd) } + // A note was set on a document. This happened in the pager, so we'll + // find the corresponding document here and update accordingly. case noteSavedMsg: - // A note was set on a document. This happened in the pager, so we'll - // find the corresponding document here and update accordingly. for i := range m.documents { if m.documents[i].ID == msg.ID { m.documents[i].Note = msg.Note @@ -517,11 +536,11 @@ func loadStash(m stashModel) boba.Cmd { func loadNews(m stashModel) boba.Cmd { return func() boba.Msg { - stash, err := m.cc.GetNews(1) // just fetch the first page + news, err := m.cc.GetNews(1) // just fetch the first page if err != nil { return stashErrMsg(err) } - return gotNewsMsg(stash) + return gotNewsMsg(news) } } From c3ceed2c043324e53847df67c6c82c819945e180 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 21 May 2020 17:04:29 -0400 Subject: [PATCH 254/911] Log to a given path if `GLOW_LOG_TO_FILE` is set --- go.mod | 2 +- go.sum | 4 ++-- main.go | 12 +++++++++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index edfc859..8d7aa8b 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/boba v0.6.1 + github.com/charmbracelet/boba v0.6.2 github.com/charmbracelet/charm v0.4.1 github.com/charmbracelet/glamour v0.2.0 github.com/charmbracelet/tea v0.3.0 diff --git a/go.sum b/go.sum index d1b5c99..a1cd7e2 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/boba v0.5.0/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= -github.com/charmbracelet/boba v0.6.1 h1:UwhxBYkYjnRTS8oJBoLxXzh+CpE12yt7utMpP0cjlYc= -github.com/charmbracelet/boba v0.6.1/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= +github.com/charmbracelet/boba v0.6.2 h1:8jBajZdD4aXBBtznJyiBa2dfsZ3HSsB9i1cCoXouat0= +github.com/charmbracelet/boba v0.6.2/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= github.com/charmbracelet/charm v0.4.1 h1:LJjQUDjeJkMTWmovyYiUzglbbbMBQGoDomqBn22qbpI= github.com/charmbracelet/charm v0.4.1/go.mod h1:bZQON+c4uV9mgbZBvKzH7wA1zGII9Zfg26cL70NYdH0= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= diff --git a/main.go b/main.go index 13c2d71..2ed4457 100644 --- a/main.go +++ b/main.go @@ -166,9 +166,15 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { // TODO: Put this somewhere where it makes more sense if arg == "" { - debug := os.Getenv("GLOW_DEBUG") - if debug != "" { - boba.UseSysLog("glow") + + // Log to a file. For debugging. + logToFilePath := os.Getenv("GLOW_LOG_TO_FILE") + if logToFilePath != "" { + f, err := boba.LogToFile(logToFilePath, "glow") + if err != nil { + return err + } + defer f.Close() } boba.AltScreen() From eba22f08b14ec308ad295b785f37bfb2e7f4abe9 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 21 May 2020 22:29:46 -0400 Subject: [PATCH 255/911] Also set/edit notes in stash view --- ui/pager.go | 2 +- ui/stash.go | 190 ++++++++++++++++++++++++++++++++++++++-------------- ui/ui.go | 28 +++++++- 3 files changed, 166 insertions(+), 54 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 9ed844d..ecd53c9 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -76,7 +76,7 @@ func newPagerModel(glamourStyle string) pagerModel { ti.TextColor = gray ti.BackgroundColor = yellowGreen ti.CursorColor = fuschia - ti.CharLimit = 128 // totally arbitrary + ti.CharLimit = noteCharacterLimit ti.Focus() return pagerModel{ diff --git a/ui/stash.go b/ui/stash.go index e1d9c9b..76bc399 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -11,6 +11,7 @@ import ( "github.com/charmbracelet/boba" "github.com/charmbracelet/boba/paginator" "github.com/charmbracelet/boba/spinner" + "github.com/charmbracelet/boba/textinput" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/dustin/go-humanize" @@ -19,15 +20,18 @@ import ( ) const ( - stashViewItemHeight = 3 - stashViewTopPadding = 5 - stashViewBottomPadding = 4 - stashHorizontalPadding = 6 + stashViewItemHeight = 3 + stashViewTopPadding = 5 + stashViewBottomPadding = 4 + stashViewHorizontalPadding = 6 + setNotePromptText = "Memo: " ) var ( - faintGreen = common.NewColorPair("#2B4A3F", "#ABE5D1") - green = common.NewColorPair("#04B575", "#04B575") + faintGreen = common.NewColorPair("#2B4A3F", "#ABE5D1") + green = common.NewColorPair("#04B575", "#04B575") + dullYellow = common.NewColorPair("#9BA92F", "#6CCCA9") // renders light green on light backgrounds + dullFuchsia = common.NewColorPair("#AD58B4", "#F9ACFF") ) // MSG @@ -41,6 +45,8 @@ type deletedStashedItemMsg int // MODEL +// markdownType allows us to differentiate between the types of markdown +// documents we're dealing with, namely stuff the user stashed versus news. type markdownType int const ( @@ -49,7 +55,7 @@ const ( ) // markdown wraps charm.Markdown so we can differentiate between stashed items -// and news +// and news. type markdown struct { markdownType markdownType *charm.Markdown @@ -70,6 +76,7 @@ const ( stashStateReady stashStatePromptDelete stashStateLoadingDocument + stashStateSettingNote ) type stashLoadedState byte @@ -89,6 +96,7 @@ type stashModel struct { state stashState documents []*markdown spinner spinner.Model + noteInput textinput.Model terminalWidth int terminalHeight int loaded stashLoadedState // what's loaded? we find out with bitmasking @@ -120,6 +128,8 @@ func (m *stashModel) setSize(width, height int) { m.paginator.PerPage = perPage m.paginator.SetTotalPages(len(m.documents)) + m.noteInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - len(setNotePromptText) + // Make sure the page stays in bounds if m.paginator.Page >= m.paginator.TotalPages-1 { m.paginator.Page = max(0, m.paginator.TotalPages-1) @@ -143,9 +153,16 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { p.Type = paginator.Dots p.InactiveDot = common.Subtle("•") + ni := textinput.NewModel() + ni.Prompt = te.String(setNotePromptText).Foreground(common.YellowGreen.Color()).String() + ni.CursorColor = common.Fuschia.String() + ni.CharLimit = noteCharacterLimit // totally arbitrary + ni.Focus() + m := stashModel{ cc: cc, spinner: s, + noteInput: ni, page: 1, paginator: p, } @@ -166,11 +183,11 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { ) switch msg := msg.(type) { - case boba.KeyMsg: - // Don't respond to keystrokes if we're still loading - if m.state == stashStateInit { - return m, nil + // Don't respond to these keystrokes if we're still loading or setting + // a note + if m.state == stashStateInit || m.state == stashStateSettingNote { + break } switch msg.String() { @@ -212,12 +229,24 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { spinner.Tick(m.spinner), ) + // Set note + case "n": + if m.state != stashStateSettingNote && m.state != stashStatePromptDelete { + m.state = stashStateSettingNote + m.noteInput.SetValue(m.documents[m.markdownIndex()].Note) + m.noteInput.CursorEnd() + return m, textinput.Blink(m.noteInput) + } + // Confirm deletion case "x": - if m.documents[m.markdownIndex()].markdownType == userMarkdown { + isUserMarkdown := m.documents[m.markdownIndex()].markdownType == userMarkdown + isValidState := m.state != stashStateSettingNote + if isUserMarkdown && isValidState { m.state = stashStatePromptDelete } + // Deletion confirmed case "y": if m.state != stashStatePromptDelete { break @@ -285,8 +314,8 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { cmds = append(cmds, cmd) } - // A note was set on a document. This happened in the pager, so we'll - // find the corresponding document here and update accordingly. + // A note was set on a document. This may have happened in the pager, so + // we'll find the corresponding document here and update accordingly. case noteSavedMsg: for i := range m.documents { if m.documents[i].ID == msg.ID { @@ -295,7 +324,8 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { } } - if m.state == stashStateReady { + switch m.state { + case stashStateReady: // Update paginator m.paginator, cmd = paginator.Update(msg, m.paginator) @@ -315,6 +345,32 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { cmds = append(cmds, loadStash(m)) } + case stashStateSettingNote: + + if msg, ok := msg.(boba.KeyMsg); ok { + switch msg.String() { + case "q": + fallthrough + case "esc": + // Cancel note + m.state = stashStateReady + m.noteInput.Reset() + case "enter": + // Set new note + doc := m.documents[m.markdownIndex()] + newNote := m.noteInput.Value() + cmd = saveDocumentNote(m.cc, doc.ID, newNote) + doc.Note = newNote + m.noteInput.Reset() + m.state = stashStateReady + return m, cmd + } + } + + // Update the text input component used to set notes + m.noteInput, cmd = textinput.Update(msg, m.noteInput) + cmds = append(cmds, cmd) + } // If an item is being confirmed for delete, any key (other than the key @@ -342,6 +398,8 @@ func stashView(m stashModel) string { s += spinner.View(m.spinner) + " Loading document..." case stashStateReady: fallthrough + case stashStateSettingNote: + fallthrough case stashStatePromptDelete: if len(m.documents) == 0 { s += stashEmtpyView(m) @@ -356,12 +414,13 @@ func stashView(m stashModel) string { blankLines = strings.Repeat("\n", numBlankLines) } - var header string - if m.state == stashStatePromptDelete { + header := "Here’s your markdown stash:" + switch m.state { + case stashStatePromptDelete: header = te.String("Delete this item? ").Foreground(common.Red.Color()).String() + te.String("(y/N)").Foreground(common.FaintRed.Color()).String() - } else { - header = "Here’s your markdown stash:" + case stashStateSettingNote: + header = te.String("Set the memo for this item?").Foreground(common.YellowGreen.Color()).String() } var pagination string @@ -405,13 +464,18 @@ func stashPopulatedView(m stashModel) string { docs := m.documents[start:end] for i, v := range docs { - state := common.StateNormal - if i == m.index && m.state == stashStatePromptDelete { - state = common.StateDeleting - } else if i == m.index { - state = common.StateSelected + state := markdownStateNormal + if i == m.index { + switch m.state { + case stashStatePromptDelete: + state = markdownStateDeleting + case stashStateSettingNote: + state = markdownStateSettingNote + default: + state = markdownStateSelected + } } - s += stashListItemView(*v).render(m.terminalWidth, state) + "\n\n" + s += stashListItemView(*v).render(m, state) + "\n\n" } s = strings.TrimSpace(s) // trim final newlines @@ -433,7 +497,9 @@ func stashHelpView(m stashModel) string { isNews bool = m.documents[m.markdownIndex()].markdownType == newsMarkdown ) - if m.state == stashStatePromptDelete { + if m.state == stashStateSettingNote { + h = append(h, "enter: confirm", "esc: cancel") + } else if m.state == stashStatePromptDelete { h = append(h, "y: delete", "n: cancel") } else { h = append(h, "enter: open") @@ -451,25 +517,36 @@ func stashHelpView(m stashModel) string { return common.HelpView(h...) } -// stashListItemView renders items in the stash view +// markdownState is used in a deterministic fashion to aid rendering stash item +// views. +type markdownState int + +const ( + markdownStateNormal markdownState = iota + markdownStateSelected + markdownStateDeleting + markdownStateSettingNote +) + +// stashListItemView contains methods for rendering an item as it appears in +// the stash view type stashListItemView markdown -func (m stashListItemView) render(width int, state common.State) string { - - var line string - if m.markdownType == newsMarkdown && state != common.StateSelected { - line = te.String("│").Foreground(faintGreen.Color()).String() - } else { - line = common.VerticalLine(state) - } - line += " " +func (m stashListItemView) render(mdl stashModel, state markdownState) string { + // General key color keyColor := common.NoColor + line := common.VerticalLine(common.StateNormal) switch state { - case common.StateSelected: + case markdownStateSettingNote: + keyColor = common.YellowGreen + line = common.VerticalLine(common.StateActive) + case markdownStateSelected: keyColor = common.Fuschia - case common.StateDeleting: + line = common.VerticalLine(common.StateSelected) + case markdownStateDeleting: keyColor = common.Red + line = common.VerticalLine(common.StateDeleting) default: if m.markdownType == newsMarkdown { keyColor = common.Green @@ -477,11 +554,15 @@ func (m stashListItemView) render(width int, state common.State) string { } titleKey := "#" + strconv.Itoa(m.ID) - if m.markdownType == newsMarkdown { - titleKey = "System Announcement" - } - if m.Note != "" { - titleKey += ":" + if state == markdownStateSettingNote { + titleKey = textinput.View(mdl.noteInput) + } else { + if m.markdownType == newsMarkdown { + titleKey = "System Announcement" + } + if m.Note != "" { + titleKey += ":" + } } dateKey := "Stashed:" @@ -489,34 +570,39 @@ func (m stashListItemView) render(width int, state common.State) string { dateKey = "Posted:" } - titleVal := truncate(m.Note, width-(stashHorizontalPadding*2)-len(titleKey)) - titleVal = m.title(titleVal, state) + var titleVal string + if state != markdownStateSettingNote { + titleVal = truncate(m.Note, mdl.terminalWidth-(stashViewHorizontalPadding*2)-len(titleKey)) + titleVal = m.title(titleVal, state) + } titleKey = te.String(titleKey).Foreground(keyColor.Color()).String() dateKey = te.String(dateKey).Foreground(keyColor.Color()).String() dateVal := m.date(state) var s string - s += fmt.Sprintf("%s%s %s\n", line, titleKey, titleVal) - s += fmt.Sprintf("%s%s %s", line, dateKey, dateVal) + s += fmt.Sprintf("%s %s %s\n", line, titleKey, titleVal) + s += fmt.Sprintf("%s %s %s", line, dateKey, dateVal) return s } -func (m stashListItemView) date(state common.State) string { +func (m stashListItemView) date(state markdownState) string { c := common.Indigo - if state == common.StateDeleting { + if state == markdownStateDeleting { c = common.FaintRed + } else if state == markdownStateSettingNote { + c = dullYellow } s := relativeTime(*m.CreatedAt) return te.String(s).Foreground(c.Color()).String() } -func (m stashListItemView) title(title string, state common.State) string { +func (m stashListItemView) title(title string, state markdownState) string { if title == "" { return "" } c := common.Indigo - if state == common.StateDeleting { + if state == markdownStateDeleting { c = common.Red } return te.String(title).Foreground(c.Color()).String() @@ -569,6 +655,8 @@ func deleteStashedItem(cc *charm.Client, id int) boba.Cmd { // ETC +// wrapMarkdowns wraps a *charm.Markdown with a *markdown in order to add some +// extra metadata. func wrapMarkdowns(t markdownType, md []*charm.Markdown) (m []*markdown) { for _, v := range md { m = append(m, &markdown{ diff --git a/ui/ui.go b/ui/ui.go index 82d494f..f990203 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -12,6 +12,10 @@ import ( te "github.com/muesli/termenv" ) +const ( + noteCharacterLimit = 128 // totally arbitrary +) + var ( glowLogoTextColor = common.Color("#ECFD65") ) @@ -50,6 +54,18 @@ const ( stateShowDocument ) +// Stringn translates the staus to a human-readable string. This is just for +// debugging. +func (s state) String() string { + return [...]string{ + "initializing", + "running keygen", + "keygen finished", + "showing stash", + "showing document", + }[s] +} + type model struct { cc *charm.Client user *charm.User @@ -119,8 +135,15 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case "q": fallthrough case "esc": - if m.state == stateShowDocument { - var cmd boba.Cmd + var cmd boba.Cmd + + switch m.state { + case stateShowStash: + if m.stash.state == stashStateSettingNote { + m.stash, cmd = stashUpdate(msg, m.stash) + return m, cmd + } + case stateShowDocument: if m.pager.state == pagerStateBrowse { // Exit pager m.unloadDocument() @@ -130,6 +153,7 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { } return m, cmd } + return m, boba.Quit case "ctrl+c": From 81bcce80c8e55c31f7cfda4da6e18d00d9439f8b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 22 May 2020 09:38:34 -0400 Subject: [PATCH 256/911] Improve stash item deletion cancellation experience --- ui/stash.go | 183 ++++++++++++++++++++++++++-------------------------- ui/ui.go | 11 ++-- 2 files changed, 97 insertions(+), 97 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 76bc399..8747cb2 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -183,95 +183,6 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { ) switch msg := msg.(type) { - case boba.KeyMsg: - // Don't respond to these keystrokes if we're still loading or setting - // a note - if m.state == stashStateInit || m.state == stashStateSettingNote { - break - } - - switch msg.String() { - - case "k": - fallthrough - case "up": - m.index-- - if m.index < 0 && m.paginator.Page == 0 { - // Stop - m.index = 0 - } else if m.index < 0 { - // Go to previous page - m.paginator.PrevPage() - m.index = m.paginator.ItemsOnPage(len(m.documents)) - 1 - } - - case "j": - fallthrough - case "down": - itemsOnPage := m.paginator.ItemsOnPage(len(m.documents)) - m.index++ - if m.index >= itemsOnPage && m.paginator.OnLastPage() { - // Stop - m.index = itemsOnPage - 1 - } else if m.index >= itemsOnPage { - // Go to next page - m.index = 0 - m.paginator.NextPage() - } - - case "enter": - // Load the document from the server. We'll handle the message - // that comes back in the main update function. - m.state = stashStateLoadingDocument - doc := m.documents[m.markdownIndex()] - cmds = append(cmds, - loadStashedItem(m.cc, doc.ID, doc.markdownType), - spinner.Tick(m.spinner), - ) - - // Set note - case "n": - if m.state != stashStateSettingNote && m.state != stashStatePromptDelete { - m.state = stashStateSettingNote - m.noteInput.SetValue(m.documents[m.markdownIndex()].Note) - m.noteInput.CursorEnd() - return m, textinput.Blink(m.noteInput) - } - - // Confirm deletion - case "x": - isUserMarkdown := m.documents[m.markdownIndex()].markdownType == userMarkdown - isValidState := m.state != stashStateSettingNote - if isUserMarkdown && isValidState { - m.state = stashStatePromptDelete - } - - // Deletion confirmed - case "y": - if m.state != stashStatePromptDelete { - break - } - // Deletion confirmed. Delete the stashed item... - - // Index of the documents slice we'll be deleting - i := m.paginator.Page*m.paginator.PerPage + m.index - - // ID of the item we'll be deleting - id := m.documents[i].ID - - // Delete optimistically and remove the stashed item - // before we've received a success response. - m.documents = append(m.documents[:i], m.documents[i+1:]...) - - // Update pagination - m.paginator.SetTotalPages(len(m.documents)) - m.paginator.Page = min(m.paginator.Page, m.paginator.TotalPages-1) - - // Set state and delete - m.state = stashStateReady - return m, deleteStashedItem(m.cc, id) - } - case stashErrMsg: m.err = msg @@ -326,6 +237,66 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { switch m.state { case stashStateReady: + if msg, ok := msg.(boba.KeyMsg); ok { + switch msg.String() { + + case "k": + fallthrough + case "up": + m.index-- + if m.index < 0 && m.paginator.Page == 0 { + // Stop + m.index = 0 + } else if m.index < 0 { + // Go to previous page + m.paginator.PrevPage() + m.index = m.paginator.ItemsOnPage(len(m.documents)) - 1 + } + + case "j": + fallthrough + case "down": + itemsOnPage := m.paginator.ItemsOnPage(len(m.documents)) + m.index++ + if m.index >= itemsOnPage && m.paginator.OnLastPage() { + // Stop + m.index = itemsOnPage - 1 + } else if m.index >= itemsOnPage { + // Go to next page + m.index = 0 + m.paginator.NextPage() + } + + // Open document + case "enter": + // Load the document from the server. We'll handle the message + // that comes back in the main update function. + m.state = stashStateLoadingDocument + doc := m.documents[m.markdownIndex()] + cmds = append(cmds, + loadStashedItem(m.cc, doc.ID, doc.markdownType), + spinner.Tick(m.spinner), + ) + + // Set note + case "n": + if m.state != stashStateSettingNote && m.state != stashStatePromptDelete { + m.state = stashStateSettingNote + m.noteInput.SetValue(m.documents[m.markdownIndex()].Note) + m.noteInput.CursorEnd() + return m, textinput.Blink(m.noteInput) + } + + // Prompt for deletion + case "x": + isUserMarkdown := m.documents[m.markdownIndex()].markdownType == userMarkdown + isValidState := m.state != stashStateSettingNote + if isUserMarkdown && isValidState { + m.state = stashStatePromptDelete + } + + } + } // Update paginator m.paginator, cmd = paginator.Update(msg, m.paginator) @@ -345,6 +316,36 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { cmds = append(cmds, loadStash(m)) } + case stashStatePromptDelete: + if msg, ok := msg.(boba.KeyMsg); ok { + switch msg.String() { + + // Confirm deletion + case "y": + if m.state != stashStatePromptDelete { + break + } + + i := m.markdownIndex() + id := m.documents[i].ID + + // Delete optimistically and remove the stashed item + // before we've received a success response. + m.documents = append(m.documents[:i], m.documents[i+1:]...) + + // Update pagination + m.paginator.SetTotalPages(len(m.documents)) + m.paginator.Page = min(m.paginator.Page, m.paginator.TotalPages-1) + + // Set state and delete + m.state = stashStateReady + return m, deleteStashedItem(m.cc, id) + + default: + m.state = stashStateReady + } + } + case stashStateSettingNote: if msg, ok := msg.(boba.KeyMsg); ok { @@ -375,10 +376,6 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { // If an item is being confirmed for delete, any key (other than the key // used for confirmation above) cancels the deletion - k, ok := msg.(boba.KeyMsg) - if ok && k.String() != "x" && m.state == stashStatePromptDelete { - m.state = stashStateReady - } return m, boba.Batch(cmds...) } diff --git a/ui/ui.go b/ui/ui.go index f990203..f9ff54a 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -139,16 +139,19 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { switch m.state { case stateShowStash: - if m.stash.state == stashStateSettingNote { + + switch m.stash.state { + case stashStateSettingNote: + fallthrough + case stashStatePromptDelete: m.stash, cmd = stashUpdate(msg, m.stash) return m, cmd } + case stateShowDocument: if m.pager.state == pagerStateBrowse { - // Exit pager - m.unloadDocument() + m.unloadDocument() // exits pager } else { - // Pass message through to pager m.pager, cmd = pagerUpdate(msg, m.pager) } return m, cmd From b46400144661cea1ec761aceba066513cc7b52be Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 22 May 2020 11:46:44 -0400 Subject: [PATCH 257/911] Bump boba dependency --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8d7aa8b..a7920e3 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/boba v0.6.2 + github.com/charmbracelet/boba v0.6.3 github.com/charmbracelet/charm v0.4.1 github.com/charmbracelet/glamour v0.2.0 github.com/charmbracelet/tea v0.3.0 diff --git a/go.sum b/go.sum index a1cd7e2..1e6d553 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/boba v0.5.0/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= -github.com/charmbracelet/boba v0.6.2 h1:8jBajZdD4aXBBtznJyiBa2dfsZ3HSsB9i1cCoXouat0= -github.com/charmbracelet/boba v0.6.2/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= +github.com/charmbracelet/boba v0.6.3 h1:3YisdYQ35tieYXbfpf8acdVN6d1DJHGKZc5kDJNkjg0= +github.com/charmbracelet/boba v0.6.3/go.mod h1:9TUvThAOqjXWYZGOrZ4qyluTrmodxb8SqNR81BJluOU= github.com/charmbracelet/charm v0.4.1 h1:LJjQUDjeJkMTWmovyYiUzglbbbMBQGoDomqBn22qbpI= github.com/charmbracelet/charm v0.4.1/go.mod h1:bZQON+c4uV9mgbZBvKzH7wA1zGII9Zfg26cL70NYdH0= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= From e069be7af9f5d3f46debd3c87bd087a5858046fe Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 22 May 2020 11:50:40 -0400 Subject: [PATCH 258/911] Bump charm dependency to master --- go.mod | 2 +- go.sum | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index a7920e3..8cdf8e5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/boba v0.6.3 - github.com/charmbracelet/charm v0.4.1 + github.com/charmbracelet/charm v0.4.2-0.20200522154917-0a1ba5ae4e28 github.com/charmbracelet/glamour v0.2.0 github.com/charmbracelet/tea v0.3.0 github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d diff --git a/go.sum b/go.sum index 1e6d553..0747fd7 100644 --- a/go.sum +++ b/go.sum @@ -15,11 +15,11 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/boba v0.5.0/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= +github.com/charmbracelet/boba v0.6.1/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= github.com/charmbracelet/boba v0.6.3 h1:3YisdYQ35tieYXbfpf8acdVN6d1DJHGKZc5kDJNkjg0= github.com/charmbracelet/boba v0.6.3/go.mod h1:9TUvThAOqjXWYZGOrZ4qyluTrmodxb8SqNR81BJluOU= -github.com/charmbracelet/charm v0.4.1 h1:LJjQUDjeJkMTWmovyYiUzglbbbMBQGoDomqBn22qbpI= -github.com/charmbracelet/charm v0.4.1/go.mod h1:bZQON+c4uV9mgbZBvKzH7wA1zGII9Zfg26cL70NYdH0= +github.com/charmbracelet/charm v0.4.2-0.20200522154917-0a1ba5ae4e28 h1:qwEm+kLHiDuqZPMZIEDjYRdXYKfn7B9ZRBPI/ERTMrA= +github.com/charmbracelet/charm v0.4.2-0.20200522154917-0a1ba5ae4e28/go.mod h1:xZgRIZCddA0IAmbsR4zk4HHCj4Z1PLvQcqcZqtk0Pzo= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= github.com/charmbracelet/tea v0.2.0/go.mod h1:lADjwO2mMub9qvXSCA9vAkabVWO0HeUrv4uO/lG3C+k= @@ -179,7 +179,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200430202703-d923437fa56d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From ddef264606b8ffcdd29fd43865deb199bd343239 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 22 May 2020 14:03:21 -0400 Subject: [PATCH 259/911] Don't quit on "fatal" errors --- ui/ui.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index f9ff54a..10381ef 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -2,6 +2,7 @@ package ui import ( "errors" + "fmt" "github.com/charmbracelet/boba" "github.com/charmbracelet/boba/spinner" @@ -27,7 +28,6 @@ func NewProgram(style string) *boba.Program { // MESSAGES -type fatalErrMsg error type errMsg error type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} @@ -120,7 +120,9 @@ func initialize(style string) func() (boba.Model, boba.Cmd) { func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { m, ok := mdl.(model) if !ok { - return model{err: errors.New("could not perform assertion on model in update")}, boba.Quit + return model{ + err: errors.New("could not perform assertion on model in update"), + }, boba.Quit } var ( @@ -132,6 +134,8 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case boba.KeyMsg: switch msg.String() { + case "f": + m.err = errors.New("Fatal.") case "q": fallthrough case "esc": @@ -167,10 +171,6 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { return m, getTerminalSize() } - case fatalErrMsg: - m.err = msg - return m, boba.Quit - case errMsg: m.err = msg return m, nil @@ -279,7 +279,7 @@ func view(mdl boba.Model) string { } if m.err != nil { - return m.err.Error() + "\n" + return fmt.Sprintf("\nError: %v\n\nPress q to exit.", m.err) } var s string @@ -316,14 +316,14 @@ func getTerminalSize() boba.Cmd { func newCharmClient() boba.Msg { cfg, err := charm.ConfigFromEnv() if err != nil { - return fatalErrMsg(err) + return errMsg(err) } cc, err := charm.NewClient(cfg) if err == charm.ErrMissingSSHAuth { return sshAuthErrMsg{} } else if err != nil { - return fatalErrMsg(err) + return errMsg(err) } return newCharmClientMsg(cc) From e5663a5912d10fb76a3250a25a854b18de04b879 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 22 May 2020 14:40:14 -0400 Subject: [PATCH 260/911] Set note character limit to 256 to match the database --- ui/ui.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/ui.go b/ui/ui.go index 10381ef..6019d96 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -14,7 +14,7 @@ import ( ) const ( - noteCharacterLimit = 128 // totally arbitrary + noteCharacterLimit = 256 // totally arbitrary ) var ( From 9bee37ee93b3d8884887c1974b499b35ee625950 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 22 May 2020 15:31:54 -0400 Subject: [PATCH 261/911] Fetch and render news markdown --- go.mod | 2 +- go.sum | 4 ++-- ui/stash.go | 21 +++++++++++++++------ ui/ui.go | 4 +--- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 8cdf8e5..1231bed 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/boba v0.6.3 - github.com/charmbracelet/charm v0.4.2-0.20200522154917-0a1ba5ae4e28 + github.com/charmbracelet/charm v0.4.2-0.20200522192006-ce78aabf4b25 github.com/charmbracelet/glamour v0.2.0 github.com/charmbracelet/tea v0.3.0 github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d diff --git a/go.sum b/go.sum index 0747fd7..385fa60 100644 --- a/go.sum +++ b/go.sum @@ -18,8 +18,8 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/charmbracelet/boba v0.6.1/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= github.com/charmbracelet/boba v0.6.3 h1:3YisdYQ35tieYXbfpf8acdVN6d1DJHGKZc5kDJNkjg0= github.com/charmbracelet/boba v0.6.3/go.mod h1:9TUvThAOqjXWYZGOrZ4qyluTrmodxb8SqNR81BJluOU= -github.com/charmbracelet/charm v0.4.2-0.20200522154917-0a1ba5ae4e28 h1:qwEm+kLHiDuqZPMZIEDjYRdXYKfn7B9ZRBPI/ERTMrA= -github.com/charmbracelet/charm v0.4.2-0.20200522154917-0a1ba5ae4e28/go.mod h1:xZgRIZCddA0IAmbsR4zk4HHCj4Z1PLvQcqcZqtk0Pzo= +github.com/charmbracelet/charm v0.4.2-0.20200522192006-ce78aabf4b25 h1:ZQUYsUAskkhwkMOq1I7NlrfDwHtCwi5HspFa5O+Z4ug= +github.com/charmbracelet/charm v0.4.2-0.20200522192006-ce78aabf4b25/go.mod h1:xZgRIZCddA0IAmbsR4zk4HHCj4Z1PLvQcqcZqtk0Pzo= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= github.com/charmbracelet/tea v0.2.0/go.mod h1:lADjwO2mMub9qvXSCA9vAkabVWO0HeUrv4uO/lG3C+k= diff --git a/ui/stash.go b/ui/stash.go index 8747cb2..5c2ba19 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -40,7 +40,7 @@ type stashErrMsg error type stashSpinnerTickMsg struct{} type gotStashMsg []*charm.Markdown type gotNewsMsg []*charm.Markdown -type gotStashedItemMsg *markdown +type fetchedMarkdownMsg *markdown type deletedStashedItemMsg int // MODEL @@ -273,8 +273,9 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { // that comes back in the main update function. m.state = stashStateLoadingDocument doc := m.documents[m.markdownIndex()] + cmds = append(cmds, - loadStashedItem(m.cc, doc.ID, doc.markdownType), + loadMarkdown(m.cc, doc.ID, doc.markdownType), spinner.Tick(m.spinner), ) @@ -627,14 +628,22 @@ func loadNews(m stashModel) boba.Cmd { } } -func loadStashedItem(cc *charm.Client, id int, t markdownType) boba.Cmd { +func loadMarkdown(cc *charm.Client, id int, t markdownType) boba.Cmd { return func() boba.Msg { - md, err := cc.GetStashMarkdown(id) + var ( + md *charm.Markdown + err error + ) + if t == userMarkdown { + md, err = cc.GetStashMarkdown(id) + } else { + md, err = cc.GetNewsMarkdown(id) + } if err != nil { return stashErrMsg(err) } - return gotStashedItemMsg(&markdown{ - markdownType: t, + return fetchedMarkdownMsg(&markdown{ + markdownType: userMarkdown, Markdown: md, }) } diff --git a/ui/ui.go b/ui/ui.go index 6019d96..40f9fac 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -232,9 +232,7 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { m.pager.cc = msg cmds = append(cmds, cmd) - case gotStashedItemMsg: - // Loaded markdown document from the server. We'll render it before - // loading it into the pager. + case fetchedMarkdownMsg: m.pager.currentDocument = msg cmds = append(cmds, renderWithGlamour(m.pager, msg.Body)) From 93e8370b2a555a590dd4884de3ffe367bbcf8884 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 22 May 2020 15:37:34 -0400 Subject: [PATCH 262/911] Whoops, remove thing where pressing f would synthesize an error --- go.mod | 2 ++ ui/ui.go | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 1231bed..7fa0316 100644 --- a/go.mod +++ b/go.mod @@ -18,3 +18,5 @@ require ( golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 ) + +replace github.com/charmbracelet/charm => ../charm diff --git a/ui/ui.go b/ui/ui.go index 40f9fac..273e778 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -134,8 +134,6 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case boba.KeyMsg: switch msg.String() { - case "f": - m.err = errors.New("Fatal.") case "q": fallthrough case "esc": From c66351127c585cfe8cf330f6b89e9b7eaa692e22 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 22 May 2020 15:47:36 -0400 Subject: [PATCH 263/911] Remove replace directive in go.mod --- go.mod | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.mod b/go.mod index 7fa0316..1231bed 100644 --- a/go.mod +++ b/go.mod @@ -18,5 +18,3 @@ require ( golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 ) - -replace github.com/charmbracelet/charm => ../charm From 251aacf79a867a1caa0f842b79f04fe049c0bc9e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 22 May 2020 16:01:23 -0400 Subject: [PATCH 264/911] Fix markdown sorting error --- ui/stash.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 5c2ba19..edcc814 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -141,6 +141,13 @@ func (m stashModel) markdownIndex() int { return m.paginator.Page*m.paginator.PerPage + m.index } +// addMarkdowns adds markdown documents to the model +func (m *stashModel) addMarkdowns(mds ...*markdown) { + m.documents = append(m.documents, mds...) + sort.Sort(markdownsByCreatedAtDesc(m.documents)) + m.paginator.SetTotalPages(len(m.documents)) +} + // INIT func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { @@ -197,9 +204,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { } docs := wrapMarkdowns(userMarkdown, msg) - sort.Sort(markdownsByCreatedAtDesc(docs)) // sort by date - m.documents = append(m.documents, docs...) - m.paginator.SetTotalPages(len(m.documents)) + m.addMarkdowns(docs...) m.loaded |= loadedStash if m.loaded.done() { @@ -209,9 +214,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case gotNewsMsg: if len(msg) > 0 { docs := wrapMarkdowns(newsMarkdown, msg) - sort.Sort(markdownsByCreatedAtDesc(docs)) - m.documents = append(m.documents, docs...) - m.paginator.SetTotalPages(len(m.documents)) + m.addMarkdowns(docs...) } m.loaded |= loadedNews From 4f250ebb814d57160b6cffc4567c1885ff293fdf Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 22 May 2020 16:06:48 -0400 Subject: [PATCH 265/911] Render all errors at the main view level --- ui/pager.go | 11 +++-------- ui/stash.go | 16 ++++------------ 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index ecd53c9..3e66ef2 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -39,7 +39,6 @@ var ( // MSG -type pagerErrMsg error type contentRenderedMsg string type noteSavedMsg *charm.Markdown @@ -53,7 +52,6 @@ const ( ) type pagerModel struct { - err error cc *charm.Client viewport viewport.Model state pagerState @@ -159,9 +157,6 @@ func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { } } - case pagerErrMsg: - m.err = msg - // Glow has rendered the content case contentRenderedMsg: m.setContent(string(msg)) @@ -171,7 +166,7 @@ func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { // after a resize case terminalSizeMsg: if msg.Error() != nil { - m.err = msg.Error() + // This will be caught at the top level return m, nil } @@ -261,12 +256,12 @@ func renderWithGlamour(m pagerModel, md string) boba.Cmd { func saveDocumentNote(cc *charm.Client, id int, note string) boba.Cmd { if cc == nil { return func() boba.Msg { - return pagerErrMsg(errors.New("can't set note; no charm client")) + return errMsg(errors.New("can't set note; no charm client")) } } return func() boba.Msg { if err := cc.SetMarkdownNote(id, note); err != nil { - return pagerErrMsg(err) + return errMsg(err) } return noteSavedMsg(&charm.Markdown{ID: id, Note: note}) } diff --git a/ui/stash.go b/ui/stash.go index edcc814..bf6c891 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -36,7 +36,6 @@ var ( // MSG -type stashErrMsg error type stashSpinnerTickMsg struct{} type gotStashMsg []*charm.Markdown type gotNewsMsg []*charm.Markdown @@ -92,7 +91,6 @@ const ( type stashModel struct { cc *charm.Client - err error state stashState documents []*markdown spinner spinner.Model @@ -190,8 +188,6 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { ) switch msg := msg.(type) { - case stashErrMsg: - m.err = msg // Stash results have come in from the server case gotStashMsg: @@ -387,10 +383,6 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { // VIEW func stashView(m stashModel) string { - if m.err != nil { - return "\n" + m.err.Error() - } - var s string switch m.state { case stashStateInit: @@ -615,7 +607,7 @@ func loadStash(m stashModel) boba.Cmd { return func() boba.Msg { stash, err := m.cc.GetStash(m.page) if err != nil { - return stashErrMsg(err) + return errMsg(err) } return gotStashMsg(stash) } @@ -625,7 +617,7 @@ func loadNews(m stashModel) boba.Cmd { return func() boba.Msg { news, err := m.cc.GetNews(1) // just fetch the first page if err != nil { - return stashErrMsg(err) + return errMsg(err) } return gotNewsMsg(news) } @@ -643,7 +635,7 @@ func loadMarkdown(cc *charm.Client, id int, t markdownType) boba.Cmd { md, err = cc.GetNewsMarkdown(id) } if err != nil { - return stashErrMsg(err) + return errMsg(err) } return fetchedMarkdownMsg(&markdown{ markdownType: userMarkdown, @@ -656,7 +648,7 @@ func deleteStashedItem(cc *charm.Client, id int) boba.Cmd { return func() boba.Msg { err := cc.DeleteMarkdown(id) if err != nil { - return stashErrMsg(err) + return errMsg(err) } return deletedStashedItemMsg(id) } From 414040400a6c462388e353784f1267fea4eba51f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 22 May 2020 16:28:15 -0400 Subject: [PATCH 266/911] Don't allow note-setting on news --- ui/stash.go | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index bf6c891..e02d14d 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -139,6 +139,11 @@ func (m stashModel) markdownIndex() int { return m.paginator.Page*m.paginator.PerPage + m.index } +// return the current selected markdown in the stash +func (m stashModel) selectedMarkdown() *markdown { + return m.documents[m.markdownIndex()] +} + // addMarkdowns adds markdown documents to the model func (m *stashModel) addMarkdowns(mds ...*markdown) { m.documents = append(m.documents, mds...) @@ -271,26 +276,32 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { // Load the document from the server. We'll handle the message // that comes back in the main update function. m.state = stashStateLoadingDocument - doc := m.documents[m.markdownIndex()] + md := m.selectedMarkdown() cmds = append(cmds, - loadMarkdown(m.cc, doc.ID, doc.markdownType), + loadMarkdown(m.cc, md.ID, md.markdownType), spinner.Tick(m.spinner), ) // Set note case "n": - if m.state != stashStateSettingNote && m.state != stashStatePromptDelete { + md := m.selectedMarkdown() + isUserMarkdown := md.markdownType == userMarkdown + isSettingNote := m.state == stashStateSettingNote + isPromptingDelete := m.state == stashStatePromptDelete + + if isUserMarkdown && !isSettingNote && !isPromptingDelete { m.state = stashStateSettingNote - m.noteInput.SetValue(m.documents[m.markdownIndex()].Note) + m.noteInput.SetValue(md.Note) m.noteInput.CursorEnd() return m, textinput.Blink(m.noteInput) } // Prompt for deletion case "x": - isUserMarkdown := m.documents[m.markdownIndex()].markdownType == userMarkdown + isUserMarkdown := m.selectedMarkdown().markdownType == userMarkdown isValidState := m.state != stashStateSettingNote + if isUserMarkdown && isValidState { m.state = stashStatePromptDelete } @@ -638,7 +649,7 @@ func loadMarkdown(cc *charm.Client, id int, t markdownType) boba.Cmd { return errMsg(err) } return fetchedMarkdownMsg(&markdown{ - markdownType: userMarkdown, + markdownType: t, Markdown: md, }) } From 4acb642b157e8fad09455eb009b6eb6cbffbd75a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 22 May 2020 18:42:18 -0400 Subject: [PATCH 267/911] Let's just call documents "markdowns" --- ui/stash.go | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index e02d14d..74b1824 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -92,7 +92,7 @@ const ( type stashModel struct { cc *charm.Client state stashState - documents []*markdown + markdowns []*markdown spinner spinner.Model noteInput textinput.Model terminalWidth int @@ -124,7 +124,7 @@ func (m *stashModel) setSize(width, height int) { // Update the paginator perPage := max(1, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)/stashViewItemHeight) m.paginator.PerPage = perPage - m.paginator.SetTotalPages(len(m.documents)) + m.paginator.SetTotalPages(len(m.markdowns)) m.noteInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - len(setNotePromptText) @@ -141,14 +141,14 @@ func (m stashModel) markdownIndex() int { // return the current selected markdown in the stash func (m stashModel) selectedMarkdown() *markdown { - return m.documents[m.markdownIndex()] + return m.markdowns[m.markdownIndex()] } -// addMarkdowns adds markdown documents to the model +// addDocuments adds markdown documents to the model func (m *stashModel) addMarkdowns(mds ...*markdown) { - m.documents = append(m.documents, mds...) - sort.Sort(markdownsByCreatedAtDesc(m.documents)) - m.paginator.SetTotalPages(len(m.documents)) + m.markdowns = append(m.markdowns, mds...) + sort.Sort(markdownsByCreatedAtDesc(m.markdowns)) + m.paginator.SetTotalPages(len(m.markdowns)) } // INIT @@ -166,7 +166,7 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { ni := textinput.NewModel() ni.Prompt = te.String(setNotePromptText).Foreground(common.YellowGreen.Color()).String() ni.CursorColor = common.Fuschia.String() - ni.CharLimit = noteCharacterLimit // totally arbitrary + ni.CharLimit = noteCharacterLimit ni.Focus() m := stashModel{ @@ -232,9 +232,9 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { // A note was set on a document. This may have happened in the pager, so // we'll find the corresponding document here and update accordingly. case noteSavedMsg: - for i := range m.documents { - if m.documents[i].ID == msg.ID { - m.documents[i].Note = msg.Note + for i := range m.markdowns { + if m.markdowns[i].ID == msg.ID { + m.markdowns[i].Note = msg.Note } } } @@ -254,13 +254,13 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { } else if m.index < 0 { // Go to previous page m.paginator.PrevPage() - m.index = m.paginator.ItemsOnPage(len(m.documents)) - 1 + m.index = m.paginator.ItemsOnPage(len(m.markdowns)) - 1 } case "j": fallthrough case "down": - itemsOnPage := m.paginator.ItemsOnPage(len(m.documents)) + itemsOnPage := m.paginator.ItemsOnPage(len(m.markdowns)) m.index++ if m.index >= itemsOnPage && m.paginator.OnLastPage() { // Stop @@ -314,7 +314,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { cmds = append(cmds, cmd) // Keep the index in bounds when paginating - itemsOnPage := m.paginator.ItemsOnPage(len(m.documents)) + itemsOnPage := m.paginator.ItemsOnPage(len(m.markdowns)) if m.index > itemsOnPage-1 { m.index = itemsOnPage - 1 } @@ -338,14 +338,14 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { } i := m.markdownIndex() - id := m.documents[i].ID + id := m.markdowns[i].ID // Delete optimistically and remove the stashed item // before we've received a success response. - m.documents = append(m.documents[:i], m.documents[i+1:]...) + m.markdowns = append(m.markdowns[:i], m.markdowns[i+1:]...) // Update pagination - m.paginator.SetTotalPages(len(m.documents)) + m.paginator.SetTotalPages(len(m.markdowns)) m.paginator.Page = min(m.paginator.Page, m.paginator.TotalPages-1) // Set state and delete @@ -369,10 +369,10 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { m.noteInput.Reset() case "enter": // Set new note - doc := m.documents[m.markdownIndex()] + md := m.selectedMarkdown() newNote := m.noteInput.Value() - cmd = saveDocumentNote(m.cc, doc.ID, newNote) - doc.Note = newNote + cmd = saveDocumentNote(m.cc, md.ID, newNote) + md.Note = newNote m.noteInput.Reset() m.state = stashStateReady return m, cmd @@ -405,7 +405,7 @@ func stashView(m stashModel) string { case stashStateSettingNote: fallthrough case stashStatePromptDelete: - if len(m.documents) == 0 { + if len(m.markdowns) == 0 { s += stashEmtpyView(m) break } @@ -464,8 +464,8 @@ func stashEmtpyView(m stashModel) string { func stashPopulatedView(m stashModel) string { var s string - start, end := m.paginator.GetSliceBounds(len(m.documents)) - docs := m.documents[start:end] + start, end := m.paginator.GetSliceBounds(len(m.markdowns)) + docs := m.markdowns[start:end] for i, v := range docs { state := markdownStateNormal @@ -486,7 +486,7 @@ func stashPopulatedView(m stashModel) string { // If there aren't enough items to fill up this page (always the last page) // then we need to add some newlines to fill up the space to push the // footer stuff down elsewhere. - itemsOnPage := m.paginator.ItemsOnPage(len(m.documents)) + itemsOnPage := m.paginator.ItemsOnPage(len(m.markdowns)) if itemsOnPage < m.paginator.PerPage { n := (m.paginator.PerPage - itemsOnPage) * stashViewItemHeight s += strings.Repeat("\n", n) @@ -498,7 +498,7 @@ func stashPopulatedView(m stashModel) string { func stashHelpView(m stashModel) string { var ( h []string - isNews bool = m.documents[m.markdownIndex()].markdownType == newsMarkdown + isNews bool = m.selectedMarkdown().markdownType == newsMarkdown ) if m.state == stashStateSettingNote { @@ -507,7 +507,7 @@ func stashHelpView(m stashModel) string { h = append(h, "y: delete", "n: cancel") } else { h = append(h, "enter: open") - if len(m.documents) > 0 { + if len(m.markdowns) > 0 { h = append(h, "j/k, ↑/↓: choose") } if m.paginator.TotalPages > 1 { From 0407c7d9904563d5a1b2e190c855773f12945718 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 22 May 2020 18:49:27 -0400 Subject: [PATCH 268/911] Update to Charm v0.5.0 for a new, thread-safe Charm client --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1231bed..410514e 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/boba v0.6.3 - github.com/charmbracelet/charm v0.4.2-0.20200522192006-ce78aabf4b25 + github.com/charmbracelet/charm v0.5.0 github.com/charmbracelet/glamour v0.2.0 github.com/charmbracelet/tea v0.3.0 github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d diff --git a/go.sum b/go.sum index 385fa60..4247027 100644 --- a/go.sum +++ b/go.sum @@ -18,8 +18,8 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/charmbracelet/boba v0.6.1/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= github.com/charmbracelet/boba v0.6.3 h1:3YisdYQ35tieYXbfpf8acdVN6d1DJHGKZc5kDJNkjg0= github.com/charmbracelet/boba v0.6.3/go.mod h1:9TUvThAOqjXWYZGOrZ4qyluTrmodxb8SqNR81BJluOU= -github.com/charmbracelet/charm v0.4.2-0.20200522192006-ce78aabf4b25 h1:ZQUYsUAskkhwkMOq1I7NlrfDwHtCwi5HspFa5O+Z4ug= -github.com/charmbracelet/charm v0.4.2-0.20200522192006-ce78aabf4b25/go.mod h1:xZgRIZCddA0IAmbsR4zk4HHCj4Z1PLvQcqcZqtk0Pzo= +github.com/charmbracelet/charm v0.5.0 h1:4GUkDyDOMgzGaTjSB97uyvH5rfxQeDTLPTr9xpKojsQ= +github.com/charmbracelet/charm v0.5.0/go.mod h1:xZgRIZCddA0IAmbsR4zk4HHCj4Z1PLvQcqcZqtk0Pzo= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= github.com/charmbracelet/tea v0.2.0/go.mod h1:lADjwO2mMub9qvXSCA9vAkabVWO0HeUrv4uO/lG3C+k= From 28f8f185d7cb047d4434e592d8be909170501dfd Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 25 May 2020 11:25:35 -0400 Subject: [PATCH 269/911] Make `--force-key`/`-f` a persistent flag, like `--identity` --- main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 2ed4457..b02c471 100644 --- a/main.go +++ b/main.go @@ -279,7 +279,8 @@ func init() { rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") rootCmd.PersistentFlags().StringVarP(&identityFile, "identity", "i", "", "path to identity file (that is, an ssh private key)") - rootCmd.Flags().BoolVarP(&forceKey, "force-key", "f", false, "for the use of the SSH key on disk (that is, ignore ssh-agent)") + rootCmd.PersistentFlags().BoolVarP(&forceKey, "force-key", "f", false, "for the use of the SSH key on disk (that is, ignore ssh-agent)") + stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") rootCmd.AddCommand(stashCmd, stashListCmd, stashGetCmd, stashDeleteCmd) From 05a56388a9743af5e80cf5618b5db51ac43de764 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 25 May 2020 11:45:56 -0400 Subject: [PATCH 270/911] Comments --- main.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index b02c471..363c984 100644 --- a/main.go +++ b/main.go @@ -164,7 +164,7 @@ func execute(cmd *cobra.Command, args []string) error { func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { - // TODO: Put this somewhere where it makes more sense + // Only run TUI if there are no arguments (excluding flags) if arg == "" { // Log to a file. For debugging. @@ -274,14 +274,16 @@ func init() { } rootCmd.Version = Version + // "Glow Classic" cli arguments rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") rootCmd.Flags().StringVarP(&style, "style", "s", "auto", "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") + // For network-related operations, namely stashing and the TUI rootCmd.PersistentFlags().StringVarP(&identityFile, "identity", "i", "", "path to identity file (that is, an ssh private key)") rootCmd.PersistentFlags().BoolVarP(&forceKey, "force-key", "f", false, "for the use of the SSH key on disk (that is, ignore ssh-agent)") + // Stash stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") - rootCmd.AddCommand(stashCmd, stashListCmd, stashGetCmd, stashDeleteCmd) } From 964be85e6dc76340fbc22ab06db0d7e531cad8a2 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 25 May 2020 13:05:32 -0400 Subject: [PATCH 271/911] Parse subcommands before main command arguments int the CLI --- main.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index 363c984..acc5a8e 100644 --- a/main.go +++ b/main.go @@ -30,11 +30,12 @@ var ( width uint rootCmd = &cobra.Command{ - Use: "glow SOURCE", - Short: "Render markdown on the CLI, with pizzazz!", - SilenceErrors: false, - SilenceUsage: false, - RunE: execute, + Use: "glow SOURCE", + Short: "Render markdown on the CLI, with pizzazz!", + SilenceErrors: false, + SilenceUsage: false, + TraverseChildren: true, + RunE: execute, } ) From 56ab8e5309ee540d2bb915589564dd92d5b9c7b6 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 26 May 2020 11:51:08 -0400 Subject: [PATCH 272/911] Rework stash design and simplify code --- ui/stash.go | 120 ++---------------------------------------------- ui/stashitem.go | 82 +++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 115 deletions(-) create mode 100644 ui/stashitem.go diff --git a/ui/stash.go b/ui/stash.go index 74b1824..a0ee9de 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -4,7 +4,6 @@ import ( "fmt" "math" "sort" - "strconv" "strings" "time" @@ -27,13 +26,6 @@ const ( setNotePromptText = "Memo: " ) -var ( - faintGreen = common.NewColorPair("#2B4A3F", "#ABE5D1") - green = common.NewColorPair("#04B575", "#04B575") - dullYellow = common.NewColorPair("#9BA92F", "#6CCCA9") // renders light green on light backgrounds - dullFuchsia = common.NewColorPair("#AD58B4", "#F9ACFF") -) - // MSG type stashSpinnerTickMsg struct{} @@ -437,7 +429,7 @@ func stashView(m stashModel) string { } s += fmt.Sprintf( - "%s\n\n%s\n\n%s\n\n%s%s\n\n%s", + " %s\n\n %s\n\n%s\n\n%s %s\n\n %s", glowLogoView(" Glow "), header, stashPopulatedView(m), @@ -446,7 +438,7 @@ func stashView(m stashModel) string { stashHelpView(m), ) } - return "\n" + indent.String(s, 2) + return "\n" + indent.String(s, 1) } func glowLogoView(text string) string { @@ -467,21 +459,10 @@ func stashPopulatedView(m stashModel) string { start, end := m.paginator.GetSliceBounds(len(m.markdowns)) docs := m.markdowns[start:end] - for i, v := range docs { - state := markdownStateNormal - if i == m.index { - switch m.state { - case stashStatePromptDelete: - state = markdownStateDeleting - case stashStateSettingNote: - state = markdownStateSettingNote - default: - state = markdownStateSelected - } - } - s += stashListItemView(*v).render(m, state) + "\n\n" + for i, md := range docs { + s += stashItemView(m, i, md) + "\n\n" } - s = strings.TrimSpace(s) // trim final newlines + s = strings.TrimRight(s, "\n") // If there aren't enough items to fill up this page (always the last page) // then we need to add some newlines to fill up the space to push the @@ -521,97 +502,6 @@ func stashHelpView(m stashModel) string { return common.HelpView(h...) } -// markdownState is used in a deterministic fashion to aid rendering stash item -// views. -type markdownState int - -const ( - markdownStateNormal markdownState = iota - markdownStateSelected - markdownStateDeleting - markdownStateSettingNote -) - -// stashListItemView contains methods for rendering an item as it appears in -// the stash view -type stashListItemView markdown - -func (m stashListItemView) render(mdl stashModel, state markdownState) string { - - // General key color - keyColor := common.NoColor - line := common.VerticalLine(common.StateNormal) - switch state { - case markdownStateSettingNote: - keyColor = common.YellowGreen - line = common.VerticalLine(common.StateActive) - case markdownStateSelected: - keyColor = common.Fuschia - line = common.VerticalLine(common.StateSelected) - case markdownStateDeleting: - keyColor = common.Red - line = common.VerticalLine(common.StateDeleting) - default: - if m.markdownType == newsMarkdown { - keyColor = common.Green - } - } - - titleKey := "#" + strconv.Itoa(m.ID) - if state == markdownStateSettingNote { - titleKey = textinput.View(mdl.noteInput) - } else { - if m.markdownType == newsMarkdown { - titleKey = "System Announcement" - } - if m.Note != "" { - titleKey += ":" - } - } - - dateKey := "Stashed:" - if m.markdownType == newsMarkdown { - dateKey = "Posted:" - } - - var titleVal string - if state != markdownStateSettingNote { - titleVal = truncate(m.Note, mdl.terminalWidth-(stashViewHorizontalPadding*2)-len(titleKey)) - titleVal = m.title(titleVal, state) - } - - titleKey = te.String(titleKey).Foreground(keyColor.Color()).String() - dateKey = te.String(dateKey).Foreground(keyColor.Color()).String() - dateVal := m.date(state) - - var s string - s += fmt.Sprintf("%s %s %s\n", line, titleKey, titleVal) - s += fmt.Sprintf("%s %s %s", line, dateKey, dateVal) - return s -} - -func (m stashListItemView) date(state markdownState) string { - c := common.Indigo - if state == markdownStateDeleting { - c = common.FaintRed - } else if state == markdownStateSettingNote { - c = dullYellow - } - s := relativeTime(*m.CreatedAt) - return te.String(s).Foreground(c.Color()).String() -} - -func (m stashListItemView) title(title string, state markdownState) string { - if title == "" { - return "" - } - c := common.Indigo - if state == markdownStateDeleting { - c = common.Red - } - return te.String(title).Foreground(c.Color()).String() -} - // CMD func loadStash(m stashModel) boba.Cmd { diff --git a/ui/stashitem.go b/ui/stashitem.go new file mode 100644 index 0000000..9615a5b --- /dev/null +++ b/ui/stashitem.go @@ -0,0 +1,82 @@ +package ui + +import ( + "fmt" + + "github.com/charmbracelet/boba/textinput" + "github.com/charmbracelet/charm/ui/common" + te "github.com/muesli/termenv" +) + +const ( + newsPrefix = "News: " + verticalLine = "│" + noMemoTitle = "No Memo" +) + +var ( + faintGreen = common.NewColorPair("#2B4A3F", "#ABE5D1") + green = common.NewColorPair("#04B575", "#04B575") + dullFuchsia = common.NewColorPair("#AD58B4", "#F793FF") + dullYellow = common.NewColorPair("#9BA92F", "#6BCB94") // renders light green on light backgrounds + warmGray = common.NewColorPair("#918892", "#847A85") + subtleIndigo = common.NewColorPair("#514DC1", "#7D79F6") +) + +func stashItemView(m stashModel, index int, md *markdown) string { + truncateTo := m.terminalWidth - stashViewHorizontalPadding*2 + + gutter := " " + title := md.Note + date := relativeTime(*md.CreatedAt) + + if md.markdownType == newsMarkdown { + if title == "" { + title = "News" + } else { + title = newsPrefix + truncate(title, truncateTo-len(newsPrefix)) + } + } else { + if title == "" { + title = noMemoTitle + } + title = truncate(title, truncateTo) + } + + if index == m.index { + switch m.state { + case stashStatePromptDelete: + // Deleting + gutter = te.String(verticalLine).Foreground(common.FaintRed.Color()).String() + title = te.String(title).Foreground(common.Red.Color()).String() + date = te.String(date).Foreground(common.FaintRed.Color()).String() + case stashStateSettingNote: + // Setting note + gutter = te.String(verticalLine).Foreground(dullYellow.Color()).String() + title = textinput.View(m.noteInput) + date = te.String(date).Foreground(dullYellow.Color()).String() + default: + // Selected + gutter = te.String(verticalLine).Foreground(dullFuchsia.Color()).String() + title = te.String(title).Foreground(common.Fuschia.Color()).String() + date = te.String(date).Foreground(dullFuchsia.Color()).String() + } + } else { + // Normal + if md.markdownType == newsMarkdown { + gutter = " " + title = te.String(title).Foreground(common.Indigo.Color()).String() + date = te.String(date).Foreground(subtleIndigo.Color()).String() + } else { + if title == noMemoTitle { + title = te.String(title).Foreground(warmGray.Color()).String() + } + gutter = " " + date = te.String(date).Foreground(warmGray.Color()).String() + } + } + + s := fmt.Sprintf("%s %s\n", gutter, title) + s += fmt.Sprintf("%s %s", gutter, date) + return s +} From 21b1a2822f007a2565ebd37c8f313cadd0435c85 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 26 May 2020 12:36:14 -0400 Subject: [PATCH 273/911] Render stash view with a strings.Builder --- ui/stash.go | 18 +++++++++++------- ui/stashitem.go | 14 ++++++++------ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index a0ee9de..e5f97c5 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -389,9 +389,9 @@ func stashView(m stashModel) string { var s string switch m.state { case stashStateInit: - s += spinner.View(m.spinner) + " Loading stash..." + s += " " + spinner.View(m.spinner) + " Loading stash..." case stashStateLoadingDocument: - s += spinner.View(m.spinner) + " Loading document..." + s += " " + spinner.View(m.spinner) + " Loading document..." case stashStateReady: fallthrough case stashStateSettingNote: @@ -454,15 +454,17 @@ func stashEmtpyView(m stashModel) string { } func stashPopulatedView(m stashModel) string { - var s string + var b strings.Builder start, end := m.paginator.GetSliceBounds(len(m.markdowns)) docs := m.markdowns[start:end] for i, md := range docs { - s += stashItemView(m, i, md) + "\n\n" + stashItemView(&b, m, i, md) + if i != len(docs)-1 { + fmt.Fprintf(&b, "\n\n") + } } - s = strings.TrimRight(s, "\n") // If there aren't enough items to fill up this page (always the last page) // then we need to add some newlines to fill up the space to push the @@ -470,10 +472,12 @@ func stashPopulatedView(m stashModel) string { itemsOnPage := m.paginator.ItemsOnPage(len(m.markdowns)) if itemsOnPage < m.paginator.PerPage { n := (m.paginator.PerPage - itemsOnPage) * stashViewItemHeight - s += strings.Repeat("\n", n) + for i := 0; i < n; i++ { + fmt.Fprint(&b, "\n") + } } - return s + return b.String() } func stashHelpView(m stashModel) string { diff --git a/ui/stashitem.go b/ui/stashitem.go index 9615a5b..228507b 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -2,6 +2,7 @@ package ui import ( "fmt" + "strings" "github.com/charmbracelet/boba/textinput" "github.com/charmbracelet/charm/ui/common" @@ -19,13 +20,13 @@ var ( green = common.NewColorPair("#04B575", "#04B575") dullFuchsia = common.NewColorPair("#AD58B4", "#F793FF") dullYellow = common.NewColorPair("#9BA92F", "#6BCB94") // renders light green on light backgrounds - warmGray = common.NewColorPair("#918892", "#847A85") + warmGray = common.NewColorPair("#979797", "#847A85") subtleIndigo = common.NewColorPair("#514DC1", "#7D79F6") ) -func stashItemView(m stashModel, index int, md *markdown) string { - truncateTo := m.terminalWidth - stashViewHorizontalPadding*2 +func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) *strings.Builder { + truncateTo := m.terminalWidth - stashViewHorizontalPadding*2 gutter := " " title := md.Note date := relativeTime(*md.CreatedAt) @@ -76,7 +77,8 @@ func stashItemView(m stashModel, index int, md *markdown) string { } } - s := fmt.Sprintf("%s %s\n", gutter, title) - s += fmt.Sprintf("%s %s", gutter, date) - return s + fmt.Fprintf(b, "%s %s\n", gutter, title) + fmt.Fprintf(b, "%s %s", gutter, date) + + return b } From 77ba75d680e981d28613df8bc07d4602fa9bb2e7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 26 May 2020 13:42:25 -0400 Subject: [PATCH 274/911] Migrate from Boba to Bubble Tea and Bubbles --- go.mod | 10 ++++------ go.sum | 21 ++++++++++---------- ui/pager.go | 30 ++++++++++++++-------------- ui/stash.go | 44 ++++++++++++++++++++--------------------- ui/stashitem.go | 2 +- ui/ui.go | 52 ++++++++++++++++++++++++------------------------- 6 files changed, 78 insertions(+), 81 deletions(-) diff --git a/go.mod b/go.mod index 410514e..75d21e2 100644 --- a/go.mod +++ b/go.mod @@ -4,17 +4,15 @@ go 1.13 require ( github.com/charmbracelet/boba v0.6.3 - github.com/charmbracelet/charm v0.5.0 + github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80 + github.com/charmbracelet/bubbletea v0.7.0 + github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 - github.com/charmbracelet/tea v0.3.0 - github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d - github.com/dlclark/regexp2 v1.2.0 // indirect github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/muesli/reflow v0.1.0 github.com/muesli/termenv v0.6.0 - github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03 // indirect github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 + golang.org/x/sys v0.0.0-20200523222454-059865788121 ) diff --git a/go.sum b/go.sum index 4247027..db2b352 100644 --- a/go.sum +++ b/go.sum @@ -15,16 +15,17 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/boba v0.6.1/go.mod h1:xqhji08CbPctzbvCi/GzmNvIFOhnWJnkl9N8T65gnK0= github.com/charmbracelet/boba v0.6.3 h1:3YisdYQ35tieYXbfpf8acdVN6d1DJHGKZc5kDJNkjg0= github.com/charmbracelet/boba v0.6.3/go.mod h1:9TUvThAOqjXWYZGOrZ4qyluTrmodxb8SqNR81BJluOU= -github.com/charmbracelet/charm v0.5.0 h1:4GUkDyDOMgzGaTjSB97uyvH5rfxQeDTLPTr9xpKojsQ= -github.com/charmbracelet/charm v0.5.0/go.mod h1:xZgRIZCddA0IAmbsR4zk4HHCj4Z1PLvQcqcZqtk0Pzo= +github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80 h1:cfaoL1+tHPABTLEAg831PIFG96teW69Wamz9M025r5M= +github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= +github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= +github.com/charmbracelet/bubbletea v0.7.0 h1:nf0FEQCCc1e0qRGgpnz08QFsy25eDitzVwxV+Z/p4UI= +github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= +github.com/charmbracelet/charm v0.5.1 h1:2r6QYeIepEk+wmCXSN4TlotwTF5twlWm87AMGXLahnk= +github.com/charmbracelet/charm v0.5.1/go.mod h1:XBsJjir4zSEMSbbI42JSuyTYQAOcg43bsxe+GUoQHUo= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= -github.com/charmbracelet/tea v0.2.0/go.mod h1:lADjwO2mMub9qvXSCA9vAkabVWO0HeUrv4uO/lG3C+k= -github.com/charmbracelet/tea v0.3.0/go.mod h1:uA/DUzCuyIZ1NFyAdCz6k+gF8lspujo6ZvoavcSsLCM= -github.com/charmbracelet/teaparty v0.0.0-20200504225426-da64445a0e0d/go.mod h1:PsGcwPVbwjZv3XGW7qGoJ+EkhKqk2owMVUuX3IBUsTw= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -94,8 +95,8 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= -github.com/muesli/termenv v0.5.0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= +github.com/muesli/termenv v0.5.3-0.20200526053627-d728968dcf83/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.6.0 h1:zxvzTBmo4ZcxhNGGWeMz+Tttm51eF5bmPjfy4MCRYlk= github.com/muesli/termenv v0.6.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -106,7 +107,6 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03 h1:pd4YKIqCB0U7O2I4gWHgEUA2mCEOENmco0l/bM957bU= github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03/go.mod h1:Z9+Ul5bCbBKnbCvdOWbLqTHhJiYV414CURZJba6L8qA= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -176,11 +176,10 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200430202703-d923437fa56d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/ui/pager.go b/ui/pager.go index 3e66ef2..ea682b1 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -7,9 +7,9 @@ import ( "os" "strings" - "github.com/charmbracelet/boba" - "github.com/charmbracelet/boba/textinput" - "github.com/charmbracelet/boba/viewport" + "github.com/charmbracelet/bubbles/textinput" + "github.com/charmbracelet/bubbles/viewport" + tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glamour" @@ -105,15 +105,15 @@ func (m *pagerModel) unload() { // UPDATE -func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { +func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { var ( - cmd boba.Cmd - cmds []boba.Cmd + cmd tea.Cmd + cmds []tea.Cmd ) switch msg := msg.(type) { - case boba.KeyMsg: + case tea.KeyMsg: switch m.state { case pagerStateSetNote: switch msg.String() { @@ -123,7 +123,7 @@ func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { m.state = pagerStateBrowse return m, nil case "enter": - var cmd boba.Cmd + var cmd tea.Cmd if m.textInput.Value() != m.currentDocument.Note { // don't update if the note didn't change m.currentDocument.Note = m.textInput.Value() // update optimistically cmd = saveDocumentNote(m.cc, m.currentDocument.ID, m.currentDocument.Note) @@ -170,7 +170,7 @@ func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { return m, nil } - var cmd boba.Cmd + var cmd tea.Cmd if m.currentDocument != nil { cmd = renderWithGlamour(m, m.currentDocument.Body) } @@ -186,7 +186,7 @@ func pagerUpdate(msg boba.Msg, m pagerModel) (pagerModel, boba.Cmd) { cmds = append(cmds, cmd) } - return m, boba.Batch(cmds...) + return m, tea.Batch(cmds...) } // VIEW @@ -243,8 +243,8 @@ func pagerSetNoteView(m pagerModel) string { // CMD -func renderWithGlamour(m pagerModel, md string) boba.Cmd { - return func() boba.Msg { +func renderWithGlamour(m pagerModel, md string) tea.Cmd { + return func() tea.Msg { s, err := glamourRender(m, md) if err != nil { return errMsg(err) @@ -253,13 +253,13 @@ func renderWithGlamour(m pagerModel, md string) boba.Cmd { } } -func saveDocumentNote(cc *charm.Client, id int, note string) boba.Cmd { +func saveDocumentNote(cc *charm.Client, id int, note string) tea.Cmd { if cc == nil { - return func() boba.Msg { + return func() tea.Msg { return errMsg(errors.New("can't set note; no charm client")) } } - return func() boba.Msg { + return func() tea.Msg { if err := cc.SetMarkdownNote(id, note); err != nil { return errMsg(err) } diff --git a/ui/stash.go b/ui/stash.go index e5f97c5..12ea063 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -7,10 +7,10 @@ import ( "strings" "time" - "github.com/charmbracelet/boba" - "github.com/charmbracelet/boba/paginator" - "github.com/charmbracelet/boba/spinner" - "github.com/charmbracelet/boba/textinput" + "github.com/charmbracelet/bubbles/paginator" + "github.com/charmbracelet/bubbles/spinner" + "github.com/charmbracelet/bubbles/textinput" + tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/dustin/go-humanize" @@ -145,11 +145,11 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) { // INIT -func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { +func stashInit(cc *charm.Client) (stashModel, tea.Cmd) { s := spinner.NewModel() s.Type = spinner.Dot s.ForegroundColor = common.SpinnerColor - s.CustomMsgFunc = func() boba.Msg { return stashSpinnerTickMsg{} } + s.CustomMsgFunc = func() tea.Msg { return stashSpinnerTickMsg{} } p := paginator.NewModel() p.Type = paginator.Dots @@ -169,7 +169,7 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { paginator: p, } - return m, boba.Batch( + return m, tea.Batch( loadStash(m), loadNews(m), spinner.Tick(s), @@ -178,10 +178,10 @@ func stashInit(cc *charm.Client) (stashModel, boba.Cmd) { // UPDATE -func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { +func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { var ( - cmd boba.Cmd - cmds []boba.Cmd + cmd tea.Cmd + cmds []tea.Cmd ) switch msg := msg.(type) { @@ -233,7 +233,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { switch m.state { case stashStateReady: - if msg, ok := msg.(boba.KeyMsg); ok { + if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { case "k": @@ -320,7 +320,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { } case stashStatePromptDelete: - if msg, ok := msg.(boba.KeyMsg); ok { + if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { // Confirm deletion @@ -351,7 +351,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { case stashStateSettingNote: - if msg, ok := msg.(boba.KeyMsg); ok { + if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { case "q": fallthrough @@ -380,7 +380,7 @@ func stashUpdate(msg boba.Msg, m stashModel) (stashModel, boba.Cmd) { // If an item is being confirmed for delete, any key (other than the key // used for confirmation above) cancels the deletion - return m, boba.Batch(cmds...) + return m, tea.Batch(cmds...) } // VIEW @@ -508,8 +508,8 @@ func stashHelpView(m stashModel) string { // CMD -func loadStash(m stashModel) boba.Cmd { - return func() boba.Msg { +func loadStash(m stashModel) tea.Cmd { + return func() tea.Msg { stash, err := m.cc.GetStash(m.page) if err != nil { return errMsg(err) @@ -518,8 +518,8 @@ func loadStash(m stashModel) boba.Cmd { } } -func loadNews(m stashModel) boba.Cmd { - return func() boba.Msg { +func loadNews(m stashModel) tea.Cmd { + return func() tea.Msg { news, err := m.cc.GetNews(1) // just fetch the first page if err != nil { return errMsg(err) @@ -528,8 +528,8 @@ func loadNews(m stashModel) boba.Cmd { } } -func loadMarkdown(cc *charm.Client, id int, t markdownType) boba.Cmd { - return func() boba.Msg { +func loadMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { + return func() tea.Msg { var ( md *charm.Markdown err error @@ -549,8 +549,8 @@ func loadMarkdown(cc *charm.Client, id int, t markdownType) boba.Cmd { } } -func deleteStashedItem(cc *charm.Client, id int) boba.Cmd { - return func() boba.Msg { +func deleteStashedItem(cc *charm.Client, id int) tea.Cmd { + return func() tea.Msg { err := cc.DeleteMarkdown(id) if err != nil { return errMsg(err) diff --git a/ui/stashitem.go b/ui/stashitem.go index 228507b..dd651a0 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "github.com/charmbracelet/boba/textinput" + "github.com/charmbracelet/bubbles/textinput" "github.com/charmbracelet/charm/ui/common" te "github.com/muesli/termenv" ) diff --git a/ui/ui.go b/ui/ui.go index 273e778..6ec997b 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -4,8 +4,8 @@ import ( "errors" "fmt" - "github.com/charmbracelet/boba" - "github.com/charmbracelet/boba/spinner" + "github.com/charmbracelet/bubbles/spinner" + tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/charm/ui/keygen" @@ -21,9 +21,9 @@ var ( glowLogoTextColor = common.Color("#ECFD65") ) -// NewProgram returns a new Boba program -func NewProgram(style string) *boba.Program { - return boba.NewProgram(initialize(style), update, view) +// NewProgram returns a new Tea program +func NewProgram(style string) *tea.Program { + return tea.NewProgram(initialize(style), update, view) } // MESSAGES @@ -87,8 +87,8 @@ func (m *model) unloadDocument() { // INIT -func initialize(style string) func() (boba.Model, boba.Cmd) { - return func() (boba.Model, boba.Cmd) { +func initialize(style string) func() (tea.Model, tea.Cmd) { + return func() (tea.Model, tea.Cmd) { s := spinner.NewModel() s.Type = spinner.Dot s.ForegroundColor = common.SpinnerColor @@ -106,7 +106,7 @@ func initialize(style string) func() (boba.Model, boba.Cmd) { spinner: s, pager: newPagerModel(style), state: stateInitCharmClient, - }, boba.Batch( + }, tea.Batch( newCharmClient, spinner.Tick(s), getTerminalSize(), @@ -117,27 +117,27 @@ func initialize(style string) func() (boba.Model, boba.Cmd) { // UPDATE -func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { +func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { m, ok := mdl.(model) if !ok { return model{ err: errors.New("could not perform assertion on model in update"), - }, boba.Quit + }, tea.Quit } var ( - cmd boba.Cmd - cmds []boba.Cmd + cmd tea.Cmd + cmds []tea.Cmd ) switch msg := msg.(type) { - case boba.KeyMsg: + case tea.KeyMsg: switch msg.String() { case "q": fallthrough case "esc": - var cmd boba.Cmd + var cmd tea.Cmd switch m.state { case stateShowStash: @@ -159,10 +159,10 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { return m, cmd } - return m, boba.Quit + return m, tea.Quit case "ctrl+c": - return m, boba.Quit + return m, tea.Quit // Repaint case "ctrl+l": @@ -201,7 +201,7 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { } else { // The keygen didn't work and we can't auth m.err = errors.New("SSH authentication failed") - return m, boba.Quit + return m, tea.Quit } case spinner.TickMsg: @@ -243,11 +243,11 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { case stateKeygenRunning: // Process keygen - mdl, cmd := keygen.Update(msg, boba.Model(m.keygen)) + mdl, cmd := keygen.Update(msg, tea.Model(m.keygen)) keygenModel, ok := mdl.(keygen.Model) if !ok { m.err = errors.New("could not perform assertion on keygen model in main update") - return m, boba.Quit + return m, tea.Quit } m.keygen = keygenModel cmds = append(cmds, cmd) @@ -263,12 +263,12 @@ func update(msg boba.Msg, mdl boba.Model) (boba.Model, boba.Cmd) { cmds = append(cmds, cmd) } - return m, boba.Batch(cmds...) + return m, tea.Batch(cmds...) } // VIEW -func view(mdl boba.Model) string { +func view(mdl tea.Model) string { m, ok := mdl.(model) if !ok { return "could not perform assertion on model in view" @@ -297,19 +297,19 @@ func view(mdl boba.Model) string { // COMMANDS -func listenForTerminalResize() boba.Cmd { - return boba.OnResize(func() boba.Msg { +func listenForTerminalResize() tea.Cmd { + return tea.OnResize(func() tea.Msg { return terminalResizedMsg{} }) } -func getTerminalSize() boba.Cmd { - return boba.GetTerminalSize(func(w, h int, err error) boba.TerminalSizeMsg { +func getTerminalSize() tea.Cmd { + return tea.GetTerminalSize(func(w, h int, err error) tea.TerminalSizeMsg { return terminalSizeMsg{width: w, height: h, err: err} }) } -func newCharmClient() boba.Msg { +func newCharmClient() tea.Msg { cfg, err := charm.ConfigFromEnv() if err != nil { return errMsg(err) From 1d6341f9708eb985824b55dde25fbbeb1621b8fa Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 26 May 2020 15:10:45 -0400 Subject: [PATCH 275/911] Use strings.Builder to build pager view --- ui/pager.go | 47 ++++++++++++++++++++++++++++------------------- ui/stashitem.go | 4 +--- ui/ui.go | 2 ++ 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index ea682b1..3b4b1e0 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -35,6 +35,16 @@ var ( statusBarBg = common.NewColorPair("#242424", "#E6E6E6") statusBarNoteFg = common.NewColorPair("#7D7D7D", "#656565") statusBarScrollPosFg = common.NewColorPair("#5A5A5A", "#949494") + + statusBarScrollPosStyle = te.Style{}. + Foreground(statusBarScrollPosFg.Color()). + Background(statusBarBg.Color()). + Styled + + statusBarNoteStyle = te.Style{}. + Foreground(statusBarNoteFg.Color()). + Background(statusBarBg.Color()). + Styled ) // MSG @@ -192,21 +202,21 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { // VIEW func pagerView(m pagerModel) string { - var footer string + var b strings.Builder + + fmt.Fprintf(&b, "\n%s\n", viewport.View(m.viewport)) + + // Footer if m.state == pagerStateSetNote { - footer = pagerSetNoteView(m) + pagerSetNoteView(&b, m) } else { - footer = pagerStatusBarView(m) + pagerStatusBarView(&b, m) } - return fmt.Sprintf( - "\n%s\n%s", - viewport.View(m.viewport), - footer, - ) + return b.String() } -func pagerStatusBarView(m pagerModel) string { +func pagerStatusBarView(b *strings.Builder, m pagerModel) { // Logo logoText := " Glow " logo := glowLogoView(logoText) @@ -214,10 +224,6 @@ func pagerStatusBarView(m pagerModel) string { // Scroll percent scrollPercent := math.Max(0.0, math.Min(1.0, m.viewport.ScrollPercent())) percentText := fmt.Sprintf(" %3.f%% ", scrollPercent*100) - percent := te.String(percentText). - Foreground(statusBarScrollPosFg.Color()). - Background(statusBarBg.Color()). - String() // Note noteText := m.currentDocument.Note @@ -225,20 +231,23 @@ func pagerStatusBarView(m pagerModel) string { noteText = "(No title)" } noteText = truncate(" "+noteText+" ", max(0, m.width-len(logoText)-len(percentText))) - note := te.String(noteText). - Foreground(statusBarNoteFg.Color()). - Background(statusBarBg.Color()).String() // Empty space emptyCell := te.String(" ").Background(statusBarBg.Color()).String() padding := max(0, m.width-len(logoText)-len(noteText)-len(percentText)) emptySpace := strings.Repeat(emptyCell, padding) - return logo + note + emptySpace + percent + fmt.Fprintf(b, "%s%s%s%s", + logo, + statusBarNoteStyle(noteText), + emptySpace, + statusBarScrollPosStyle(percentText), + ) } -func pagerSetNoteView(m pagerModel) string { - return noteHeading + textinput.View(m.textInput) +func pagerSetNoteView(b *strings.Builder, m pagerModel) { + fmt.Fprint(b, noteHeading) + fmt.Fprint(b, textinput.View(m.textInput)) } // CMD diff --git a/ui/stashitem.go b/ui/stashitem.go index dd651a0..35e8b3f 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -24,7 +24,7 @@ var ( subtleIndigo = common.NewColorPair("#514DC1", "#7D79F6") ) -func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) *strings.Builder { +func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { truncateTo := m.terminalWidth - stashViewHorizontalPadding*2 gutter := " " @@ -79,6 +79,4 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) *s fmt.Fprintf(b, "%s %s\n", gutter, title) fmt.Fprintf(b, "%s %s", gutter, date) - - return b } diff --git a/ui/ui.go b/ui/ui.go index 6ec997b..14113dd 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -269,6 +269,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // VIEW func view(mdl tea.Model) string { + m, ok := mdl.(model) if !ok { return "could not perform assertion on model in view" @@ -279,6 +280,7 @@ func view(mdl tea.Model) string { } var s string + switch m.state { case stateInitCharmClient: s += spinner.View(m.spinner) + " Initializing..." From 553d064c9201acbde904365e1a6c9f63b3ce4b02 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 26 May 2020 16:18:26 -0400 Subject: [PATCH 276/911] Fix tests (don't test glow with no arguments) --- glow_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/glow_test.go b/glow_test.go index a2c70b6..ed4f0cd 100644 --- a/glow_test.go +++ b/glow_test.go @@ -7,7 +7,6 @@ import ( func TestGlowSources(t *testing.T) { tt := []string{ - "", ".", "README.md", "github.com/charmbracelet/glow", From c0ca639f3aa58776b7e04be86e34b9e4845a5e6f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 26 May 2020 16:22:52 -0400 Subject: [PATCH 277/911] Remove tests for Go 1.11 and 1.12 (keygen is 1.13 and up) --- .github/workflows/go.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index f25d0ed..e3e092d 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -4,13 +4,13 @@ jobs: test: strategy: matrix: - go-version: [1.11.x, 1.12.x, 1.13.x, 1.14.x] + go-version: [1.13.x, 1.14.x] platform: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.platform }} env: GO111MODULE: "on" steps: - + - name: Configure git for private modules env: TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} From 671eade0b56870c620cd85a9bcfaf1044662c788 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 26 May 2020 16:28:53 -0400 Subject: [PATCH 278/911] Remove Boba residue --- go.mod | 1 - go.sum | 2 -- main.go | 8 ++++---- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 75d21e2..9cece49 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/boba v0.6.3 github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80 github.com/charmbracelet/bubbletea v0.7.0 github.com/charmbracelet/charm v0.5.1 diff --git a/go.sum b/go.sum index db2b352..20bf8f0 100644 --- a/go.sum +++ b/go.sum @@ -15,8 +15,6 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/boba v0.6.3 h1:3YisdYQ35tieYXbfpf8acdVN6d1DJHGKZc5kDJNkjg0= -github.com/charmbracelet/boba v0.6.3/go.mod h1:9TUvThAOqjXWYZGOrZ4qyluTrmodxb8SqNR81BJluOU= github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80 h1:cfaoL1+tHPABTLEAg831PIFG96teW69Wamz9M025r5M= github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= diff --git a/main.go b/main.go index acc5a8e..3896d9c 100644 --- a/main.go +++ b/main.go @@ -15,7 +15,7 @@ import ( "github.com/spf13/cobra" "golang.org/x/crypto/ssh/terminal" - "github.com/charmbracelet/boba" + tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/glamour" "github.com/charmbracelet/glow/ui" ) @@ -171,18 +171,18 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { // Log to a file. For debugging. logToFilePath := os.Getenv("GLOW_LOG_TO_FILE") if logToFilePath != "" { - f, err := boba.LogToFile(logToFilePath, "glow") + f, err := tea.LogToFile(logToFilePath, "glow") if err != nil { return err } defer f.Close() } - boba.AltScreen() + tea.AltScreen() if err := ui.NewProgram(style).Start(); err != nil { return err } - boba.ExitAltScreen() + tea.ExitAltScreen() fmt.Printf("\n Thanks for using Glow!\n\n") return nil From ae5e158bbdee80db89f019f9469f579cdff2de7a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 27 May 2020 11:55:00 -0400 Subject: [PATCH 279/911] Unstyled indent (for now) --- ui/stash.go | 3 +-- ui/ui.go | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 12ea063..443879e 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -14,7 +14,6 @@ import ( "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/dustin/go-humanize" - "github.com/muesli/reflow/indent" te "github.com/muesli/termenv" ) @@ -438,7 +437,7 @@ func stashView(m stashModel) string { stashHelpView(m), ) } - return "\n" + indent.String(s, 1) + return "\n" + indent(s, 1) } func glowLogoView(text string) string { diff --git a/ui/ui.go b/ui/ui.go index 14113dd..007fb87 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -3,13 +3,13 @@ package ui import ( "errors" "fmt" + "strings" "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/charm/ui/keygen" - "github.com/muesli/reflow/indent" te "github.com/muesli/termenv" ) @@ -294,7 +294,7 @@ func view(mdl tea.Model) string { return pagerView(m.pager) } - return "\n" + indent.String(s, 2) + return "\n" + indent(s, 2) } // COMMANDS @@ -327,6 +327,19 @@ func newCharmClient() tea.Msg { return newCharmClientMsg(cc) } +func indent(s string, n int) string { + if n <= 0 || s == "" { + return s + } + l := strings.Split(s, "\n") + b := strings.Builder{} + i := strings.Repeat(" ", n) + for _, v := range l { + fmt.Fprintf(&b, "%s%s\n", i, v) + } + return b.String() +} + // ETC func min(a, b int) int { From 213df4ad7f26de71984123518811bbfbcc7d5f1a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 28 May 2020 13:58:31 -0400 Subject: [PATCH 280/911] Bump Bubble Tea dependency --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 9cece49..622d352 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80 - github.com/charmbracelet/bubbletea v0.7.0 + github.com/charmbracelet/bubbletea v0.7.1-0.20200528144715-b10f6d679158 github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac diff --git a/go.sum b/go.sum index 20bf8f0..0776bcc 100644 --- a/go.sum +++ b/go.sum @@ -20,6 +20,8 @@ github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80/go.mod h1:/A github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.7.0 h1:nf0FEQCCc1e0qRGgpnz08QFsy25eDitzVwxV+Z/p4UI= github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= +github.com/charmbracelet/bubbletea v0.7.1-0.20200528144715-b10f6d679158 h1:aOjBpErc3ZM0KYma+JSRcWk5UZx/Tat9lnrzrflb+GM= +github.com/charmbracelet/bubbletea v0.7.1-0.20200528144715-b10f6d679158/go.mod h1:DzNhKkQQJI30eb+kBcaOs1+z86zTSqcMgSHoFY+uCsg= github.com/charmbracelet/charm v0.5.1 h1:2r6QYeIepEk+wmCXSN4TlotwTF5twlWm87AMGXLahnk= github.com/charmbracelet/charm v0.5.1/go.mod h1:XBsJjir4zSEMSbbI42JSuyTYQAOcg43bsxe+GUoQHUo= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= From e50aff65c283abc6b9a283e91587ea3f988cdd51 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 2 Jun 2020 17:15:26 -0400 Subject: [PATCH 281/911] Fix bug where spinner would spin forever if the stash is empty --- ui/stash.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 443879e..bf09ec3 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -189,15 +189,14 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case gotStashMsg: m.loading = false - // If the server comes back with nothing then we've got everything if len(msg) == 0 { + // If the server comes back with nothing then we've got everything m.fullyLoaded = true - break + } else { + docs := wrapMarkdowns(userMarkdown, msg) + m.addMarkdowns(docs...) } - docs := wrapMarkdowns(userMarkdown, msg) - m.addMarkdowns(docs...) - m.loaded |= loadedStash if m.loaded.done() { m.state = stashStateReady From 2688a8c4a6b179dc6411c5a828e02acc8b45a31c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 2 Jun 2020 18:58:15 -0400 Subject: [PATCH 282/911] Fix stash view when no items are stashed --- go.mod | 4 ++-- go.sum | 4 ++++ ui/stash.go | 30 ++++++++++++++++++++++-------- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 622d352..087369d 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80 + github.com/charmbracelet/bubbles v0.0.0-20200602224800-12b2758d50f2 github.com/charmbracelet/bubbletea v0.7.1-0.20200528144715-b10f6d679158 github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 @@ -13,5 +13,5 @@ require ( github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200523222454-059865788121 + golang.org/x/sys v0.0.0-20200602100848-8d3cce7afc34 ) diff --git a/go.sum b/go.sum index 0776bcc..837b176 100644 --- a/go.sum +++ b/go.sum @@ -17,6 +17,8 @@ github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80 h1:cfaoL1+tHPABTLEAg831PIFG96teW69Wamz9M025r5M= github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= +github.com/charmbracelet/bubbles v0.0.0-20200602224800-12b2758d50f2 h1:JDEhuhIiBwpnd/3f0o/4pjYobUTnTU+sxvDMCDC/D78= +github.com/charmbracelet/bubbles v0.0.0-20200602224800-12b2758d50f2/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.7.0 h1:nf0FEQCCc1e0qRGgpnz08QFsy25eDitzVwxV+Z/p4UI= github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= @@ -180,6 +182,8 @@ golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602100848-8d3cce7afc34 h1:u6CI7A++8r4SItZHYe2cWeAEndN4p1p+3Oum/Ft2EzM= +golang.org/x/sys v0.0.0-20200602100848-8d3cce7afc34/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/ui/stash.go b/ui/stash.go index bf09ec3..a7880fe 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -19,7 +19,7 @@ import ( const ( stashViewItemHeight = 3 - stashViewTopPadding = 5 + stashViewTopPadding = 7 stashViewBottomPadding = 4 stashViewHorizontalPadding = 6 setNotePromptText = "Memo: " @@ -132,6 +132,9 @@ func (m stashModel) markdownIndex() int { // return the current selected markdown in the stash func (m stashModel) selectedMarkdown() *markdown { + if len(m.markdowns) == 0 { + return nil + } return m.markdowns[m.markdownIndex()] } @@ -395,20 +398,30 @@ func stashView(m stashModel) string { case stashStateSettingNote: fallthrough case stashStatePromptDelete: - if len(m.markdowns) == 0 { - s += stashEmtpyView(m) - break + + var stashView string + var stashViewHeight int + if len(m.markdowns) > 0 { + stashView = stashPopulatedView(m) + stashViewHeight = strings.Count(stashView, "\n") + 1 } // We need to fill any empty height with newlines so the footer reaches // the bottom. - numBlankLines := max(0, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)%stashViewItemHeight) + //numBlankLines := max(0, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)%stashViewItemHeight) + numBlankLines := max(0, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)-stashViewHeight) blankLines := "" if numBlankLines > 0 { blankLines = strings.Repeat("\n", numBlankLines) } - header := "Here’s your markdown stash:" + var header string + if len(m.markdowns) > 0 { + header = "Here’s your markdown stash:" + } else { + header = "Nothing stashed yet. To stash you can " + common.Code("glow stash path/to/file.md") + "." + } + switch m.state { case stashStatePromptDelete: header = te.String("Delete this item? ").Foreground(common.Red.Color()).String() + @@ -430,7 +443,7 @@ func stashView(m stashModel) string { " %s\n\n %s\n\n%s\n\n%s %s\n\n %s", glowLogoView(" Glow "), header, - stashPopulatedView(m), + stashView, blankLines, pagination, stashHelpView(m), @@ -481,7 +494,8 @@ func stashPopulatedView(m stashModel) string { func stashHelpView(m stashModel) string { var ( h []string - isNews bool = m.selectedMarkdown().markdownType == newsMarkdown + md = m.selectedMarkdown() + isNews = md != nil && md.markdownType == newsMarkdown ) if m.state == stashStateSettingNote { From 4849e0489d427c945fa703fad854480743ed8e20 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 2 Jun 2020 19:10:10 -0400 Subject: [PATCH 283/911] Remove commented code --- ui/stash.go | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index a7880fe..03e1045 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -408,7 +408,6 @@ func stashView(m stashModel) string { // We need to fill any empty height with newlines so the footer reaches // the bottom. - //numBlankLines := max(0, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)%stashViewItemHeight) numBlankLines := max(0, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)-stashViewHeight) blankLines := "" if numBlankLines > 0 { From d4203ed1a6a17d029fd9ff6716dd59a72d734c83 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 2 Jun 2020 19:44:26 -0400 Subject: [PATCH 284/911] Fix stash empty/not-empty rendering --- ui/stash.go | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 03e1045..2c76f08 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -19,7 +19,7 @@ import ( const ( stashViewItemHeight = 3 - stashViewTopPadding = 7 + stashViewTopPadding = 5 stashViewBottomPadding = 4 stashViewHorizontalPadding = 6 setNotePromptText = "Memo: " @@ -399,16 +399,9 @@ func stashView(m stashModel) string { fallthrough case stashStatePromptDelete: - var stashView string - var stashViewHeight int - if len(m.markdowns) > 0 { - stashView = stashPopulatedView(m) - stashViewHeight = strings.Count(stashView, "\n") + 1 - } - // We need to fill any empty height with newlines so the footer reaches // the bottom. - numBlankLines := max(0, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)-stashViewHeight) + numBlankLines := max(0, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)%stashViewItemHeight) blankLines := "" if numBlankLines > 0 { blankLines = strings.Repeat("\n", numBlankLines) @@ -442,7 +435,7 @@ func stashView(m stashModel) string { " %s\n\n %s\n\n%s\n\n%s %s\n\n %s", glowLogoView(" Glow "), header, - stashView, + stashPopulatedView(m), blankLines, pagination, stashHelpView(m), @@ -466,22 +459,27 @@ func stashEmtpyView(m stashModel) string { func stashPopulatedView(m stashModel) string { var b strings.Builder - start, end := m.paginator.GetSliceBounds(len(m.markdowns)) - docs := m.markdowns[start:end] + if len(m.markdowns) > 0 { + start, end := m.paginator.GetSliceBounds(len(m.markdowns)) + docs := m.markdowns[start:end] - for i, md := range docs { - stashItemView(&b, m, i, md) - if i != len(docs)-1 { - fmt.Fprintf(&b, "\n\n") + for i, md := range docs { + stashItemView(&b, m, i, md) + if i != len(docs)-1 { + fmt.Fprintf(&b, "\n\n") + } } } // If there aren't enough items to fill up this page (always the last page) - // then we need to add some newlines to fill up the space to push the - // footer stuff down elsewhere. + // then we need to add some newlines to fill up the space where stash items + // would have been. itemsOnPage := m.paginator.ItemsOnPage(len(m.markdowns)) if itemsOnPage < m.paginator.PerPage { n := (m.paginator.PerPage - itemsOnPage) * stashViewItemHeight + if len(m.markdowns) == 0 { + n -= stashViewItemHeight - 1 + } for i := 0; i < n; i++ { fmt.Fprint(&b, "\n") } From 61bcd800120c867be81c4cbc592955d0bca4e190 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 3 Jun 2020 12:46:53 -0400 Subject: [PATCH 285/911] Don't try and open stuff if there's nothing to open --- ui/stash.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 2c76f08..b635012 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -266,6 +266,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Open document case "enter": + if len(m.markdowns) == 0 { + break + } + // Load the document from the server. We'll handle the message // that comes back in the main update function. m.state = stashStateLoadingDocument @@ -500,14 +504,14 @@ func stashHelpView(m stashModel) string { } else if m.state == stashStatePromptDelete { h = append(h, "y: delete", "n: cancel") } else { - h = append(h, "enter: open") if len(m.markdowns) > 0 { + h = append(h, "enter: open") h = append(h, "j/k, ↑/↓: choose") } if m.paginator.TotalPages > 1 { h = append(h, "h/l, ←/→: page") } - if !isNews { + if !isNews && len(m.markdowns) > 0 { h = append(h, []string{"x: delete"}...) } h = append(h, []string{"esc: exit"}...) From 5019331dff465a973d30785d1b6dfcd0d4649002 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 3 Jun 2020 14:17:41 -0400 Subject: [PATCH 286/911] Mini help view for pager --- go.mod | 1 + go.sum | 3 --- ui/pager.go | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++--- ui/ui.go | 1 + 4 files changed, 64 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 087369d..a542632 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/muesli/reflow v0.1.0 github.com/muesli/termenv v0.6.0 + github.com/mattn/go-runewidth v0.0.9 github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect diff --git a/go.sum b/go.sum index 837b176..454b0bb 100644 --- a/go.sum +++ b/go.sum @@ -15,12 +15,10 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80 h1:cfaoL1+tHPABTLEAg831PIFG96teW69Wamz9M025r5M= github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= github.com/charmbracelet/bubbles v0.0.0-20200602224800-12b2758d50f2 h1:JDEhuhIiBwpnd/3f0o/4pjYobUTnTU+sxvDMCDC/D78= github.com/charmbracelet/bubbles v0.0.0-20200602224800-12b2758d50f2/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= -github.com/charmbracelet/bubbletea v0.7.0 h1:nf0FEQCCc1e0qRGgpnz08QFsy25eDitzVwxV+Z/p4UI= github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.7.1-0.20200528144715-b10f6d679158 h1:aOjBpErc3ZM0KYma+JSRcWk5UZx/Tat9lnrzrflb+GM= github.com/charmbracelet/bubbletea v0.7.1-0.20200528144715-b10f6d679158/go.mod h1:DzNhKkQQJI30eb+kBcaOs1+z86zTSqcMgSHoFY+uCsg= @@ -180,7 +178,6 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602100848-8d3cce7afc34 h1:u6CI7A++8r4SItZHYe2cWeAEndN4p1p+3Oum/Ft2EzM= golang.org/x/sys v0.0.0-20200602100848-8d3cce7afc34/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/ui/pager.go b/ui/pager.go index 3b4b1e0..2a31b7e 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -13,6 +13,7 @@ import ( "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glamour" + runewidth "github.com/mattn/go-runewidth" te "github.com/muesli/termenv" ) @@ -27,6 +28,8 @@ const ( ) var ( + pagerHelpHeight = strings.Count(pagerHelpView(0), "\n") + noteHeading = te.String(noteHeadingText). Foreground(common.Cream.Color()). Background(common.Green.Color()). @@ -45,6 +48,16 @@ var ( Foreground(statusBarNoteFg.Color()). Background(statusBarBg.Color()). Styled + + statusBarHelpStyle = te.Style{}. + Foreground(statusBarNoteFg.Color()). + Background(common.NewColorPair("#323232", "#DCDCDC").Color()). + Styled + + helpViewStyle = te.Style{}. + Foreground(statusBarNoteFg.Color()). + Background(common.NewColorPair("#1B1B1B", "#f2f2f2").Color()). + Styled ) // MSG @@ -69,6 +82,7 @@ type pagerModel struct { width int height int textInput textinput.Model + showHelp bool // Current document being rendered, sans-glamour rendering. We cache // this here so we can re-render it on resize. @@ -100,6 +114,10 @@ func (m *pagerModel) setSize(w, h int) { m.viewport.Width = w m.viewport.Height = h - statusBarHeight m.textInput.Width = w - len(noteHeadingText) - len(notePromptText) - 1 + + if m.showHelp { + m.viewport.Height -= pagerHelpHeight + 1 + } } func (m *pagerModel) setContent(s string) { @@ -164,6 +182,9 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { m.textInput.CursorEnd() } return m, textinput.Blink(m.textInput) + case "?": + m.showHelp = !m.showHelp + m.setSize(m.width, m.height) } } @@ -213,6 +234,10 @@ func pagerView(m pagerModel) string { pagerStatusBarView(&b, m) } + if m.showHelp { + fmt.Fprintf(&b, pagerHelpView(m.width)) + } + return b.String() } @@ -225,23 +250,31 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { scrollPercent := math.Max(0.0, math.Min(1.0, m.viewport.ScrollPercent())) percentText := fmt.Sprintf(" %3.f%% ", scrollPercent*100) + // "Help" note + helpNoteText := " ? Help " + helpNote := statusBarHelpStyle(helpNoteText) + // Note noteText := m.currentDocument.Note if len(noteText) == 0 { noteText = "(No title)" } - noteText = truncate(" "+noteText+" ", max(0, m.width-len(logoText)-len(percentText))) + noteText = truncate(" "+noteText+" ", max( + 0, + m.width-len(logoText)-len(percentText)-len(helpNoteText), + )) // Empty space emptyCell := te.String(" ").Background(statusBarBg.Color()).String() - padding := max(0, m.width-len(logoText)-len(noteText)-len(percentText)) + padding := max(0, m.width-len(logoText)-len(noteText)-len(percentText)-len(helpNoteText)) emptySpace := strings.Repeat(emptyCell, padding) - fmt.Fprintf(b, "%s%s%s%s", + fmt.Fprintf(b, "%s%s%s%s%s", logo, statusBarNoteStyle(noteText), emptySpace, statusBarScrollPosStyle(percentText), + helpNote, ) } @@ -250,6 +283,32 @@ func pagerSetNoteView(b *strings.Builder, m pagerModel) { fmt.Fprint(b, textinput.View(m.textInput)) } +func pagerHelpView(width int) (s string) { + s += "\n" + s += "k/↑ up m set memo\n" + s += "j/↓ down esc/q back to stash\n" + s += "b/pgup page up\n" + s += "d/pgdn page down\n" + s += "u ½ page up\n" + s += "d ½ page down" + + s = indent(s, 2) + + // Fill up empty cells with spaces for background coloring + if width > 0 { + lines := strings.Split(s, "\n") + for i := 0; i < len(lines); i++ { + l := runewidth.StringWidth(lines[i]) + n := width - l + lines[i] += strings.Repeat(" ", n) + } + + s = strings.Join(lines, "\n") + } + + return helpViewStyle(s) +} + // CMD func renderWithGlamour(m pagerModel, md string) tea.Cmd { diff --git a/ui/ui.go b/ui/ui.go index 007fb87..a322445 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -83,6 +83,7 @@ func (m *model) unloadDocument() { m.state = stateShowStash m.stash.state = stashStateReady m.pager.unload() + m.pager.showHelp = false } // INIT From ea12614a53e248926ba23d20ddae176f18faba05 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 3 Jun 2020 14:24:40 -0400 Subject: [PATCH 287/911] Add memo key to stash help + change memo keys to 'm' --- ui/pager.go | 2 +- ui/stash.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 2a31b7e..c577b23 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -169,7 +169,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { m.state = pagerStateBrowse return m, nil } - case "n": + case "m": // Users can't set the note on news markdown if m.currentDocument.markdownType == newsMarkdown { break diff --git a/ui/stash.go b/ui/stash.go index b635012..9bad91d 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -281,7 +281,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { ) // Set note - case "n": + case "m": md := m.selectedMarkdown() isUserMarkdown := md.markdownType == userMarkdown isSettingNote := m.state == stashStateSettingNote @@ -512,7 +512,7 @@ func stashHelpView(m stashModel) string { h = append(h, "h/l, ←/→: page") } if !isNews && len(m.markdowns) > 0 { - h = append(h, []string{"x: delete"}...) + h = append(h, []string{"x: delete", "m: set memo"}...) } h = append(h, []string{"esc: exit"}...) } From 939fdef91365ae2a6b119cd3aaffc3405bdbcf4d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 5 Jun 2020 14:42:15 -0400 Subject: [PATCH 288/911] Fix panic when deleting item at end of stash --- ui/stash.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 9bad91d..a4e476a 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -132,7 +132,7 @@ func (m stashModel) markdownIndex() int { // return the current selected markdown in the stash func (m stashModel) selectedMarkdown() *markdown { - if len(m.markdowns) == 0 { + if len(m.markdowns) == 0 || len(m.markdowns) <= m.markdownIndex() { return nil } return m.markdowns[m.markdownIndex()] From 5cd6accce3957735fb4147957187c0f8476e32a6 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 5 Jun 2020 16:57:27 -0400 Subject: [PATCH 289/911] Nice looking system-level errors --- ui/ui.go | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/ui/ui.go b/ui/ui.go index a322445..4242d90 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -126,6 +126,13 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { }, tea.Quit } + // If there's been an error, any key exits + if m.err != nil { + if _, ok := msg.(tea.KeyMsg); ok { + return m, tea.Quit + } + } + var ( cmd tea.Cmd cmds []tea.Cmd @@ -277,7 +284,7 @@ func view(mdl tea.Model) string { } if m.err != nil { - return fmt.Sprintf("\nError: %v\n\nPress q to exit.", m.err) + return "\n" + indent(errorView(m.err), 2) } var s string @@ -298,6 +305,17 @@ func view(mdl tea.Model) string { return "\n" + indent(s, 2) } +func errorView(err error) string { + return fmt.Sprintf("%s\n\n%v\n\n%s", + te.String(" ERROR "). + Foreground(common.Cream.Color()). + Background(common.Red.Color()). + String(), + err, + common.Subtle("Press any key to exit"), + ) +} + // COMMANDS func listenForTerminalResize() tea.Cmd { From 7ee203a9877367591d265b83452dda5379874138 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sun, 7 Jun 2020 09:59:05 -0400 Subject: [PATCH 290/911] Correct keystroke in pager help --- ui/pager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index c577b23..64d2011 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -288,7 +288,7 @@ func pagerHelpView(width int) (s string) { s += "k/↑ up m set memo\n" s += "j/↓ down esc/q back to stash\n" s += "b/pgup page up\n" - s += "d/pgdn page down\n" + s += "f/pgdn page down\n" s += "u ½ page up\n" s += "d ½ page down" From 1c804b5a3a529633d54a4f338305a77549b77fed Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 8 Jun 2020 13:09:26 -0400 Subject: [PATCH 291/911] Update to new Bubble Tea renderer --- go.mod | 6 +++--- go.sum | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index a542632..1c4e7dc 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.0.0-20200602224800-12b2758d50f2 - github.com/charmbracelet/bubbletea v0.7.1-0.20200528144715-b10f6d679158 + github.com/charmbracelet/bubbletea v0.8.0 github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac @@ -12,7 +12,7 @@ require ( github.com/muesli/termenv v0.6.0 github.com/mattn/go-runewidth v0.0.9 github.com/spf13/cobra v0.0.7 - golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 + golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200602100848-8d3cce7afc34 + golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 ) diff --git a/go.sum b/go.sum index 454b0bb..3ab1d15 100644 --- a/go.sum +++ b/go.sum @@ -20,8 +20,8 @@ github.com/charmbracelet/bubbles v0.0.0-20200602224800-12b2758d50f2 h1:JDEhuhIiB github.com/charmbracelet/bubbles v0.0.0-20200602224800-12b2758d50f2/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= -github.com/charmbracelet/bubbletea v0.7.1-0.20200528144715-b10f6d679158 h1:aOjBpErc3ZM0KYma+JSRcWk5UZx/Tat9lnrzrflb+GM= -github.com/charmbracelet/bubbletea v0.7.1-0.20200528144715-b10f6d679158/go.mod h1:DzNhKkQQJI30eb+kBcaOs1+z86zTSqcMgSHoFY+uCsg= +github.com/charmbracelet/bubbletea v0.8.0 h1:ruZFaFF+2kgCI1IwNG40KTYDW5ZvE2+hPy4odlBdUko= +github.com/charmbracelet/bubbletea v0.8.0/go.mod h1:DzNhKkQQJI30eb+kBcaOs1+z86zTSqcMgSHoFY+uCsg= github.com/charmbracelet/charm v0.5.1 h1:2r6QYeIepEk+wmCXSN4TlotwTF5twlWm87AMGXLahnk= github.com/charmbracelet/charm v0.5.1/go.mod h1:XBsJjir4zSEMSbbI42JSuyTYQAOcg43bsxe+GUoQHUo= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= @@ -153,6 +153,8 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM= +golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -179,8 +181,8 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602100848-8d3cce7afc34 h1:u6CI7A++8r4SItZHYe2cWeAEndN4p1p+3Oum/Ft2EzM= -golang.org/x/sys v0.0.0-20200602100848-8d3cce7afc34/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 9179515e6246aca4f9550fb6ffaff4c0f50b3c96 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 8 Jun 2020 13:15:02 -0400 Subject: [PATCH 292/911] Close help when unloading/resetting pager --- ui/pager.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 64d2011..3f0564b 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -124,7 +124,15 @@ func (m *pagerModel) setContent(s string) { m.viewport.SetContent(s) } +func (m *pagerModel) toggleHeight() { + m.showHelp = !m.showHelp + m.setSize(m.width, m.height) +} + func (m *pagerModel) unload() { + if m.showHelp { + m.toggleHeight() + } m.state = pagerStateBrowse m.viewport.SetContent("") m.viewport.Y = 0 @@ -183,8 +191,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { } return m, textinput.Blink(m.textInput) case "?": - m.showHelp = !m.showHelp - m.setSize(m.width, m.height) + m.toggleHeight() } } From 562d02dc43fff2cdca3d6be2f822667674dc3e79 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 8 Jun 2020 13:43:55 -0400 Subject: [PATCH 293/911] Properly truncate fullwidth/double-byte chars --- ui/pager.go | 5 ++--- ui/stash.go | 10 ++-------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 3f0564b..da4e385 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -266,14 +266,13 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { if len(noteText) == 0 { noteText = "(No title)" } - noteText = truncate(" "+noteText+" ", max( - 0, + noteText = truncate(" "+noteText+" ", max(0, m.width-len(logoText)-len(percentText)-len(helpNoteText), )) // Empty space emptyCell := te.String(" ").Background(statusBarBg.Color()).String() - padding := max(0, m.width-len(logoText)-len(noteText)-len(percentText)-len(helpNoteText)) + padding := max(0, m.width-len(logoText)-runewidth.StringWidth(noteText)-len(percentText)-len(helpNoteText)) emptySpace := strings.Repeat(emptyCell, padding) fmt.Fprintf(b, "%s%s%s%s%s", diff --git a/ui/stash.go b/ui/stash.go index a4e476a..7ad09be 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -14,6 +14,7 @@ import ( "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/dustin/go-humanize" + runewidth "github.com/mattn/go-runewidth" te "github.com/muesli/termenv" ) @@ -587,14 +588,7 @@ func wrapMarkdowns(t markdownType, md []*charm.Markdown) (m []*markdown) { } func truncate(str string, num int) string { - s := str - if len(str) > num { - if num > 1 { - num -= 1 - } - s = str[0:num] + "…" - } - return s + return runewidth.Truncate(str, num, "…") } var magnitudes = []humanize.RelTimeMagnitude{ From b9c02d756b44dedd580ab79e85aea1a9a7a7875b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 10 Jun 2020 09:08:06 -0400 Subject: [PATCH 294/911] Fix a bug where pressing q would cancel note input --- go.mod | 2 ++ go.sum | 3 +++ ui/stash.go | 2 -- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 1c4e7dc..aa6a1e9 100644 --- a/go.mod +++ b/go.mod @@ -16,3 +16,5 @@ require ( golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 ) + +replace github.com/charmbracelet/bubbles => ../bubbles diff --git a/go.sum b/go.sum index 3ab1d15..020e8a8 100644 --- a/go.sum +++ b/go.sum @@ -184,8 +184,11 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= diff --git a/ui/stash.go b/ui/stash.go index 7ad09be..d3ffcfc 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -359,8 +359,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { - case "q": - fallthrough case "esc": // Cancel note m.state = stashStateReady From dde45d99e81293c6a6f381265414f7fd3e0f74e9 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 11 Jun 2020 17:09:31 -0400 Subject: [PATCH 295/911] Pressing 'q' when setting a note in the pager shouldn't cancel the note --- ui/pager.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index da4e385..82f69d6 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -153,8 +153,6 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { switch m.state { case pagerStateSetNote: switch msg.String() { - case "q": - fallthrough case "esc": m.state = pagerStateBrowse return m, nil From 16ae4b5563fd648f6576d721760a2adab1ab94ab Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 12 Jun 2020 10:58:23 -0400 Subject: [PATCH 296/911] Bump 'bubbles' for unicode support --- go.mod | 4 +--- go.sum | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index aa6a1e9..ecb9784 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.0.0-20200602224800-12b2758d50f2 + github.com/charmbracelet/bubbles v0.2.0 github.com/charmbracelet/bubbletea v0.8.0 github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 @@ -16,5 +16,3 @@ require ( golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 ) - -replace github.com/charmbracelet/bubbles => ../bubbles diff --git a/go.sum b/go.sum index 020e8a8..f2bfc7b 100644 --- a/go.sum +++ b/go.sum @@ -18,6 +18,8 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= github.com/charmbracelet/bubbles v0.0.0-20200602224800-12b2758d50f2 h1:JDEhuhIiBwpnd/3f0o/4pjYobUTnTU+sxvDMCDC/D78= github.com/charmbracelet/bubbles v0.0.0-20200602224800-12b2758d50f2/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= +github.com/charmbracelet/bubbles v0.2.0 h1:2tGD++FxmPUZ+DLjVcpx6HvuJ5HwlmUw2vLF9wi20vQ= +github.com/charmbracelet/bubbles v0.2.0/go.mod h1:RA4uIEHJqv5AJuFGbjB+5YrdNJk4rsi3qxBpdHScBLY= github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.8.0 h1:ruZFaFF+2kgCI1IwNG40KTYDW5ZvE2+hPy4odlBdUko= From 16088b6366ad21adbdee1cec196ad34afeecf4f2 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 12 Jun 2020 18:16:24 -0400 Subject: [PATCH 297/911] Bump Bubble Tea dependency --- go.mod | 4 ++-- go.sum | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index ecb9784..8f72518 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.2.0 - github.com/charmbracelet/bubbletea v0.8.0 + github.com/charmbracelet/bubbletea v0.8.1 github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac @@ -14,5 +14,5 @@ require ( github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 + golang.org/x/sys v0.0.0-20200610111108-226ff32320da ) diff --git a/go.sum b/go.sum index f2bfc7b..4d51cb8 100644 --- a/go.sum +++ b/go.sum @@ -16,14 +16,14 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= -github.com/charmbracelet/bubbles v0.0.0-20200602224800-12b2758d50f2 h1:JDEhuhIiBwpnd/3f0o/4pjYobUTnTU+sxvDMCDC/D78= -github.com/charmbracelet/bubbles v0.0.0-20200602224800-12b2758d50f2/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= github.com/charmbracelet/bubbles v0.2.0 h1:2tGD++FxmPUZ+DLjVcpx6HvuJ5HwlmUw2vLF9wi20vQ= github.com/charmbracelet/bubbles v0.2.0/go.mod h1:RA4uIEHJqv5AJuFGbjB+5YrdNJk4rsi3qxBpdHScBLY= github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.8.0 h1:ruZFaFF+2kgCI1IwNG40KTYDW5ZvE2+hPy4odlBdUko= github.com/charmbracelet/bubbletea v0.8.0/go.mod h1:DzNhKkQQJI30eb+kBcaOs1+z86zTSqcMgSHoFY+uCsg= +github.com/charmbracelet/bubbletea v0.8.1 h1:Q7qdKOl4LJa9QV/LDwFWa9DFlZwwJkQipXrrfu/+dJM= +github.com/charmbracelet/bubbletea v0.8.1/go.mod h1:DzNhKkQQJI30eb+kBcaOs1+z86zTSqcMgSHoFY+uCsg= github.com/charmbracelet/charm v0.5.1 h1:2r6QYeIepEk+wmCXSN4TlotwTF5twlWm87AMGXLahnk= github.com/charmbracelet/charm v0.5.1/go.mod h1:XBsJjir4zSEMSbbI42JSuyTYQAOcg43bsxe+GUoQHUo= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= @@ -185,12 +185,11 @@ golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200610111108-226ff32320da h1:bGb80FudwxpeucJUjPYJXuJ8Hk91vNtfvrymzwiei38= +golang.org/x/sys v0.0.0-20200610111108-226ff32320da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= From 250bf29f6110715c621abfbf69e3476ca02dd606 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 19 Jun 2020 14:51:41 -0400 Subject: [PATCH 298/911] Bump termenv --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8f72518..f547596 100644 --- a/go.mod +++ b/go.mod @@ -14,5 +14,5 @@ require ( github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200610111108-226ff32320da + golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 ) diff --git a/go.sum b/go.sum index 4d51cb8..950e177 100644 --- a/go.sum +++ b/go.sum @@ -185,8 +185,8 @@ golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200610111108-226ff32320da h1:bGb80FudwxpeucJUjPYJXuJ8Hk91vNtfvrymzwiei38= -golang.org/x/sys v0.0.0-20200610111108-226ff32320da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 9eac9e225311e0e115b4e5818e557e7e2087b9e7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 19 Jun 2020 14:56:30 -0400 Subject: [PATCH 299/911] Use new, simplified window resize handling --- ui/pager.go | 7 +------ ui/ui.go | 47 +++++++---------------------------------------- 2 files changed, 8 insertions(+), 46 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 82f69d6..177ce08 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -200,12 +200,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { // We've reveived terminal dimensions, either for the first time or // after a resize - case terminalSizeMsg: - if msg.Error() != nil { - // This will be caught at the top level - return m, nil - } - + case tea.WindowSizeMsg: var cmd tea.Cmd if m.currentDocument != nil { cmd = renderWithGlamour(m, m.currentDocument.Body) diff --git a/ui/ui.go b/ui/ui.go index 4242d90..62c1fa8 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -31,16 +31,6 @@ func NewProgram(style string) *tea.Program { type errMsg error type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} -type terminalResizedMsg struct{} - -type terminalSizeMsg struct { - width int - height int - err error -} - -func (t terminalSizeMsg) Size() (int, int) { return t.width, t.height } -func (t terminalSizeMsg) Error() error { return t.err } // MODEL @@ -110,8 +100,6 @@ func initialize(style string) func() (tea.Model, tea.Cmd) { }, tea.Batch( newCharmClient, spinner.Tick(s), - getTerminalSize(), - listenForTerminalResize(), ) } } @@ -174,28 +162,19 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // Repaint case "ctrl+l": - return m, getTerminalSize() + // TODO + return m, nil } case errMsg: m.err = msg return m, nil - case terminalResizedMsg: - cmds = append(cmds, - getTerminalSize(), - listenForTerminalResize(), - ) - - case terminalSizeMsg: - if msg.Error() != nil { - m.err = msg.Error() - } - w, h := msg.Size() - m.terminalWidth = w - m.terminalHeight = h - m.stash.setSize(w, h) - m.pager.setSize(w, h) + case tea.WindowSizeMsg: + m.terminalWidth = msg.Width + m.terminalHeight = msg.Height + m.stash.setSize(msg.Width, msg.Height) + m.pager.setSize(msg.Width, msg.Height) // TODO: load more stash pages if we've resized, are on the last page, // and haven't loaded more pages yet. @@ -318,18 +297,6 @@ func errorView(err error) string { // COMMANDS -func listenForTerminalResize() tea.Cmd { - return tea.OnResize(func() tea.Msg { - return terminalResizedMsg{} - }) -} - -func getTerminalSize() tea.Cmd { - return tea.GetTerminalSize(func(w, h int, err error) tea.TerminalSizeMsg { - return terminalSizeMsg{width: w, height: h, err: err} - }) -} - func newCharmClient() tea.Msg { cfg, err := charm.ConfigFromEnv() if err != nil { From b2df0cae8f1933a77972d3336260779603e5a536 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 19 Jun 2020 18:34:50 -0400 Subject: [PATCH 300/911] Integrate high performance viewport, but not without issue --- ui/pager.go | 14 ++++++++++++-- ui/ui.go | 3 +++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 177ce08..a9a0224 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -28,6 +28,9 @@ const ( ) var ( + // Whether or not to use fast scroll-based rendering for the viewport + highPerformanceRendering = true + pagerHelpHeight = strings.Count(pagerHelpView(0), "\n") noteHeading = te.String(noteHeadingText). @@ -101,10 +104,15 @@ func newPagerModel(glamourStyle string) pagerModel { ti.CharLimit = noteCharacterLimit ti.Focus() + vp := viewport.Model{} + vp.YPosition = 0 + vp.HighPerformanceRendering = highPerformanceRendering + return pagerModel{ state: pagerStateBrowse, glamourStyle: glamourStyle, textInput: ti, + viewport: vp, } } @@ -113,6 +121,8 @@ func (m *pagerModel) setSize(w, h int) { m.height = h m.viewport.Width = w m.viewport.Height = h - statusBarHeight + m.viewport.YPosition = 0 + m.viewport.Height = h - statusBarHeight m.textInput.Width = w - len(noteHeadingText) - len(notePromptText) - 1 if m.showHelp { @@ -135,7 +145,6 @@ func (m *pagerModel) unload() { } m.state = pagerStateBrowse m.viewport.SetContent("") - m.viewport.Y = 0 m.textInput.Reset() } @@ -190,13 +199,14 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { return m, textinput.Blink(m.textInput) case "?": m.toggleHeight() + cmds = append(cmds, viewport.Sync(m.viewport)) } } // Glow has rendered the content case contentRenderedMsg: m.setContent(string(msg)) - return m, nil + cmds = append(cmds, viewport.Sync(m.viewport)) // We've reveived terminal dimensions, either for the first time or // after a resize diff --git a/ui/ui.go b/ui/ui.go index 62c1fa8..aa417e7 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -149,6 +149,9 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case stateShowDocument: if m.pager.state == pagerStateBrowse { m.unloadDocument() // exits pager + if m.pager.viewport.HighPerformanceRendering { + cmd = tea.ClearScrollArea + } } else { m.pager, cmd = pagerUpdate(msg, m.pager) } From 232a9919c2303be1d63a566caf20b65b82364cd8 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 19 Jun 2020 19:05:45 -0400 Subject: [PATCH 301/911] Respect high performance flag --- ui/pager.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index a9a0224..d91949c 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -199,14 +199,18 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { return m, textinput.Blink(m.textInput) case "?": m.toggleHeight() - cmds = append(cmds, viewport.Sync(m.viewport)) + if m.viewport.HighPerformanceRendering { + cmds = append(cmds, viewport.Sync(m.viewport)) + } } } // Glow has rendered the content case contentRenderedMsg: m.setContent(string(msg)) - cmds = append(cmds, viewport.Sync(m.viewport)) + if m.viewport.HighPerformanceRendering { + cmds = append(cmds, viewport.Sync(m.viewport)) + } // We've reveived terminal dimensions, either for the first time or // after a resize From d3ac07c70ac9be00971bc05f6d96326b1258673d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 19 Jun 2020 19:06:03 -0400 Subject: [PATCH 302/911] Fix bottom line jitteriness with performance rendering --- ui/pager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index d91949c..7c146b1 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -239,7 +239,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { func pagerView(m pagerModel) string { var b strings.Builder - fmt.Fprintf(&b, "\n%s\n", viewport.View(m.viewport)) + fmt.Fprint(&b, viewport.View(m.viewport)+"\n") // Footer if m.state == pagerStateSetNote { From dd828966eb011bedd0e67c076076dda80a156d31 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 19 Jun 2020 19:11:34 -0400 Subject: [PATCH 303/911] Remove extra height and positioning stuff --- ui/pager.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 7c146b1..fab26ff 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -121,8 +121,6 @@ func (m *pagerModel) setSize(w, h int) { m.height = h m.viewport.Width = w m.viewport.Height = h - statusBarHeight - m.viewport.YPosition = 0 - m.viewport.Height = h - statusBarHeight m.textInput.Width = w - len(noteHeadingText) - len(notePromptText) - 1 if m.showHelp { From 048b484df25a1472cd82613722af1c8d69afd3f0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 20 Jun 2020 14:49:56 -0400 Subject: [PATCH 304/911] Reset y offset when resetting pager --- ui/pager.go | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/pager.go b/ui/pager.go index fab26ff..65a08fc 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -143,6 +143,7 @@ func (m *pagerModel) unload() { } m.state = pagerStateBrowse m.viewport.SetContent("") + m.viewport.YOffset = 0 m.textInput.Reset() } From fa0699638368fb67f2c8febe24f4941fb8d642fb Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 20 Jun 2020 15:21:30 -0400 Subject: [PATCH 305/911] Dispell a magic number --- ui/pager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index 65a08fc..5b0acbd 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -124,7 +124,7 @@ func (m *pagerModel) setSize(w, h int) { m.textInput.Width = w - len(noteHeadingText) - len(notePromptText) - 1 if m.showHelp { - m.viewport.Height -= pagerHelpHeight + 1 + m.viewport.Height -= (statusBarHeight + pagerHelpHeight) } } From 6e72cbdc4fa8bebfc3c59d607abdc863016603c9 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 20 Jun 2020 19:54:01 -0400 Subject: [PATCH 306/911] Consolidate debug config stuff --- go.mod | 3 ++- go.sum | 3 --- main.go | 18 +++++++++++++----- ui/pager.go | 17 ++++++++--------- ui/ui.go | 18 +++++++++++++++++- 5 files changed, 40 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index f547596..fdf7f32 100644 --- a/go.mod +++ b/go.mod @@ -8,9 +8,10 @@ require ( github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac + github.com/mattn/go-runewidth v0.0.9 + github.com/meowgorithm/babyenv v1.2.1 github.com/muesli/reflow v0.1.0 github.com/muesli/termenv v0.6.0 - github.com/mattn/go-runewidth v0.0.9 github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect diff --git a/go.sum b/go.sum index 950e177..5892e69 100644 --- a/go.sum +++ b/go.sum @@ -20,7 +20,6 @@ github.com/charmbracelet/bubbles v0.2.0 h1:2tGD++FxmPUZ+DLjVcpx6HvuJ5HwlmUw2vLF9 github.com/charmbracelet/bubbles v0.2.0/go.mod h1:RA4uIEHJqv5AJuFGbjB+5YrdNJk4rsi3qxBpdHScBLY= github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= -github.com/charmbracelet/bubbletea v0.8.0 h1:ruZFaFF+2kgCI1IwNG40KTYDW5ZvE2+hPy4odlBdUko= github.com/charmbracelet/bubbletea v0.8.0/go.mod h1:DzNhKkQQJI30eb+kBcaOs1+z86zTSqcMgSHoFY+uCsg= github.com/charmbracelet/bubbletea v0.8.1 h1:Q7qdKOl4LJa9QV/LDwFWa9DFlZwwJkQipXrrfu/+dJM= github.com/charmbracelet/bubbletea v0.8.1/go.mod h1:DzNhKkQQJI30eb+kBcaOs1+z86zTSqcMgSHoFY+uCsg= @@ -153,7 +152,6 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -183,7 +181,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/main.go b/main.go index 3896d9c..5f2e4b9 100644 --- a/main.go +++ b/main.go @@ -12,6 +12,7 @@ import ( "path/filepath" "strings" + "github.com/meowgorithm/babyenv" "github.com/spf13/cobra" "golang.org/x/crypto/ssh/terminal" @@ -168,22 +169,29 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { // Only run TUI if there are no arguments (excluding flags) if arg == "" { - // Log to a file. For debugging. - logToFilePath := os.Getenv("GLOW_LOG_TO_FILE") - if logToFilePath != "" { - f, err := tea.LogToFile(logToFilePath, "glow") + // Read environment to get debugging stuff + var cfg ui.UIConfig + if err := babyenv.Parse(&cfg); err != nil { + return fmt.Errorf("error parsing config: %v", err) + } + + // Log to file, if set + if cfg.Logfile != "" { + f, err := tea.LogToFile(cfg.Logfile, "glow") if err != nil { return err } defer f.Close() } + // Run Bubble Tea program tea.AltScreen() - if err := ui.NewProgram(style).Start(); err != nil { + if err := ui.NewProgram(style, cfg).Start(); err != nil { return err } tea.ExitAltScreen() + // Exit message fmt.Printf("\n Thanks for using Glow!\n\n") return nil } diff --git a/ui/pager.go b/ui/pager.go index 5b0acbd..7ed50cc 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "math" - "os" "strings" "github.com/charmbracelet/bubbles/textinput" @@ -28,9 +27,6 @@ const ( ) var ( - // Whether or not to use fast scroll-based rendering for the viewport - highPerformanceRendering = true - pagerHelpHeight = strings.Count(pagerHelpView(0), "\n") noteHeading = te.String(noteHeadingText). @@ -93,6 +89,13 @@ type pagerModel struct { } func newPagerModel(glamourStyle string) pagerModel { + + // Init viewport + vp := viewport.Model{} + vp.YPosition = 0 + vp.HighPerformanceRendering = config.HighPerformancePager + + // Init text input UI for notes/memos ti := textinput.NewModel() ti.Prompt = te.String(notePromptText). Foreground(te.ColorProfile().Color(gray)). @@ -104,10 +107,6 @@ func newPagerModel(glamourStyle string) pagerModel { ti.CharLimit = noteCharacterLimit ti.Focus() - vp := viewport.Model{} - vp.YPosition = 0 - vp.HighPerformanceRendering = highPerformanceRendering - return pagerModel{ state: pagerStateBrowse, glamourStyle: glamourStyle, @@ -350,7 +349,7 @@ func saveDocumentNote(cc *charm.Client, id int, note string) tea.Cmd { // This is where the magic happens func glamourRender(m pagerModel, markdown string) (string, error) { - if os.Getenv("GLOW_DISABLE_GLAMOUR") != "" { + if !config.GlamourEnabled { return markdown, nil } diff --git a/ui/ui.go b/ui/ui.go index aa417e7..d41face 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -3,6 +3,7 @@ package ui import ( "errors" "fmt" + "log" "strings" "github.com/charmbracelet/bubbles/spinner" @@ -17,12 +18,27 @@ const ( noteCharacterLimit = 256 // totally arbitrary ) +// UIConfig contains flags for debugging the TUI. +type UIConfig struct { + Logfile string `env:"GLOW_UI_LOGFILE"` + HighPerformancePager bool `env:"GLOW_UI_HIGH_PERFORMANCE_PAGER" default:"true"` + GlamourEnabled bool `env:"GLOW_UI_ENABLE_GLAMOUR" default:"true"` +} + var ( + config UIConfig glowLogoTextColor = common.Color("#ECFD65") ) // NewProgram returns a new Tea program -func NewProgram(style string) *tea.Program { +func NewProgram(style string, cfg UIConfig) *tea.Program { + config = cfg + if config.Logfile != "" { + log.Println("-- Starting Glow ----------------") + log.Printf("High performance pager: %v", cfg.HighPerformancePager) + log.Printf("Render with Glamour: %v", cfg.GlamourEnabled) + log.Println("Bubble Tea now initializing...") + } return tea.NewProgram(initialize(style), update, view) } From a664da30c1dda0119db5471072ee81bfc3ff63b7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 22 Jun 2020 14:01:14 -0400 Subject: [PATCH 307/911] Bump dependencies --- go.mod | 6 +++--- go.sum | 16 +++++++++------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index fdf7f32..3b965a9 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.2.0 - github.com/charmbracelet/bubbletea v0.8.1 + github.com/charmbracelet/bubbles v0.3.0 + github.com/charmbracelet/bubbletea v0.9.0 github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac @@ -15,5 +15,5 @@ require ( github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 + golang.org/x/sys v0.0.0-20200620081246-981b61492c35 ) diff --git a/go.sum b/go.sum index 5892e69..c7acc2f 100644 --- a/go.sum +++ b/go.sum @@ -16,13 +16,13 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= -github.com/charmbracelet/bubbles v0.2.0 h1:2tGD++FxmPUZ+DLjVcpx6HvuJ5HwlmUw2vLF9wi20vQ= -github.com/charmbracelet/bubbles v0.2.0/go.mod h1:RA4uIEHJqv5AJuFGbjB+5YrdNJk4rsi3qxBpdHScBLY= +github.com/charmbracelet/bubbles v0.3.0 h1:LLgCwObyNwSILHOK9nLxWRUx1nzEGJgLJhkyg5f+5b4= +github.com/charmbracelet/bubbles v0.3.0/go.mod h1:3v6yfT4kd1oOivS8uOXyWvDo1DaXO3R88mlijgPDo7w= github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= -github.com/charmbracelet/bubbletea v0.8.0/go.mod h1:DzNhKkQQJI30eb+kBcaOs1+z86zTSqcMgSHoFY+uCsg= -github.com/charmbracelet/bubbletea v0.8.1 h1:Q7qdKOl4LJa9QV/LDwFWa9DFlZwwJkQipXrrfu/+dJM= -github.com/charmbracelet/bubbletea v0.8.1/go.mod h1:DzNhKkQQJI30eb+kBcaOs1+z86zTSqcMgSHoFY+uCsg= +github.com/charmbracelet/bubbletea v0.8.3-0.20200622174044-8bab4bce9a84/go.mod h1:jRlRe1bNetdeBUvRF8G1coY18WB0Gy5EJyT8JJ532pg= +github.com/charmbracelet/bubbletea v0.9.0 h1:zSr/mAWOUSCCnCj0T8to5dvSz1eA44lz3OtxpxnDCSk= +github.com/charmbracelet/bubbletea v0.9.0/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= github.com/charmbracelet/charm v0.5.1 h1:2r6QYeIepEk+wmCXSN4TlotwTF5twlWm87AMGXLahnk= github.com/charmbracelet/charm v0.5.1/go.mod h1:XBsJjir4zSEMSbbI42JSuyTYQAOcg43bsxe+GUoQHUo= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= @@ -98,6 +98,8 @@ github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200526053627-d728968dcf83/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= +github.com/muesli/termenv v0.5.3-0.20200617122104-66d435cfe924/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= +github.com/muesli/termenv v0.5.3-0.20200617154346-da5de72b61c0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.6.0 h1:zxvzTBmo4ZcxhNGGWeMz+Tttm51eF5bmPjfy4MCRYlk= github.com/muesli/termenv v0.6.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -181,9 +183,9 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200620081246-981b61492c35 h1:wb/9mP8eUAmHfkM8RmpeLq6nUA7c2i5+bQOtcDftjaE= +golang.org/x/sys v0.0.0-20200620081246-981b61492c35/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 0f508533ac161254774104fa66dce186b991c1af Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 22 Jun 2020 14:51:11 -0400 Subject: [PATCH 308/911] Bump Bubble Tea and Bubbles for hotfixes --- go.mod | 6 +++--- go.sum | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 3b965a9..9a21d90 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.3.0 - github.com/charmbracelet/bubbletea v0.9.0 + github.com/charmbracelet/bubbles v0.3.1-0.20200622184921-35c3cd626d97 + github.com/charmbracelet/bubbletea v0.9.1-0.20200622183546-05f302845295 github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac @@ -15,5 +15,5 @@ require ( github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200620081246-981b61492c35 + golang.org/x/sys v0.0.0-20200622182413-4b0db7f3f76b ) diff --git a/go.sum b/go.sum index c7acc2f..315070f 100644 --- a/go.sum +++ b/go.sum @@ -16,13 +16,13 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= -github.com/charmbracelet/bubbles v0.3.0 h1:LLgCwObyNwSILHOK9nLxWRUx1nzEGJgLJhkyg5f+5b4= -github.com/charmbracelet/bubbles v0.3.0/go.mod h1:3v6yfT4kd1oOivS8uOXyWvDo1DaXO3R88mlijgPDo7w= +github.com/charmbracelet/bubbles v0.3.1-0.20200622184921-35c3cd626d97 h1:HlgKT7mT/p/BMWXpCCvZ1SGB2wXaYfVaM9AaJrCs1Qw= +github.com/charmbracelet/bubbles v0.3.1-0.20200622184921-35c3cd626d97/go.mod h1:3v6yfT4kd1oOivS8uOXyWvDo1DaXO3R88mlijgPDo7w= github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.8.3-0.20200622174044-8bab4bce9a84/go.mod h1:jRlRe1bNetdeBUvRF8G1coY18WB0Gy5EJyT8JJ532pg= -github.com/charmbracelet/bubbletea v0.9.0 h1:zSr/mAWOUSCCnCj0T8to5dvSz1eA44lz3OtxpxnDCSk= -github.com/charmbracelet/bubbletea v0.9.0/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= +github.com/charmbracelet/bubbletea v0.9.1-0.20200622183546-05f302845295 h1:2WSpFUowuWj4jaDzxzauEobCOIJbA6MN4Eu5Zl36cHw= +github.com/charmbracelet/bubbletea v0.9.1-0.20200622183546-05f302845295/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= github.com/charmbracelet/charm v0.5.1 h1:2r6QYeIepEk+wmCXSN4TlotwTF5twlWm87AMGXLahnk= github.com/charmbracelet/charm v0.5.1/go.mod h1:XBsJjir4zSEMSbbI42JSuyTYQAOcg43bsxe+GUoQHUo= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= @@ -186,6 +186,8 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200620081246-981b61492c35 h1:wb/9mP8eUAmHfkM8RmpeLq6nUA7c2i5+bQOtcDftjaE= golang.org/x/sys v0.0.0-20200620081246-981b61492c35/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622182413-4b0db7f3f76b h1:K/lGZjl2fciTddokWoFMrsvKYoudTOUiqj7yfBHYIZk= +golang.org/x/sys v0.0.0-20200622182413-4b0db7f3f76b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From fcaa65498477a7973801cdd67b2bd20f50170a69 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 22 Jun 2020 15:11:48 -0400 Subject: [PATCH 309/911] Remove spinner custom message stuff which is no longer supported --- ui/stash.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index d3ffcfc..70dded8 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -28,7 +28,6 @@ const ( // MSG -type stashSpinnerTickMsg struct{} type gotStashMsg []*charm.Markdown type gotNewsMsg []*charm.Markdown type fetchedMarkdownMsg *markdown @@ -152,7 +151,6 @@ func stashInit(cc *charm.Client) (stashModel, tea.Cmd) { s := spinner.NewModel() s.Type = spinner.Dot s.ForegroundColor = common.SpinnerColor - s.CustomMsgFunc = func() tea.Msg { return stashSpinnerTickMsg{} } p := paginator.NewModel() p.Type = paginator.Dots @@ -217,7 +215,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.state = stashStateReady } - case stashSpinnerTickMsg: + case spinner.TickMsg: if m.state == stashStateInit || m.state == stashStateLoadingDocument { m.spinner, cmd = spinner.Update(msg, m.spinner) cmds = append(cmds, cmd) From 7f9cc958936dee5719744dd5182df870e6e33d36 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 22 Jun 2020 15:57:22 -0400 Subject: [PATCH 310/911] Update altscreen calls per latest Bubble Tea update --- go.mod | 2 +- go.sum | 2 ++ main.go | 7 ++++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 9a21d90..9526da0 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.3.1-0.20200622184921-35c3cd626d97 - github.com/charmbracelet/bubbletea v0.9.1-0.20200622183546-05f302845295 + github.com/charmbracelet/bubbletea v0.9.1-0.20200622195552-3a70ecdde174 github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac diff --git a/go.sum b/go.sum index 315070f..97635e9 100644 --- a/go.sum +++ b/go.sum @@ -23,6 +23,8 @@ github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8N github.com/charmbracelet/bubbletea v0.8.3-0.20200622174044-8bab4bce9a84/go.mod h1:jRlRe1bNetdeBUvRF8G1coY18WB0Gy5EJyT8JJ532pg= github.com/charmbracelet/bubbletea v0.9.1-0.20200622183546-05f302845295 h1:2WSpFUowuWj4jaDzxzauEobCOIJbA6MN4Eu5Zl36cHw= github.com/charmbracelet/bubbletea v0.9.1-0.20200622183546-05f302845295/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= +github.com/charmbracelet/bubbletea v0.9.1-0.20200622195552-3a70ecdde174 h1:yoSMCUbQwf1Q+kPg0fPRTU5+lTWNiH4Eesv10Ji1LjE= +github.com/charmbracelet/bubbletea v0.9.1-0.20200622195552-3a70ecdde174/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= github.com/charmbracelet/charm v0.5.1 h1:2r6QYeIepEk+wmCXSN4TlotwTF5twlWm87AMGXLahnk= github.com/charmbracelet/charm v0.5.1/go.mod h1:XBsJjir4zSEMSbbI42JSuyTYQAOcg43bsxe+GUoQHUo= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= diff --git a/main.go b/main.go index 5f2e4b9..233ace3 100644 --- a/main.go +++ b/main.go @@ -185,11 +185,12 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { } // Run Bubble Tea program - tea.AltScreen() - if err := ui.NewProgram(style, cfg).Start(); err != nil { + p := ui.NewProgram(style, cfg) + p.EnterAltScreen() + if err := p.Start(); err != nil { return err } - tea.ExitAltScreen() + p.ExitAltScreen() // Exit message fmt.Printf("\n Thanks for using Glow!\n\n") From 5b3feb41a2f28c181771160797381f45aca1d3eb Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 23 Jun 2020 10:36:11 -0400 Subject: [PATCH 311/911] Bump Bubble Tea dependency for mouse support --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 9526da0..b21d27e 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.3.1-0.20200622184921-35c3cd626d97 - github.com/charmbracelet/bubbletea v0.9.1-0.20200622195552-3a70ecdde174 + github.com/charmbracelet/bubbletea v0.9.1-0.20200623143446-d6cf9e69b6f2 github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac @@ -13,7 +13,7 @@ require ( github.com/muesli/reflow v0.1.0 github.com/muesli/termenv v0.6.0 github.com/spf13/cobra v0.0.7 - golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 + golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200622182413-4b0db7f3f76b + golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 ) diff --git a/go.sum b/go.sum index 97635e9..6115710 100644 --- a/go.sum +++ b/go.sum @@ -21,10 +21,8 @@ github.com/charmbracelet/bubbles v0.3.1-0.20200622184921-35c3cd626d97/go.mod h1: github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.8.3-0.20200622174044-8bab4bce9a84/go.mod h1:jRlRe1bNetdeBUvRF8G1coY18WB0Gy5EJyT8JJ532pg= -github.com/charmbracelet/bubbletea v0.9.1-0.20200622183546-05f302845295 h1:2WSpFUowuWj4jaDzxzauEobCOIJbA6MN4Eu5Zl36cHw= -github.com/charmbracelet/bubbletea v0.9.1-0.20200622183546-05f302845295/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= -github.com/charmbracelet/bubbletea v0.9.1-0.20200622195552-3a70ecdde174 h1:yoSMCUbQwf1Q+kPg0fPRTU5+lTWNiH4Eesv10Ji1LjE= -github.com/charmbracelet/bubbletea v0.9.1-0.20200622195552-3a70ecdde174/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= +github.com/charmbracelet/bubbletea v0.9.1-0.20200623143446-d6cf9e69b6f2 h1:BargGILXuSKJiid+zYzS6z51fAmSfFBL1U5pAi+s9bk= +github.com/charmbracelet/bubbletea v0.9.1-0.20200623143446-d6cf9e69b6f2/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= github.com/charmbracelet/charm v0.5.1 h1:2r6QYeIepEk+wmCXSN4TlotwTF5twlWm87AMGXLahnk= github.com/charmbracelet/charm v0.5.1/go.mod h1:XBsJjir4zSEMSbbI42JSuyTYQAOcg43bsxe+GUoQHUo= github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= @@ -159,6 +157,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -188,8 +188,8 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200620081246-981b61492c35 h1:wb/9mP8eUAmHfkM8RmpeLq6nUA7c2i5+bQOtcDftjaE= golang.org/x/sys v0.0.0-20200620081246-981b61492c35/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622182413-4b0db7f3f76b h1:K/lGZjl2fciTddokWoFMrsvKYoudTOUiqj7yfBHYIZk= -golang.org/x/sys v0.0.0-20200622182413-4b0db7f3f76b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From c954898009f8f5e229630cccbb73490c072c7965 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 23 Jun 2020 12:03:00 -0400 Subject: [PATCH 312/911] Add basic mouse wheel support to pager --- go.mod | 2 +- go.sum | 2 ++ main.go | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index b21d27e..ab294b6 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.3.1-0.20200622184921-35c3cd626d97 + github.com/charmbracelet/bubbles v0.3.1-0.20200623160017-c9196e5407ad github.com/charmbracelet/bubbletea v0.9.1-0.20200623143446-d6cf9e69b6f2 github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 diff --git a/go.sum b/go.sum index 6115710..215d42d 100644 --- a/go.sum +++ b/go.sum @@ -18,6 +18,8 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= github.com/charmbracelet/bubbles v0.3.1-0.20200622184921-35c3cd626d97 h1:HlgKT7mT/p/BMWXpCCvZ1SGB2wXaYfVaM9AaJrCs1Qw= github.com/charmbracelet/bubbles v0.3.1-0.20200622184921-35c3cd626d97/go.mod h1:3v6yfT4kd1oOivS8uOXyWvDo1DaXO3R88mlijgPDo7w= +github.com/charmbracelet/bubbles v0.3.1-0.20200623160017-c9196e5407ad h1:oVOOqMWwb1ST9nu9vWGLlFC/dJWQlkUnsJbElOo1BPM= +github.com/charmbracelet/bubbles v0.3.1-0.20200623160017-c9196e5407ad/go.mod h1:3v6yfT4kd1oOivS8uOXyWvDo1DaXO3R88mlijgPDo7w= github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.8.3-0.20200622174044-8bab4bce9a84/go.mod h1:jRlRe1bNetdeBUvRF8G1coY18WB0Gy5EJyT8JJ532pg= diff --git a/main.go b/main.go index 233ace3..b51ec1d 100644 --- a/main.go +++ b/main.go @@ -187,10 +187,12 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { // Run Bubble Tea program p := ui.NewProgram(style, cfg) p.EnterAltScreen() + p.EnableMouseCellMotion() if err := p.Start(); err != nil { return err } p.ExitAltScreen() + p.DisableMouseCellMotion() // Exit message fmt.Printf("\n Thanks for using Glow!\n\n") From 3660182cdb64c94128ffe6910813639bca67a8b4 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 23 Jun 2020 13:11:34 -0400 Subject: [PATCH 313/911] Bump bubbles dependency for mouse wheel correction --- go.mod | 2 +- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index ab294b6..8d374dc 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.3.1-0.20200623160017-c9196e5407ad + github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6 github.com/charmbracelet/bubbletea v0.9.1-0.20200623143446-d6cf9e69b6f2 github.com/charmbracelet/charm v0.5.1 github.com/charmbracelet/glamour v0.2.0 diff --git a/go.sum b/go.sum index 215d42d..efd65ed 100644 --- a/go.sum +++ b/go.sum @@ -16,10 +16,8 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= -github.com/charmbracelet/bubbles v0.3.1-0.20200622184921-35c3cd626d97 h1:HlgKT7mT/p/BMWXpCCvZ1SGB2wXaYfVaM9AaJrCs1Qw= -github.com/charmbracelet/bubbles v0.3.1-0.20200622184921-35c3cd626d97/go.mod h1:3v6yfT4kd1oOivS8uOXyWvDo1DaXO3R88mlijgPDo7w= -github.com/charmbracelet/bubbles v0.3.1-0.20200623160017-c9196e5407ad h1:oVOOqMWwb1ST9nu9vWGLlFC/dJWQlkUnsJbElOo1BPM= -github.com/charmbracelet/bubbles v0.3.1-0.20200623160017-c9196e5407ad/go.mod h1:3v6yfT4kd1oOivS8uOXyWvDo1DaXO3R88mlijgPDo7w= +github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6 h1:7RC108JxvxaQL3rAV32OnVvmyqvCSpdJONflwEbCk7k= +github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6/go.mod h1:3v6yfT4kd1oOivS8uOXyWvDo1DaXO3R88mlijgPDo7w= github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.8.3-0.20200622174044-8bab4bce9a84/go.mod h1:jRlRe1bNetdeBUvRF8G1coY18WB0Gy5EJyT8JJ532pg= From 93e80b0319968b292e9005dcf781e992cc18c39d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 23 Jun 2020 14:16:11 -0400 Subject: [PATCH 314/911] Bump Charm dependency to improve SSH connection stuff --- go.mod | 6 +++--- go.sum | 24 ++++++++---------------- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 8d374dc..1e55509 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,9 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6 - github.com/charmbracelet/bubbletea v0.9.1-0.20200623143446-d6cf9e69b6f2 - github.com/charmbracelet/charm v0.5.1 - github.com/charmbracelet/glamour v0.2.0 + github.com/charmbracelet/bubbletea v0.9.1-0.20200623160123-de147c5061d9 + github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2 + github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.2.1 diff --git a/go.sum b/go.sum index efd65ed..93fa92c 100644 --- a/go.sum +++ b/go.sum @@ -15,18 +15,15 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/bubbles v0.0.0-20200526000837-87c7cd778f80/go.mod h1:/AeLRFlL2Uf4X7U5LjnswTII6u4maPzMm1+vZfeUJKc= github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6 h1:7RC108JxvxaQL3rAV32OnVvmyqvCSpdJONflwEbCk7k= github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6/go.mod h1:3v6yfT4kd1oOivS8uOXyWvDo1DaXO3R88mlijgPDo7w= -github.com/charmbracelet/bubbletea v0.6.4-0.20200525234836-3b8b011b5a26/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= -github.com/charmbracelet/bubbletea v0.7.0/go.mod h1:BTzHOUvUlKecQz7ZB8NgPRWi2Z8NRCV04qwyFOfO1Kk= github.com/charmbracelet/bubbletea v0.8.3-0.20200622174044-8bab4bce9a84/go.mod h1:jRlRe1bNetdeBUvRF8G1coY18WB0Gy5EJyT8JJ532pg= -github.com/charmbracelet/bubbletea v0.9.1-0.20200623143446-d6cf9e69b6f2 h1:BargGILXuSKJiid+zYzS6z51fAmSfFBL1U5pAi+s9bk= -github.com/charmbracelet/bubbletea v0.9.1-0.20200623143446-d6cf9e69b6f2/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= -github.com/charmbracelet/charm v0.5.1 h1:2r6QYeIepEk+wmCXSN4TlotwTF5twlWm87AMGXLahnk= -github.com/charmbracelet/charm v0.5.1/go.mod h1:XBsJjir4zSEMSbbI42JSuyTYQAOcg43bsxe+GUoQHUo= -github.com/charmbracelet/glamour v0.2.0 h1:mTgaiNiumpqTZp3qVM6DH9UB0NlbY17wejoMf1kM8Pg= -github.com/charmbracelet/glamour v0.2.0/go.mod h1:UA27Kwj3QHialP74iU6C+Gpc8Y7IOAKupeKMLLBURWM= +github.com/charmbracelet/bubbletea v0.9.1-0.20200623160123-de147c5061d9 h1:01IwIGFHfGjZFP4L3VffFCdQ0VBJ9s9aUZXBu85dUnE= +github.com/charmbracelet/bubbletea v0.9.1-0.20200623160123-de147c5061d9/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= +github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2 h1:2hTjqbJgadO+SJZltrCdQ1LunnQ1COabfaTuCx7v15Y= +github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2/go.mod h1:aJpJ0hrvN95n8u96tCevUsK+XNxr2BJp1eR5LhV0BHg= +github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= +github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06/go.mod h1:ECr5vYu2tKCePqAbZNUh94HiZDPMtbc9ggAy4n585JU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -97,7 +94,6 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= -github.com/muesli/termenv v0.5.3-0.20200526053627-d728968dcf83/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200617122104-66d435cfe924/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200617154346-da5de72b61c0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.6.0 h1:zxvzTBmo4ZcxhNGGWeMz+Tttm51eF5bmPjfy4MCRYlk= @@ -146,8 +142,8 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1 github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.2.0 h1:WOOcyaJPlzb8fZ8TloxFe8QZkhOOJx87leDa9MIT9dc= -github.com/yuin/goldmark v1.2.0/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.30 h1:j4d4Lw3zqZelDhBksEo3BnWg9xhXRQGJPPSL6OApZjI= +github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -155,7 +151,6 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -183,10 +178,7 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200620081246-981b61492c35 h1:wb/9mP8eUAmHfkM8RmpeLq6nUA7c2i5+bQOtcDftjaE= golang.org/x/sys v0.0.0-20200620081246-981b61492c35/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From 40dfa9e1b7a1fbdabf6a66b374b85b947999a950 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 23 Jun 2020 15:11:54 -0400 Subject: [PATCH 315/911] Comments --- ui/ui.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index d41face..0dcbadb 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -15,7 +15,7 @@ import ( ) const ( - noteCharacterLimit = 256 // totally arbitrary + noteCharacterLimit = 256 // should match server ) // UIConfig contains flags for debugging the TUI. @@ -60,7 +60,7 @@ const ( stateShowDocument ) -// Stringn translates the staus to a human-readable string. This is just for +// String translates the staus to a human-readable string. This is just for // debugging. func (s state) String() string { return [...]string{ @@ -151,6 +151,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case "esc": var cmd tea.Cmd + // Send these keys through to stash switch m.state { case stateShowStash: @@ -162,13 +163,16 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { return m, cmd } + // Special cases for the pager case stateShowDocument: if m.pager.state == pagerStateBrowse { - m.unloadDocument() // exits pager + // If the user is just browing a document, exit the pager. + m.unloadDocument() if m.pager.viewport.HighPerformanceRendering { cmd = tea.ClearScrollArea } } else { + // Otherwise send keys through to pager for processing m.pager, cmd = pagerUpdate(msg, m.pager) } return m, cmd @@ -176,6 +180,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { return m, tea.Quit + // Ctrl+C always quits no matter where in the application you are. case "ctrl+c": return m, tea.Quit From 1280ed3bbeabf1a239907a5891aaf4f5f192c0c1 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 23 Jun 2020 17:30:37 -0400 Subject: [PATCH 316/911] Bump Bubble Tea to get captured variable/race condition fix on init --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 1e55509..e8a3b77 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6 - github.com/charmbracelet/bubbletea v0.9.1-0.20200623160123-de147c5061d9 + github.com/charmbracelet/bubbletea v0.9.1-0.20200623212600-e90039d16e5d github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac diff --git a/go.sum b/go.sum index 93fa92c..04803dd 100644 --- a/go.sum +++ b/go.sum @@ -20,6 +20,8 @@ github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6/go.mod h1: github.com/charmbracelet/bubbletea v0.8.3-0.20200622174044-8bab4bce9a84/go.mod h1:jRlRe1bNetdeBUvRF8G1coY18WB0Gy5EJyT8JJ532pg= github.com/charmbracelet/bubbletea v0.9.1-0.20200623160123-de147c5061d9 h1:01IwIGFHfGjZFP4L3VffFCdQ0VBJ9s9aUZXBu85dUnE= github.com/charmbracelet/bubbletea v0.9.1-0.20200623160123-de147c5061d9/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= +github.com/charmbracelet/bubbletea v0.9.1-0.20200623212600-e90039d16e5d h1:De/A8Lg9livaJ6gvZ2o8jRuSEj0WJkx2VE09K/1pWC8= +github.com/charmbracelet/bubbletea v0.9.1-0.20200623212600-e90039d16e5d/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2 h1:2hTjqbJgadO+SJZltrCdQ1LunnQ1COabfaTuCx7v15Y= github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2/go.mod h1:aJpJ0hrvN95n8u96tCevUsK+XNxr2BJp1eR5LhV0BHg= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= From 8370f7441ed6a0ce4c41827b1cff63fbbf935b8b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 24 Jun 2020 11:45:45 -0400 Subject: [PATCH 317/911] Fix a crash when opening pager help in very narrow windows --- ui/pager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index 7ed50cc..d780660 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -310,7 +310,7 @@ func pagerHelpView(width int) (s string) { lines := strings.Split(s, "\n") for i := 0; i < len(lines); i++ { l := runewidth.StringWidth(lines[i]) - n := width - l + n := max(width-l, 0) lines[i] += strings.Repeat(" ", n) } From 89e5e389534f6e8e54f527bf9ef0688a9ba1ac39 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 25 Jun 2020 19:26:04 -0400 Subject: [PATCH 318/911] Bump Bubble Tea to fix redraw bug with short documents --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index e8a3b77..3e26f04 100644 --- a/go.mod +++ b/go.mod @@ -11,9 +11,9 @@ require ( github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.2.1 github.com/muesli/reflow v0.1.0 - github.com/muesli/termenv v0.6.0 + github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04 github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 + golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae ) diff --git a/go.sum b/go.sum index 04803dd..1d0d096 100644 --- a/go.sum +++ b/go.sum @@ -18,7 +18,6 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6 h1:7RC108JxvxaQL3rAV32OnVvmyqvCSpdJONflwEbCk7k= github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6/go.mod h1:3v6yfT4kd1oOivS8uOXyWvDo1DaXO3R88mlijgPDo7w= github.com/charmbracelet/bubbletea v0.8.3-0.20200622174044-8bab4bce9a84/go.mod h1:jRlRe1bNetdeBUvRF8G1coY18WB0Gy5EJyT8JJ532pg= -github.com/charmbracelet/bubbletea v0.9.1-0.20200623160123-de147c5061d9 h1:01IwIGFHfGjZFP4L3VffFCdQ0VBJ9s9aUZXBu85dUnE= github.com/charmbracelet/bubbletea v0.9.1-0.20200623160123-de147c5061d9/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= github.com/charmbracelet/bubbletea v0.9.1-0.20200623212600-e90039d16e5d h1:De/A8Lg9livaJ6gvZ2o8jRuSEj0WJkx2VE09K/1pWC8= github.com/charmbracelet/bubbletea v0.9.1-0.20200623212600-e90039d16e5d/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= @@ -98,8 +97,8 @@ github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200617122104-66d435cfe924/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200617154346-da5de72b61c0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= -github.com/muesli/termenv v0.6.0 h1:zxvzTBmo4ZcxhNGGWeMz+Tttm51eF5bmPjfy4MCRYlk= -github.com/muesli/termenv v0.6.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= +github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04 h1:Wr876oXlAk6avTWi0daXAriOr+r5fqIuyDmtNc/KwY0= +github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= @@ -182,8 +181,9 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200620081246-981b61492c35/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 9931472aec5820550fad2da360d7f8a34bb3add9 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 6 Jul 2020 11:55:33 -0400 Subject: [PATCH 319/911] Bump Bubble Tea to fix bux where short docs show loader underneath --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3e26f04..88c2e99 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6 - github.com/charmbracelet/bubbletea v0.9.1-0.20200623212600-e90039d16e5d + github.com/charmbracelet/bubbletea v0.9.1-0.20200706155402-14a06b089612 github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac diff --git a/go.sum b/go.sum index 1d0d096..559cce8 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,8 @@ github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6 h1:7RC108J github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6/go.mod h1:3v6yfT4kd1oOivS8uOXyWvDo1DaXO3R88mlijgPDo7w= github.com/charmbracelet/bubbletea v0.8.3-0.20200622174044-8bab4bce9a84/go.mod h1:jRlRe1bNetdeBUvRF8G1coY18WB0Gy5EJyT8JJ532pg= github.com/charmbracelet/bubbletea v0.9.1-0.20200623160123-de147c5061d9/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= -github.com/charmbracelet/bubbletea v0.9.1-0.20200623212600-e90039d16e5d h1:De/A8Lg9livaJ6gvZ2o8jRuSEj0WJkx2VE09K/1pWC8= -github.com/charmbracelet/bubbletea v0.9.1-0.20200623212600-e90039d16e5d/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= +github.com/charmbracelet/bubbletea v0.9.1-0.20200706155402-14a06b089612 h1:TMbIM91CwSSHboma9Y6Puyu6lx+rX5wdy7KvDwhCM4w= +github.com/charmbracelet/bubbletea v0.9.1-0.20200706155402-14a06b089612/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2 h1:2hTjqbJgadO+SJZltrCdQ1LunnQ1COabfaTuCx7v15Y= github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2/go.mod h1:aJpJ0hrvN95n8u96tCevUsK+XNxr2BJp1eR5LhV0BHg= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= From c9fcf3b58e4153060a080732d50978af7fffc15d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 13 Jul 2020 11:40:42 -0400 Subject: [PATCH 320/911] Bump bubletea to fix macOS term bug where memo got sucked into scroll area --- go.mod | 4 ++-- go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 88c2e99..bc04310 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6 - github.com/charmbracelet/bubbletea v0.9.1-0.20200706155402-14a06b089612 + github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90 github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac @@ -13,7 +13,7 @@ require ( github.com/muesli/reflow v0.1.0 github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04 github.com/spf13/cobra v0.0.7 - golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 + golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae ) diff --git a/go.sum b/go.sum index 559cce8..e257ad8 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,8 @@ github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6 h1:7RC108J github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6/go.mod h1:3v6yfT4kd1oOivS8uOXyWvDo1DaXO3R88mlijgPDo7w= github.com/charmbracelet/bubbletea v0.8.3-0.20200622174044-8bab4bce9a84/go.mod h1:jRlRe1bNetdeBUvRF8G1coY18WB0Gy5EJyT8JJ532pg= github.com/charmbracelet/bubbletea v0.9.1-0.20200623160123-de147c5061d9/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= -github.com/charmbracelet/bubbletea v0.9.1-0.20200706155402-14a06b089612 h1:TMbIM91CwSSHboma9Y6Puyu6lx+rX5wdy7KvDwhCM4w= -github.com/charmbracelet/bubbletea v0.9.1-0.20200706155402-14a06b089612/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= +github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90 h1:nt4h8pwRZgoIRSgGaPGAgkoiZui1MYeDhRFPwSiEI4g= +github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2 h1:2hTjqbJgadO+SJZltrCdQ1LunnQ1COabfaTuCx7v15Y= github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2/go.mod h1:aJpJ0hrvN95n8u96tCevUsK+XNxr2BJp1eR5LhV0BHg= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= @@ -155,6 +155,8 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg= +golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= From 71b9387e0108ba316d10ee7dc5414088eeee1808 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 12:27:08 -0400 Subject: [PATCH 321/911] Add gitcha --- go.mod | 2 +- go.sum | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index bc04310..b1d4e72 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.2.1 - github.com/muesli/reflow v0.1.0 + github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1 // indirect github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04 github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 diff --git a/go.sum b/go.sum index e257ad8..ba25aaa 100644 --- a/go.sum +++ b/go.sum @@ -92,6 +92,7 @@ github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/le github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1/go.mod h1:o3FpDWpvjmTm4Tzzrgq1ZhtYrplVPSpdgav7+YzaLLs= github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= @@ -153,7 +154,6 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= From e0bd2dd466dfaef5230000a46de0c9c877f76f7c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 14:49:49 -0400 Subject: [PATCH 322/911] Crudely load local markdown files into the stash --- go.mod | 2 +- ui/stash.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index b1d4e72..2eefdc8 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.2.1 - github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1 // indirect + github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1 github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04 github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 diff --git a/ui/stash.go b/ui/stash.go index 70dded8..32023dc 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -2,7 +2,9 @@ package ui import ( "fmt" + "log" "math" + "os" "sort" "strings" "time" @@ -15,6 +17,7 @@ import ( "github.com/charmbracelet/charm/ui/common" "github.com/dustin/go-humanize" runewidth "github.com/mattn/go-runewidth" + "github.com/muesli/gitcha" te "github.com/muesli/termenv" ) @@ -32,6 +35,7 @@ type gotStashMsg []*charm.Markdown type gotNewsMsg []*charm.Markdown type fetchedMarkdownMsg *markdown type deletedStashedItemMsg int +type fileWalkFinishedMsg []string // MODEL @@ -42,6 +46,7 @@ type markdownType int const ( userMarkdown markdownType = iota newsMarkdown + localFile ) // markdown wraps charm.Markdown so we can differentiate between stashed items @@ -171,6 +176,7 @@ func stashInit(cc *charm.Client) (stashModel, tea.Cmd) { } return m, tea.Batch( + loadLocalFiles, loadStash(m), loadNews(m), spinner.Tick(s), @@ -187,6 +193,21 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { switch msg := msg.(type) { + // We've received a list of local markdowns + case fileWalkFinishedMsg: + if len(msg) > 0 { + now := time.Now() + for _, mdPath := range msg { + m.markdowns = append(m.markdowns, &markdown{ + markdownType: localFile, + Markdown: &charm.Markdown{ + Note: mdPath, + CreatedAt: &now, + }, + }) + } + } + // Stash results have come in from the server case gotStashMsg: m.loading = false @@ -518,6 +539,24 @@ func stashHelpView(m stashModel) string { // CMD +func loadLocalFiles() tea.Msg { + cwd, err := os.Getwd() + if err != nil { + return errMsg(err) + } + + // For now, wait to collect all the results before delivering them back + var agg []string + + ch := gitcha.FindFileFromList(cwd, []string{"*.md"}) + for v := range ch { + log.Println("found file", v) + agg = append(agg, v) + } + + return fileWalkFinishedMsg(agg) +} + func loadStash(m stashModel) tea.Cmd { return func() tea.Msg { stash, err := m.cc.GetStash(m.page) From 58abda8cf76334d8616384b7bb839cc50104b84e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 14:56:54 -0400 Subject: [PATCH 323/911] Sort stash by local files first, then date --- ui/stash.go | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 32023dc..86e1f07 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -56,13 +56,26 @@ type markdown struct { *charm.Markdown } -// Sort documents by date in descending order -type markdownsByCreatedAtDesc []*markdown +// Sort documents with local files first, then by date +type markdownsByLocalFirst []*markdown -// Sort implementation for MarkdownByCreatedAt -func (m markdownsByCreatedAtDesc) Len() int { return len(m) } -func (m markdownsByCreatedAtDesc) Swap(i, j int) { m[i], m[j] = m[j], m[i] } -func (m markdownsByCreatedAtDesc) Less(i, j int) bool { return m[i].CreatedAt.After(*m[j].CreatedAt) } +func (m markdownsByLocalFirst) Len() int { return len(m) } +func (m markdownsByLocalFirst) Swap(i, j int) { m[i], m[j] = m[j], m[i] } +func (m markdownsByLocalFirst) Less(i, j int) bool { + iType := m[i].markdownType + jType := m[j].markdownType + + // Local files come first + if iType == localFile && jType != localFile { + return true + } + if iType != localFile && jType == localFile { + return false + } + + // Both or neither are local files, so sort by date descending + return m[i].CreatedAt.After(*m[j].CreatedAt) +} type stashState int @@ -146,7 +159,7 @@ func (m stashModel) selectedMarkdown() *markdown { // addDocuments adds markdown documents to the model func (m *stashModel) addMarkdowns(mds ...*markdown) { m.markdowns = append(m.markdowns, mds...) - sort.Sort(markdownsByCreatedAtDesc(m.markdowns)) + sort.Sort(markdownsByLocalFirst(m.markdowns)) m.paginator.SetTotalPages(len(m.markdowns)) } From 17dcda28ea14ede37bfb3b79e5b2d20e764ae279 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 15:35:02 -0400 Subject: [PATCH 324/911] Strip cwd from local file paths --- ui/stash.go | 51 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 86e1f07..f8f13d5 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -2,7 +2,6 @@ package ui import ( "fmt" - "log" "math" "os" "sort" @@ -35,7 +34,7 @@ type gotStashMsg []*charm.Markdown type gotNewsMsg []*charm.Markdown type fetchedMarkdownMsg *markdown type deletedStashedItemMsg int -type fileWalkFinishedMsg []string +type fileWalkFinishedMsg []*markdown // MODEL @@ -209,15 +208,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // We've received a list of local markdowns case fileWalkFinishedMsg: if len(msg) > 0 { - now := time.Now() - for _, mdPath := range msg { - m.markdowns = append(m.markdowns, &markdown{ - markdownType: localFile, - Markdown: &charm.Markdown{ - Note: mdPath, - CreatedAt: &now, - }, - }) + for _, v := range msg { + if v != nil { + m.markdowns = append(m.markdowns, v) + } } } @@ -558,13 +552,15 @@ func loadLocalFiles() tea.Msg { return errMsg(err) } - // For now, wait to collect all the results before delivering them back - var agg []string + // TODO: show files as they come in. For now we're waiting until the entire + // file walk completes. + var agg []*markdown ch := gitcha.FindFileFromList(cwd, []string{"*.md"}) - for v := range ch { - log.Println("found file", v) - agg = append(agg, v) + for p := range ch { + // TODO: handle possible errors here, likely stat errors + md, _ := localFileToMarkdown(cwd, p) + agg = append(agg, md) } return fileWalkFinishedMsg(agg) @@ -635,6 +631,29 @@ func wrapMarkdowns(t markdownType, md []*charm.Markdown) (m []*markdown) { return m } +// Convert path to local file to Markdown. Note that we could be doing things +// like checking if the file is a directory, but we trust that gitcha has +// already done that. +func localFileToMarkdown(cwd, path string) (*markdown, error) { + md := &markdown{ + markdownType: localFile, + Markdown: &charm.Markdown{}, + } + + // Strip absolute path + md.Markdown.Note = strings.Replace(path, cwd+"/", "", -1) + + // Get last modified time + info, err := os.Stat(path) + if err != nil { + return nil, err + } + t := info.ModTime() + md.CreatedAt = &t + + return md, nil +} + func truncate(str string, num int) string { return runewidth.Truncate(str, num, "…") } From 2581f7625f55f273170fd147e907cb0fdc1bedda Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 16:05:21 -0400 Subject: [PATCH 325/911] Load local markdown files into the pager --- ui/stash.go | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index f8f13d5..c717fc9 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -1,7 +1,9 @@ package ui import ( + "errors" "fmt" + "io/ioutil" "math" "os" "sort" @@ -52,6 +54,7 @@ const ( // and news. type markdown struct { markdownType markdownType + localPath string // only relevent to local files *charm.Markdown } @@ -302,8 +305,14 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.state = stashStateLoadingDocument md := m.selectedMarkdown() + if md.markdownType == localFile { + cmd = loadLocalMarkdown(md) + } else { + cmd = loadRemoteMarkdown(m.cc, md.ID, md.markdownType) + } + cmds = append(cmds, - loadMarkdown(m.cc, md.ID, md.markdownType), + cmd, spinner.Tick(m.spinner), ) @@ -586,20 +595,23 @@ func loadNews(m stashModel) tea.Cmd { } } -func loadMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { +func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { return func() tea.Msg { var ( md *charm.Markdown err error ) + if t == userMarkdown { md, err = cc.GetStashMarkdown(id) } else { md, err = cc.GetNewsMarkdown(id) } + if err != nil { return errMsg(err) } + return fetchedMarkdownMsg(&markdown{ markdownType: t, Markdown: md, @@ -607,6 +619,24 @@ func loadMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { } } +func loadLocalMarkdown(md *markdown) tea.Cmd { + return func() tea.Msg { + if md.markdownType != localFile { + return errMsg(errors.New("could not load local file: not a local file")) + } + if md.localPath == "" { + return errMsg(errors.New("could not load file: missing path")) + } + + data, err := ioutil.ReadFile(md.localPath) + if err != nil { + return errMsg(err) + } + md.Body = string(data) + return fetchedMarkdownMsg(md) + } +} + func deleteStashedItem(cc *charm.Client, id int) tea.Cmd { return func() tea.Msg { err := cc.DeleteMarkdown(id) @@ -637,6 +667,7 @@ func wrapMarkdowns(t markdownType, md []*charm.Markdown) (m []*markdown) { func localFileToMarkdown(cwd, path string) (*markdown, error) { md := &markdown{ markdownType: localFile, + localPath: path, Markdown: &charm.Markdown{}, } From 3d1adeec52e41523c2a25b778eb3d23539444e35 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 16:09:51 -0400 Subject: [PATCH 326/911] Use the proper method for adding markdown docs to the stash --- ui/stash.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index c717fc9..ad66220 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -75,7 +75,7 @@ func (m markdownsByLocalFirst) Less(i, j int) bool { return false } - // Both or neither are local files, so sort by date descending + // Both or neither are local files so sort by date descending return m[i].CreatedAt.After(*m[j].CreatedAt) } @@ -211,11 +211,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // We've received a list of local markdowns case fileWalkFinishedMsg: if len(msg) > 0 { - for _, v := range msg { - if v != nil { - m.markdowns = append(m.markdowns, v) - } - } + m.addMarkdowns(msg...) } // Stash results have come in from the server From 7b6c3b374097f09c781e06bcd59c55bb592f400c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 16:16:26 -0400 Subject: [PATCH 327/911] Don't allow users to set notes on local files --- ui/pager.go | 4 ++-- ui/stash.go | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index d780660..8265fc2 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -183,8 +183,8 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { return m, nil } case "m": - // Users can't set the note on news markdown - if m.currentDocument.markdownType == newsMarkdown { + // Users can only set the note on user-stashed markdown + if m.currentDocument.markdownType != userMarkdown { break } diff --git a/ui/stash.go b/ui/stash.go index ad66220..46aabf2 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -524,9 +524,9 @@ func stashPopulatedView(m stashModel) string { func stashHelpView(m stashModel) string { var ( - h []string - md = m.selectedMarkdown() - isNews = md != nil && md.markdownType == newsMarkdown + h []string + md = m.selectedMarkdown() + isStashed = md != nil && md.markdownType == userMarkdown ) if m.state == stashStateSettingNote { @@ -541,7 +541,7 @@ func stashHelpView(m stashModel) string { if m.paginator.TotalPages > 1 { h = append(h, "h/l, ←/→: page") } - if !isNews && len(m.markdowns) > 0 { + if isStashed && len(m.markdowns) > 0 { h = append(h, []string{"x: delete", "m: set memo"}...) } h = append(h, []string{"esc: exit"}...) From 68d2d344b2b2a7c507b8b60602199947822a6f66 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 17:17:41 -0400 Subject: [PATCH 328/911] Insert files into the file listing as we find 'em --- ui/stash.go | 51 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 46aabf2..52e9d34 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -36,7 +36,12 @@ type gotStashMsg []*charm.Markdown type gotNewsMsg []*charm.Markdown type fetchedMarkdownMsg *markdown type deletedStashedItemMsg int -type fileWalkFinishedMsg []*markdown +type initLocalFileSearchMsg struct { + cwd string + ch chan string +} +type foundLocalFileMsg string +type localFileSearchFinished struct{} // MODEL @@ -111,6 +116,7 @@ type stashModel struct { loaded stashLoadedState // what's loaded? we find out with bitmasking loading bool // are we currently loading something? fullyLoaded bool // Have we loaded everything from the server? + cwd string // working directory where glow is running // This is just the index of the current page in view. To get the index // of the selected item as it relates to the full set of documents we've @@ -126,6 +132,10 @@ type stashModel struct { // than we can display at a time so we can paginate locally without having // to fetch every time. page int + + // github.com/muesli/gitcha channel that receives paths to local markdown + // files. + localFileFinder chan string } func (m *stashModel) setSize(width, height int) { @@ -208,11 +218,19 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { switch msg := msg.(type) { - // We've received a list of local markdowns - case fileWalkFinishedMsg: - if len(msg) > 0 { - m.addMarkdowns(msg...) + // We've started looking for local files + case initLocalFileSearchMsg: + m.localFileFinder = msg.ch + m.cwd = msg.cwd + cmds = append(cmds, findNextLocalFile(m)) + + // We found a local file + case foundLocalFileMsg: + pathStr, err := localFileToMarkdown(m.cwd, string(msg)) + if err == nil { + m.addMarkdowns(pathStr) } + cmds = append(cmds, findNextLocalFile(m)) // Stash results have come in from the server case gotStashMsg: @@ -557,18 +575,23 @@ func loadLocalFiles() tea.Msg { return errMsg(err) } - // TODO: show files as they come in. For now we're waiting until the entire - // file walk completes. - var agg []*markdown - ch := gitcha.FindFileFromList(cwd, []string{"*.md"}) - for p := range ch { - // TODO: handle possible errors here, likely stat errors - md, _ := localFileToMarkdown(cwd, p) - agg = append(agg, md) + return initLocalFileSearchMsg{ + ch: ch, + cwd: cwd, } +} - return fileWalkFinishedMsg(agg) +func findNextLocalFile(m stashModel) tea.Cmd { + return func() tea.Msg { + pathStr, ok := <-m.localFileFinder + if ok { + // Okay now find the next one + return foundLocalFileMsg(pathStr) + } + // We're done + return localFileSearchFinished{} + } } func loadStash(m stashModel) tea.Cmd { From ac872bf41f21335b8723ced5473c5c36c3027ed0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 17:32:50 -0400 Subject: [PATCH 329/911] Let's now refer to userMarkdown as stashedMarkdown --- ui/pager.go | 2 +- ui/stash.go | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 8265fc2..5df3243 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -184,7 +184,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { } case "m": // Users can only set the note on user-stashed markdown - if m.currentDocument.markdownType != userMarkdown { + if m.currentDocument.markdownType != stashedMarkdown { break } diff --git a/ui/stash.go b/ui/stash.go index 52e9d34..ee7d642 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -50,7 +50,7 @@ type localFileSearchFinished struct{} type markdownType int const ( - userMarkdown markdownType = iota + stashedMarkdown markdownType = iota newsMarkdown localFile ) @@ -240,7 +240,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // If the server comes back with nothing then we've got everything m.fullyLoaded = true } else { - docs := wrapMarkdowns(userMarkdown, msg) + docs := wrapMarkdowns(stashedMarkdown, msg) m.addMarkdowns(docs...) } @@ -333,7 +333,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Set note case "m": md := m.selectedMarkdown() - isUserMarkdown := md.markdownType == userMarkdown + isUserMarkdown := md.markdownType == stashedMarkdown isSettingNote := m.state == stashStateSettingNote isPromptingDelete := m.state == stashStatePromptDelete @@ -346,7 +346,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Prompt for deletion case "x": - isUserMarkdown := m.selectedMarkdown().markdownType == userMarkdown + isUserMarkdown := m.selectedMarkdown().markdownType == stashedMarkdown isValidState := m.state != stashStateSettingNote if isUserMarkdown && isValidState { @@ -544,7 +544,7 @@ func stashHelpView(m stashModel) string { var ( h []string md = m.selectedMarkdown() - isStashed = md != nil && md.markdownType == userMarkdown + isStashed = md != nil && md.markdownType == stashedMarkdown ) if m.state == stashStateSettingNote { @@ -621,7 +621,7 @@ func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { err error ) - if t == userMarkdown { + if t == stashedMarkdown { md, err = cc.GetStashMarkdown(id) } else { md, err = cc.GetNewsMarkdown(id) From dd8c6508306903fdb555c1f7dd9b4bdf57760dc5 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 18:05:36 -0400 Subject: [PATCH 330/911] Only show memo key in pager help for user stashed markdown --- ui/pager.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 5df3243..bb9caf8 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -27,7 +27,7 @@ const ( ) var ( - pagerHelpHeight = strings.Count(pagerHelpView(0), "\n") + pagerHelpHeight = strings.Count(pagerHelpView(pagerModel{}, 0), "\n") noteHeading = te.String(noteHeadingText). Foreground(common.Cream.Color()). @@ -247,7 +247,7 @@ func pagerView(m pagerModel) string { } if m.showHelp { - fmt.Fprintf(&b, pagerHelpView(m.width)) + fmt.Fprintf(&b, pagerHelpView(m, m.width)) } return b.String() @@ -294,10 +294,19 @@ func pagerSetNoteView(b *strings.Builder, m pagerModel) { fmt.Fprint(b, textinput.View(m.textInput)) } -func pagerHelpView(width int) (s string) { +func pagerHelpView(m pagerModel, width int) (s string) { + col1 := [2]string{ + "m set memo", + "esc/q back to stash", + } + if m.currentDocument != nil && m.currentDocument.markdownType != stashedMarkdown { + col1[0] = col1[1] + col1[1] = "" + } + s += "\n" - s += "k/↑ up m set memo\n" - s += "j/↓ down esc/q back to stash\n" + s += "k/↑ up " + col1[0] + "\n" + s += "j/↓ down " + col1[1] + "\n" s += "b/pgup page up\n" s += "f/pgdn page down\n" s += "u ½ page up\n" From e7cea6280ad97680ccd5f385ce10821b59bf42a3 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 18:44:24 -0400 Subject: [PATCH 331/911] Bump dependencies --- go.mod | 6 +++--- go.sum | 20 +++++++------------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index 2eefdc8..58be303 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,9 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6 - github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90 - github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2 + github.com/charmbracelet/bubbles v0.4.0 + github.com/charmbracelet/bubbletea v0.10.0 + github.com/charmbracelet/charm v0.5.2 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 diff --git a/go.sum b/go.sum index ba25aaa..6b9c088 100644 --- a/go.sum +++ b/go.sum @@ -15,14 +15,13 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6 h1:7RC108JxvxaQL3rAV32OnVvmyqvCSpdJONflwEbCk7k= -github.com/charmbracelet/bubbles v0.3.1-0.20200623171050-f341e3c896d6/go.mod h1:3v6yfT4kd1oOivS8uOXyWvDo1DaXO3R88mlijgPDo7w= -github.com/charmbracelet/bubbletea v0.8.3-0.20200622174044-8bab4bce9a84/go.mod h1:jRlRe1bNetdeBUvRF8G1coY18WB0Gy5EJyT8JJ532pg= -github.com/charmbracelet/bubbletea v0.9.1-0.20200623160123-de147c5061d9/go.mod h1:HCCbXDXh2SLdnKzU816tszXziiJt6qW32IG2E4t560M= -github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90 h1:nt4h8pwRZgoIRSgGaPGAgkoiZui1MYeDhRFPwSiEI4g= +github.com/charmbracelet/bubbles v0.4.0 h1:6VqieEcz5e03/nyM+psVw61xCwWu88JFVZ4331jFCfc= +github.com/charmbracelet/bubbles v0.4.0/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2 h1:2hTjqbJgadO+SJZltrCdQ1LunnQ1COabfaTuCx7v15Y= -github.com/charmbracelet/charm v0.5.2-0.20200623181447-9007a7f4b1d2/go.mod h1:aJpJ0hrvN95n8u96tCevUsK+XNxr2BJp1eR5LhV0BHg= +github.com/charmbracelet/bubbletea v0.10.0 h1:rzbxI+eWoVuQ3Z7wOlefmxGtcxYr46Lu0fqIKYCZg7s= +github.com/charmbracelet/bubbletea v0.10.0/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= +github.com/charmbracelet/charm v0.5.2 h1:cgqc1LJuPwVTzZFD3CczgyxUC0oAkHSqnkUxIHUb+yc= +github.com/charmbracelet/charm v0.5.2/go.mod h1:tpIHCBAc6qk1zl/uSuYMKDmKtEro7XJxe38P0tFyR54= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06/go.mod h1:ECr5vYu2tKCePqAbZNUh94HiZDPMtbc9ggAy4n585JU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -92,12 +91,11 @@ github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/le github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1 h1:UhmEuW8xAMA+CdXQgYQ9Iilnhyf+uNYWCJSotCldI7o= github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1/go.mod h1:o3FpDWpvjmTm4Tzzrgq1ZhtYrplVPSpdgav7+YzaLLs= github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= -github.com/muesli/termenv v0.5.3-0.20200617122104-66d435cfe924/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= -github.com/muesli/termenv v0.5.3-0.20200617154346-da5de72b61c0/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04 h1:Wr876oXlAk6avTWi0daXAriOr+r5fqIuyDmtNc/KwY0= github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -152,9 +150,7 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -181,8 +177,6 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200620081246-981b61492c35/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From ee058c48163e509e99df11a3b45db9a80a3a3140 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 18:54:32 -0400 Subject: [PATCH 332/911] Update spinners for Bubbles 0.4.0 --- ui/stash.go | 2 +- ui/ui.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index ee7d642..0625343 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -179,7 +179,7 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) { func stashInit(cc *charm.Client) (stashModel, tea.Cmd) { s := spinner.NewModel() - s.Type = spinner.Dot + s.Frames = spinner.Dot s.ForegroundColor = common.SpinnerColor p := paginator.NewModel() diff --git a/ui/ui.go b/ui/ui.go index 0dcbadb..feeb489 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -97,7 +97,7 @@ func (m *model) unloadDocument() { func initialize(style string) func() (tea.Model, tea.Cmd) { return func() (tea.Model, tea.Cmd) { s := spinner.NewModel() - s.Type = spinner.Dot + s.Frames = spinner.Dot s.ForegroundColor = common.SpinnerColor if style == "auto" { From cb8f7fcd1965e2f004ec151b34f1e500b089b3c0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 19:18:38 -0400 Subject: [PATCH 333/911] Take note internally when the local file search is finished --- ui/stash.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ui/stash.go b/ui/stash.go index 0625343..51fdf93 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -103,6 +103,7 @@ func (s stashLoadedState) done() bool { const ( loadedStash stashLoadedState = 1 << iota loadedNews + loadedLocalFiles ) type stashModel struct { @@ -232,6 +233,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } cmds = append(cmds, findNextLocalFile(m)) + // We're finished searching for local files + case localFileSearchFinished: + m.loaded |= loadedLocalFiles + // Stash results have come in from the server case gotStashMsg: m.loading = false @@ -249,6 +254,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.state = stashStateReady } + // News has come in from the server case gotNewsMsg: if len(msg) > 0 { docs := wrapMarkdowns(newsMarkdown, msg) From 87d2a9a143fcd2ccd3509868c021b20d4862c77b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 19:49:16 -0400 Subject: [PATCH 334/911] Update header depending on what's stashed --- ui/stash.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 51fdf93..8ee444c 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -118,6 +118,9 @@ type stashModel struct { loading bool // are we currently loading something? fullyLoaded bool // Have we loaded everything from the server? cwd string // working directory where glow is running + hasStash bool // do we have stashed files to show? + hasLocalFiles bool // do we have local files to show? + hasNews bool // do we have news to show? // This is just the index of the current page in view. To get the index // of the selected item as it relates to the full set of documents we've @@ -229,6 +232,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case foundLocalFileMsg: pathStr, err := localFileToMarkdown(m.cwd, string(msg)) if err == nil { + m.hasLocalFiles = true m.addMarkdowns(pathStr) } cmds = append(cmds, findNextLocalFile(m)) @@ -247,6 +251,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } else { docs := wrapMarkdowns(stashedMarkdown, msg) m.addMarkdowns(docs...) + m.hasStash = true } m.loaded |= loadedStash @@ -259,6 +264,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { if len(msg) > 0 { docs := wrapMarkdowns(newsMarkdown, msg) m.addMarkdowns(docs...) + m.hasNews = true } m.loaded |= loadedNews @@ -466,9 +472,17 @@ func stashView(m stashModel) string { } var header string - if len(m.markdowns) > 0 { + if m.hasStash && m.hasLocalFiles { + header = "Here are your local and stashed markdown files:" + } else if m.hasStash { header = "Here’s your markdown stash:" + } else if m.hasLocalFiles { + header = "Here are your local markdown files:" + } else if m.hasNews { + // TODO: proper help + header = "Here are some Glow updates:" } else { + // TODO: proper help header = "Nothing stashed yet. To stash you can " + common.Code("glow stash path/to/file.md") + "." } From dbb32354a352ee222cf2c71243bc7cbceb45da46 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 14 Jul 2020 20:25:51 -0400 Subject: [PATCH 335/911] Flag stashed items with a little dot --- ui/stashitem.go | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/ui/stashitem.go b/ui/stashitem.go index 35e8b3f..0cdcc61 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -6,6 +6,7 @@ import ( "github.com/charmbracelet/bubbles/textinput" "github.com/charmbracelet/charm/ui/common" + rw "github.com/mattn/go-runewidth" te "github.com/muesli/termenv" ) @@ -13,6 +14,7 @@ const ( newsPrefix = "News: " verticalLine = "│" noMemoTitle = "No Memo" + stashIcon = "• " ) var ( @@ -30,17 +32,23 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { gutter := " " title := md.Note date := relativeTime(*md.CreatedAt) + icon := "" - if md.markdownType == newsMarkdown { + switch md.markdownType { + case newsMarkdown: if title == "" { title = "News" } else { - title = newsPrefix + truncate(title, truncateTo-len(newsPrefix)) + title = newsPrefix + truncate(title, truncateTo-rw.StringWidth(newsPrefix)) } - } else { + case stashedMarkdown: + icon = stashIcon + icon = stashIcon if title == "" { title = noMemoTitle } + title = truncate(title, truncateTo-rw.StringWidth(icon)) + default: title = truncate(title, truncateTo) } @@ -49,16 +57,19 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { case stashStatePromptDelete: // Deleting gutter = te.String(verticalLine).Foreground(common.FaintRed.Color()).String() + icon = te.String(icon).Foreground(common.FaintRed.Color()).String() title = te.String(title).Foreground(common.Red.Color()).String() date = te.String(date).Foreground(common.FaintRed.Color()).String() case stashStateSettingNote: // Setting note gutter = te.String(verticalLine).Foreground(dullYellow.Color()).String() + icon = "" title = textinput.View(m.noteInput) date = te.String(date).Foreground(dullYellow.Color()).String() default: // Selected gutter = te.String(verticalLine).Foreground(dullFuchsia.Color()).String() + icon = te.String(icon).Foreground(dullFuchsia.Color()).String() title = te.String(title).Foreground(common.Fuschia.Color()).String() date = te.String(date).Foreground(dullFuchsia.Color()).String() } @@ -69,6 +80,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { title = te.String(title).Foreground(common.Indigo.Color()).String() date = te.String(date).Foreground(subtleIndigo.Color()).String() } else { + icon = te.String(icon).Foreground(green.Color()).String() if title == noMemoTitle { title = te.String(title).Foreground(warmGray.Color()).String() } @@ -77,6 +89,6 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { } } - fmt.Fprintf(b, "%s %s\n", gutter, title) + fmt.Fprintf(b, "%s %s%s\n", gutter, icon, title) fmt.Fprintf(b, "%s %s", gutter, date) } From 930f15fbee94fa7fd62914f190b2522e670fd2a4 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 15 Jul 2020 11:28:05 -0400 Subject: [PATCH 336/911] Bump termenv to get ANSI-aware rune width support --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 58be303..04cf4fb 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.2.1 github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1 - github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04 + github.com/muesli/termenv v0.5.3-0.20200715143749-3facc679bc62 github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect diff --git a/go.sum b/go.sum index 6b9c088..56d847a 100644 --- a/go.sum +++ b/go.sum @@ -98,6 +98,8 @@ github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04 h1:Wr876oXlAk6avTWi0daXAriOr+r5fqIuyDmtNc/KwY0= github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= +github.com/muesli/termenv v0.5.3-0.20200715143749-3facc679bc62 h1:W1+qXP5nmjE+c6IG2xQGs1tUit2NZXAKqBiYM4zf/vg= +github.com/muesli/termenv v0.5.3-0.20200715143749-3facc679bc62/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= From f52311af88634c620e49232678fc419e07fff234 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 15 Jul 2020 12:07:15 -0400 Subject: [PATCH 337/911] Rework/cleanup styling in stash/file listing --- ui/stash.go | 5 ++--- ui/stashitem.go | 45 +++++++++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 8ee444c..849f52c 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -488,10 +488,9 @@ func stashView(m stashModel) string { switch m.state { case stashStatePromptDelete: - header = te.String("Delete this item? ").Foreground(common.Red.Color()).String() + - te.String("(y/N)").Foreground(common.FaintRed.Color()).String() + header = redFg("Delete this item? ") + faintRedFg("(y/N)") case stashStateSettingNote: - header = te.String("Set the memo for this item?").Foreground(common.YellowGreen.Color()).String() + header = yellowFg("Set the memo for this item?") } var pagination string diff --git a/ui/stashitem.go b/ui/stashitem.go index 0cdcc61..7e170f7 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -18,12 +18,17 @@ const ( ) var ( - faintGreen = common.NewColorPair("#2B4A3F", "#ABE5D1") - green = common.NewColorPair("#04B575", "#04B575") - dullFuchsia = common.NewColorPair("#AD58B4", "#F793FF") - dullYellow = common.NewColorPair("#9BA92F", "#6BCB94") // renders light green on light backgrounds - warmGray = common.NewColorPair("#979797", "#847A85") - subtleIndigo = common.NewColorPair("#514DC1", "#7D79F6") + greenFg = te.Style{}.Foreground(common.NewColorPair("#04B575", "#04B575").Color()).Styled + faintGreenFg = te.Style{}.Foreground(common.NewColorPair("#2B4A3F", "#ABE5D1").Color()).Styled + fuchsiaFg = te.Style{}.Foreground(common.Fuschia.Color()).Styled + dullFuchsiaFg = te.Style{}.Foreground(common.NewColorPair("#AD58B4", "#F793FF").Color()).Styled + yellowFg = te.Style{}.Foreground(common.YellowGreen.Color()).Styled // renders light green on light backgrounds + dullYellowFg = te.Style{}.Foreground(common.NewColorPair("#9BA92F", "#6BCB94").Color()).Styled // renders light green on light backgrounds + indigoFg = te.Style{}.Foreground(common.Indigo.Color()).Styled + subtleIndigoFg = te.Style{}.Foreground(common.NewColorPair("#514DC1", "#7D79F6").Color()).Styled + redFg = te.Style{}.Foreground(common.Red.Color()).Styled + faintRedFg = te.Style{}.Foreground(common.FaintRed.Color()).Styled + warmGrayFg = te.Style{}.Foreground(common.NewColorPair("#979797", "#847A85").Color()).Styled ) func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { @@ -56,36 +61,36 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { switch m.state { case stashStatePromptDelete: // Deleting - gutter = te.String(verticalLine).Foreground(common.FaintRed.Color()).String() - icon = te.String(icon).Foreground(common.FaintRed.Color()).String() - title = te.String(title).Foreground(common.Red.Color()).String() - date = te.String(date).Foreground(common.FaintRed.Color()).String() + gutter = faintRedFg(verticalLine) + icon = faintRedFg(icon) + title = redFg(title) + date = faintRedFg(date) case stashStateSettingNote: // Setting note - gutter = te.String(verticalLine).Foreground(dullYellow.Color()).String() + gutter = dullYellowFg(verticalLine) icon = "" title = textinput.View(m.noteInput) - date = te.String(date).Foreground(dullYellow.Color()).String() + date = dullYellowFg(date) default: // Selected - gutter = te.String(verticalLine).Foreground(dullFuchsia.Color()).String() - icon = te.String(icon).Foreground(dullFuchsia.Color()).String() - title = te.String(title).Foreground(common.Fuschia.Color()).String() - date = te.String(date).Foreground(dullFuchsia.Color()).String() + gutter = dullFuchsiaFg(verticalLine) + icon = dullFuchsiaFg(icon) + title = fuchsiaFg(title) + date = dullFuchsiaFg(date) } } else { // Normal if md.markdownType == newsMarkdown { gutter = " " title = te.String(title).Foreground(common.Indigo.Color()).String() - date = te.String(date).Foreground(subtleIndigo.Color()).String() + date = subtleIndigoFg(date) } else { - icon = te.String(icon).Foreground(green.Color()).String() + icon = greenFg(icon) if title == noMemoTitle { - title = te.String(title).Foreground(warmGray.Color()).String() + title = warmGrayFg(title) } gutter = " " - date = te.String(date).Foreground(warmGray.Color()).String() + date = warmGrayFg(date) } } From 1200b8672989fd93bd4aff9cbd9a0212dbe7f729 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 15 Jul 2020 12:56:57 -0400 Subject: [PATCH 338/911] Cleanup pager status bar view thanks to the latest updates in reflow --- go.mod | 1 + go.sum | 4 ++-- ui/pager.go | 20 ++++++++++++++------ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 04cf4fb..2360c5d 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.2.1 github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1 + github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d github.com/muesli/termenv v0.5.3-0.20200715143749-3facc679bc62 github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 diff --git a/go.sum b/go.sum index 56d847a..600d915 100644 --- a/go.sum +++ b/go.sum @@ -93,10 +93,10 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1 h1:UhmEuW8xAMA+CdXQgYQ9Iilnhyf+uNYWCJSotCldI7o= github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1/go.mod h1:o3FpDWpvjmTm4Tzzrgq1ZhtYrplVPSpdgav7+YzaLLs= -github.com/muesli/reflow v0.1.0 h1:oQdpLfO56lr5pgLvqD0TcjW85rDjSYSBVdiG1Ch1ddM= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= +github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d h1:ok5jhmKQze1yERN73u46EZhUH4vgC1z4qfeFJ8iOwvg= +github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= -github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04 h1:Wr876oXlAk6avTWi0daXAriOr+r5fqIuyDmtNc/KwY0= github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200715143749-3facc679bc62 h1:W1+qXP5nmjE+c6IG2xQGs1tUit2NZXAKqBiYM4zf/vg= github.com/muesli/termenv v0.5.3-0.20200715143749-3facc679bc62/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= diff --git a/ui/pager.go b/ui/pager.go index bb9caf8..9399cc4 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -13,6 +13,7 @@ import ( "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glamour" runewidth "github.com/mattn/go-runewidth" + "github.com/muesli/reflow/ansi" te "github.com/muesli/termenv" ) @@ -255,16 +256,14 @@ func pagerView(m pagerModel) string { func pagerStatusBarView(b *strings.Builder, m pagerModel) { // Logo - logoText := " Glow " - logo := glowLogoView(logoText) + logo := glowLogoView(" Glow ") // Scroll percent scrollPercent := math.Max(0.0, math.Min(1.0, m.viewport.ScrollPercent())) percentText := fmt.Sprintf(" %3.f%% ", scrollPercent*100) // "Help" note - helpNoteText := " ? Help " - helpNote := statusBarHelpStyle(helpNoteText) + helpNote := statusBarHelpStyle(" ? Help ") // Note noteText := m.currentDocument.Note @@ -272,12 +271,21 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { noteText = "(No title)" } noteText = truncate(" "+noteText+" ", max(0, - m.width-len(logoText)-len(percentText)-len(helpNoteText), + m.width- + ansi.PrintableRuneWidth(logo)- + ansi.PrintableRuneWidth(percentText)- + ansi.PrintableRuneWidth(helpNote), )) // Empty space emptyCell := te.String(" ").Background(statusBarBg.Color()).String() - padding := max(0, m.width-len(logoText)-runewidth.StringWidth(noteText)-len(percentText)-len(helpNoteText)) + padding := max(0, + m.width- + ansi.PrintableRuneWidth(logo)- + ansi.PrintableRuneWidth(noteText)- + ansi.PrintableRuneWidth(percentText)- + ansi.PrintableRuneWidth(helpNote), + ) emptySpace := strings.Repeat(emptyCell, padding) fmt.Fprintf(b, "%s%s%s%s%s", From d4f192487c02d40759ec7c0b0a53aad447da7244 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 15 Jul 2020 14:18:46 -0400 Subject: [PATCH 339/911] Start looking for local files the moment Glow starts --- ui/stash.go | 82 ++------------------------------------------------ ui/ui.go | 86 +++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 83 insertions(+), 85 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 849f52c..a93f00e 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -18,7 +18,6 @@ import ( "github.com/charmbracelet/charm/ui/common" "github.com/dustin/go-humanize" runewidth "github.com/mattn/go-runewidth" - "github.com/muesli/gitcha" te "github.com/muesli/termenv" ) @@ -36,12 +35,6 @@ type gotStashMsg []*charm.Markdown type gotNewsMsg []*charm.Markdown type fetchedMarkdownMsg *markdown type deletedStashedItemMsg int -type initLocalFileSearchMsg struct { - cwd string - ch chan string -} -type foundLocalFileMsg string -type localFileSearchFinished struct{} // MODEL @@ -117,7 +110,6 @@ type stashModel struct { loaded stashLoadedState // what's loaded? we find out with bitmasking loading bool // are we currently loading something? fullyLoaded bool // Have we loaded everything from the server? - cwd string // working directory where glow is running hasStash bool // do we have stashed files to show? hasLocalFiles bool // do we have local files to show? hasNews bool // do we have news to show? @@ -136,10 +128,6 @@ type stashModel struct { // than we can display at a time so we can paginate locally without having // to fetch every time. page int - - // github.com/muesli/gitcha channel that receives paths to local markdown - // files. - localFileFinder chan string } func (m *stashModel) setSize(width, height int) { @@ -181,7 +169,7 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) { // INIT -func stashInit(cc *charm.Client) (stashModel, tea.Cmd) { +func newStashModel() stashModel { s := spinner.NewModel() s.Frames = spinner.Dot s.ForegroundColor = common.SpinnerColor @@ -197,19 +185,13 @@ func stashInit(cc *charm.Client) (stashModel, tea.Cmd) { ni.Focus() m := stashModel{ - cc: cc, spinner: s, noteInput: ni, page: 1, paginator: p, } - return m, tea.Batch( - loadLocalFiles, - loadStash(m), - loadNews(m), - spinner.Tick(s), - ) + return m } // UPDATE @@ -222,21 +204,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { switch msg := msg.(type) { - // We've started looking for local files - case initLocalFileSearchMsg: - m.localFileFinder = msg.ch - m.cwd = msg.cwd - cmds = append(cmds, findNextLocalFile(m)) - - // We found a local file - case foundLocalFileMsg: - pathStr, err := localFileToMarkdown(m.cwd, string(msg)) - if err == nil { - m.hasLocalFiles = true - m.addMarkdowns(pathStr) - } - cmds = append(cmds, findNextLocalFile(m)) - // We're finished searching for local files case localFileSearchFinished: m.loaded |= loadedLocalFiles @@ -588,51 +555,6 @@ func stashHelpView(m stashModel) string { // CMD -func loadLocalFiles() tea.Msg { - cwd, err := os.Getwd() - if err != nil { - return errMsg(err) - } - - ch := gitcha.FindFileFromList(cwd, []string{"*.md"}) - return initLocalFileSearchMsg{ - ch: ch, - cwd: cwd, - } -} - -func findNextLocalFile(m stashModel) tea.Cmd { - return func() tea.Msg { - pathStr, ok := <-m.localFileFinder - if ok { - // Okay now find the next one - return foundLocalFileMsg(pathStr) - } - // We're done - return localFileSearchFinished{} - } -} - -func loadStash(m stashModel) tea.Cmd { - return func() tea.Msg { - stash, err := m.cc.GetStash(m.page) - if err != nil { - return errMsg(err) - } - return gotStashMsg(stash) - } -} - -func loadNews(m stashModel) tea.Cmd { - return func() tea.Msg { - news, err := m.cc.GetNews(1) // just fetch the first page - if err != nil { - return errMsg(err) - } - return gotNewsMsg(news) - } -} - func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { return func() tea.Msg { var ( diff --git a/ui/ui.go b/ui/ui.go index feeb489..34643d5 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "log" + "os" "strings" "github.com/charmbracelet/bubbles/spinner" @@ -11,6 +12,7 @@ import ( "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/charm/ui/keygen" + "github.com/muesli/gitcha" te "github.com/muesli/termenv" ) @@ -47,6 +49,12 @@ func NewProgram(style string, cfg UIConfig) *tea.Program { type errMsg error type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} +type initLocalFileSearchMsg struct { + cwd string + ch chan string +} +type foundLocalFileMsg string +type localFileSearchFinished struct{} // MODEL @@ -83,6 +91,11 @@ type model struct { pager pagerModel terminalWidth int terminalHeight int + cwd string // directory from which we're running Glow + + // Channel that receives paths to local markdown files + // (via the github.com/muesli/gitcha package) + localFileFinder chan string } func (m *model) unloadDocument() { @@ -111,9 +124,11 @@ func initialize(style string) func() (tea.Model, tea.Cmd) { return model{ spinner: s, + stash: newStashModel(), pager: newPagerModel(style), state: stateInitCharmClient, }, tea.Batch( + findLocalFiles, newCharmClient, spinner.Tick(s), ) @@ -194,6 +209,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { m.err = msg return m, nil + // Window size is received when starting up and on every resize case tea.WindowSizeMsg: m.terminalWidth = msg.Width m.terminalHeight = msg.Height @@ -203,6 +219,21 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // TODO: load more stash pages if we've resized, are on the last page, // and haven't loaded more pages yet. + // We've started looking for local files + case initLocalFileSearchMsg: + m.localFileFinder = msg.ch + m.cwd = msg.cwd + cmds = append(cmds, findNextLocalFile(m)) + + // We found a local file + case foundLocalFileMsg: + pathStr, err := localFileToMarkdown(m.cwd, string(msg)) + if err == nil { + m.stash.hasLocalFiles = true + m.stash.addMarkdowns(pathStr) + } + cmds = append(cmds, findNextLocalFile(m)) + case sshAuthErrMsg: // If we haven't run the keygen yet, do that if m.state != stateKeygenFinished { @@ -223,6 +254,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { cmds = append(cmds, cmd) case keygen.DoneMsg: + // The keygen's done, so let's try initializing the charm client again m.state = stateKeygenFinished cmds = append(cmds, newCharmClient) @@ -236,10 +268,9 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case newCharmClientMsg: m.cc = msg m.state = stateShowStash - m.stash, cmd = stashInit(msg) - m.stash.setSize(m.terminalWidth, m.terminalHeight) + m.stash.cc = msg m.pager.cc = msg - cmds = append(cmds, cmd) + cmds = append(cmds, loadStash(m.stash), loadNews(m.stash)) case fetchedMarkdownMsg: m.pager.currentDocument = msg @@ -321,6 +352,31 @@ func errorView(err error) string { // COMMANDS +func findLocalFiles() tea.Msg { + cwd, err := os.Getwd() + if err != nil { + return errMsg(err) + } + + ch := gitcha.FindFileFromList(cwd, []string{"*.md"}) + return initLocalFileSearchMsg{ + ch: ch, + cwd: cwd, + } +} + +func findNextLocalFile(m model) tea.Cmd { + return func() tea.Msg { + pathStr, ok := <-m.localFileFinder + if ok { + // Okay now find the next one + return foundLocalFileMsg(pathStr) + } + // We're done + return localFileSearchFinished{} + } +} + func newCharmClient() tea.Msg { cfg, err := charm.ConfigFromEnv() if err != nil { @@ -337,6 +393,28 @@ func newCharmClient() tea.Msg { return newCharmClientMsg(cc) } +func loadStash(m stashModel) tea.Cmd { + return func() tea.Msg { + stash, err := m.cc.GetStash(m.page) + if err != nil { + return errMsg(err) + } + return gotStashMsg(stash) + } +} + +func loadNews(m stashModel) tea.Cmd { + return func() tea.Msg { + news, err := m.cc.GetNews(1) // just fetch the first page + if err != nil { + return errMsg(err) + } + return gotNewsMsg(news) + } +} + +// ETC + func indent(s string, n int) string { if n <= 0 || s == "" { return s @@ -350,8 +428,6 @@ func indent(s string, n int) string { return b.String() } -// ETC - func min(a, b int) int { if a < b { return a From 1bf2298536365aa6611b12cf0ce2ede6b9cd7e20 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 15 Jul 2020 15:51:51 -0400 Subject: [PATCH 340/911] Start Glow in the file loader while file and stash listing load --- ui/stash.go | 93 ++++++++------------------------------ ui/ui.go | 127 +++++++++++++++++++++++++++++++++------------------- 2 files changed, 101 insertions(+), 119 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index a93f00e..35c89c3 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -5,7 +5,6 @@ import ( "fmt" "io/ioutil" "math" - "os" "sort" "strings" "time" @@ -31,8 +30,6 @@ const ( // MSG -type gotStashMsg []*charm.Markdown -type gotNewsMsg []*charm.Markdown type fetchedMarkdownMsg *markdown type deletedStashedItemMsg int @@ -80,25 +77,12 @@ func (m markdownsByLocalFirst) Less(i, j int) bool { type stashState int const ( - stashStateInit stashState = iota - stashStateReady + stashStateReady stashState = iota stashStatePromptDelete stashStateLoadingDocument stashStateSettingNote ) -type stashLoadedState byte - -func (s stashLoadedState) done() bool { - return s&loadedStash != 0 && s&loadedNews != 0 -} - -const ( - loadedStash stashLoadedState = 1 << iota - loadedNews - loadedLocalFiles -) - type stashModel struct { cc *charm.Client state stashState @@ -107,12 +91,11 @@ type stashModel struct { noteInput textinput.Model terminalWidth int terminalHeight int - loaded stashLoadedState // what's loaded? we find out with bitmasking - loading bool // are we currently loading something? - fullyLoaded bool // Have we loaded everything from the server? - hasStash bool // do we have stashed files to show? - hasLocalFiles bool // do we have local files to show? - hasNews bool // do we have news to show? + loading bool // are we currently loading something? + fullyLoaded bool // Have we loaded everything from the server? + hasStash bool // do we have stashed files to show? + hasLocalFiles bool // do we have local files to show? + hasNews bool // do we have news to show? // This is just the index of the current page in view. To get the index // of the selected item as it relates to the full set of documents we've @@ -154,10 +137,11 @@ func (m stashModel) markdownIndex() int { // return the current selected markdown in the stash func (m stashModel) selectedMarkdown() *markdown { - if len(m.markdowns) == 0 || len(m.markdowns) <= m.markdownIndex() { + i := m.markdownIndex() + if i < 0 || len(m.markdowns) == 0 || len(m.markdowns) <= i { return nil } - return m.markdowns[m.markdownIndex()] + return m.markdowns[i] } // addDocuments adds markdown documents to the model @@ -189,6 +173,7 @@ func newStashModel() stashModel { noteInput: ni, page: 1, paginator: p, + loading: true, } return m @@ -204,10 +189,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { switch msg := msg.(type) { - // We're finished searching for local files - case localFileSearchFinished: - m.loaded |= loadedLocalFiles - // Stash results have come in from the server case gotStashMsg: m.loading = false @@ -221,11 +202,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.hasStash = true } - m.loaded |= loadedStash - if m.loaded.done() { - m.state = stashStateReady - } - // News has come in from the server case gotNewsMsg: if len(msg) > 0 { @@ -234,18 +210,13 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.hasNews = true } - m.loaded |= loadedNews - if m.loaded.done() { - m.state = stashStateReady - } - case spinner.TickMsg: - if m.state == stashStateInit || m.state == stashStateLoadingDocument { + if m.state == stashStateLoadingDocument { m.spinner, cmd = spinner.Update(msg, m.spinner) cmds = append(cmds, cmd) } - // A note was set on a document. This may have happened in the pager, so + // A note was set on a document. This may have happened in the pager so // we'll find the corresponding document here and update accordingly. case noteSavedMsg: for i := range m.markdowns { @@ -420,15 +391,9 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { func stashView(m stashModel) string { var s string switch m.state { - case stashStateInit: - s += " " + spinner.View(m.spinner) + " Loading stash..." case stashStateLoadingDocument: s += " " + spinner.View(m.spinner) + " Loading document..." - case stashStateReady: - fallthrough - case stashStateSettingNote: - fallthrough - case stashStatePromptDelete: + case stashStateReady, stashStateSettingNote, stashStatePromptDelete: // We need to fill any empty height with newlines so the footer reaches // the bottom. @@ -529,10 +494,14 @@ func stashPopulatedView(m stashModel) string { func stashHelpView(m stashModel) string { var ( h []string - md = m.selectedMarkdown() - isStashed = md != nil && md.markdownType == stashedMarkdown + isStashed bool ) + if len(m.markdowns) > 0 { + md := m.selectedMarkdown() + isStashed = md != nil && md.markdownType == stashedMarkdown + } + if m.state == stashStateSettingNote { h = append(h, "enter: confirm", "esc: cancel") } else if m.state == stashStatePromptDelete { @@ -621,30 +590,6 @@ func wrapMarkdowns(t markdownType, md []*charm.Markdown) (m []*markdown) { return m } -// Convert path to local file to Markdown. Note that we could be doing things -// like checking if the file is a directory, but we trust that gitcha has -// already done that. -func localFileToMarkdown(cwd, path string) (*markdown, error) { - md := &markdown{ - markdownType: localFile, - localPath: path, - Markdown: &charm.Markdown{}, - } - - // Strip absolute path - md.Markdown.Note = strings.Replace(path, cwd+"/", "", -1) - - // Get last modified time - info, err := os.Stat(path) - if err != nil { - return nil, err - } - t := info.ModTime() - md.CreatedAt = &t - - return md, nil -} - func truncate(str string, num int) string { return runewidth.Truncate(str, num, "…") } diff --git a/ui/ui.go b/ui/ui.go index 34643d5..7d7652c 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -7,7 +7,6 @@ import ( "os" "strings" - "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" @@ -55,19 +54,40 @@ type initLocalFileSearchMsg struct { } type foundLocalFileMsg string type localFileSearchFinished struct{} +type gotStashMsg []*charm.Markdown +type gotNewsMsg []*charm.Markdown // MODEL +type loadedState byte + +const ( + loadedStash loadedState = 1 << iota + loadedNews + loadedLocalFiles +) + +func (s loadedState) done() bool { + return s&loadedStash != 0 && + s&loadedNews != 0 && + s&loadedLocalFiles != 0 +} + type state int const ( - stateInitCharmClient state = iota - stateKeygenRunning - stateKeygenFinished - stateShowStash + stateShowStash state = iota stateShowDocument ) +type keygenState int + +const ( + keygenUnstarted keygenState = iota + keygenRunning + keygenFinished +) + // String translates the staus to a human-readable string. This is just for // debugging. func (s state) String() string { @@ -83,15 +103,16 @@ func (s state) String() string { type model struct { cc *charm.Client user *charm.User - spinner spinner.Model keygen keygen.Model + keygenState keygenState state state err error stash stashModel pager pagerModel terminalWidth int terminalHeight int - cwd string // directory from which we're running Glow + cwd string // directory from which we're running Glow + loaded loadedState // what's loaded? we find out with bitmasking // Channel that receives paths to local markdown files // (via the github.com/muesli/gitcha package) @@ -109,10 +130,6 @@ func (m *model) unloadDocument() { func initialize(style string) func() (tea.Model, tea.Cmd) { return func() (tea.Model, tea.Cmd) { - s := spinner.NewModel() - s.Frames = spinner.Dot - s.ForegroundColor = common.SpinnerColor - if style == "auto" { dbg := te.HasDarkBackground() if dbg == true { @@ -123,14 +140,13 @@ func initialize(style string) func() (tea.Model, tea.Cmd) { } return model{ - spinner: s, - stash: newStashModel(), - pager: newPagerModel(style), - state: stateInitCharmClient, + stash: newStashModel(), + pager: newPagerModel(style), + state: stateShowStash, + keygenState: keygenUnstarted, }, tea.Batch( findLocalFiles, newCharmClient, - spinner.Tick(s), ) } } @@ -234,10 +250,14 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { } cmds = append(cmds, findNextLocalFile(m)) + // We're finished searching for local files + case localFileSearchFinished: + m.loaded |= loadedLocalFiles + case sshAuthErrMsg: // If we haven't run the keygen yet, do that - if m.state != stateKeygenFinished { - m.state = stateKeygenRunning + if m.keygenState != keygenFinished { + m.keygenState = keygenRunning m.keygen = keygen.NewModel() cmds = append(cmds, keygen.GenerateKeys) } else { @@ -246,25 +266,11 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { return m, tea.Quit } - case spinner.TickMsg: - switch m.state { - case stateInitCharmClient: - m.spinner, cmd = spinner.Update(msg, m.spinner) - } - cmds = append(cmds, cmd) - case keygen.DoneMsg: // The keygen's done, so let's try initializing the charm client again - m.state = stateKeygenFinished + m.keygenState = keygenFinished cmds = append(cmds, newCharmClient) - case noteSavedMsg: - // A note was saved to a document. This will have be done in the - // pager, so we'll need to find the corresponding note in the stash. - // So, pass the message to the stash for processing. - m.stash, cmd = stashUpdate(msg, m.stash) - cmds = append(cmds, cmd) - case newCharmClientMsg: m.cc = msg m.state = stateShowStash @@ -272,6 +278,19 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { m.pager.cc = msg cmds = append(cmds, loadStash(m.stash), loadNews(m.stash)) + case gotStashMsg: + m.loaded |= loadedStash + + case gotNewsMsg: + m.loaded |= loadedNews + + case noteSavedMsg: + // A note was saved to a document. This will have be done in the + // pager, so we'll need to find the corresponding note in the stash. + // So, pass the message to the stash for processing. + m.stash, cmd = stashUpdate(msg, m.stash) + cmds = append(cmds, cmd) + case fetchedMarkdownMsg: m.pager.currentDocument = msg cmds = append(cmds, renderWithGlamour(m.pager, msg.Body)) @@ -281,10 +300,8 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { } - switch m.state { - - case stateKeygenRunning: - // Process keygen + // Process keygen + if m.keygenState == keygenRunning { mdl, cmd := keygen.Update(msg, tea.Model(m.keygen)) keygenModel, ok := mdl.(keygen.Model) if !ok { @@ -293,14 +310,16 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { } m.keygen = keygenModel cmds = append(cmds, cmd) + } + + // Process children + switch m.state { case stateShowStash: - // Process stash m.stash, cmd = stashUpdate(msg, m.stash) cmds = append(cmds, cmd) case stateShowDocument: - // Process pager m.pager, cmd = pagerUpdate(msg, m.pager) cmds = append(cmds, cmd) } @@ -324,12 +343,6 @@ func view(mdl tea.Model) string { var s string switch m.state { - case stateInitCharmClient: - s += spinner.View(m.spinner) + " Initializing..." - case stateKeygenRunning: - s += keygen.View(m.keygen) - case stateKeygenFinished: - s += spinner.View(m.spinner) + " Re-initializing..." case stateShowStash: return stashView(m.stash) case stateShowDocument: @@ -415,6 +428,30 @@ func loadNews(m stashModel) tea.Cmd { // ETC +// Convert local file path to Markdown. Note that we could be doing things +// like checking if the file is a directory, but we trust that gitcha has +// already done that. +func localFileToMarkdown(cwd, path string) (*markdown, error) { + md := &markdown{ + markdownType: localFile, + localPath: path, + Markdown: &charm.Markdown{}, + } + + // Strip absolute path + md.Markdown.Note = strings.Replace(path, cwd+"/", "", -1) + + // Get last modified time + info, err := os.Stat(path) + if err != nil { + return nil, err + } + t := info.ModTime() + md.CreatedAt = &t + + return md, nil +} + func indent(s string, n int) string { if n <= 0 || s == "" { return s From df95fa6ba9f85512f97396401ee4ad05c866c113 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 15 Jul 2020 16:03:05 -0400 Subject: [PATCH 341/911] Selection index in file shouldn't dip below 0 --- ui/stash.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 35c89c3..ba817f0 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -146,16 +146,18 @@ func (m stashModel) selectedMarkdown() *markdown { // addDocuments adds markdown documents to the model func (m *stashModel) addMarkdowns(mds ...*markdown) { - m.markdowns = append(m.markdowns, mds...) - sort.Sort(markdownsByLocalFirst(m.markdowns)) - m.paginator.SetTotalPages(len(m.markdowns)) + if len(mds) > 0 { + m.markdowns = append(m.markdowns, mds...) + sort.Sort(markdownsByLocalFirst(m.markdowns)) + m.paginator.SetTotalPages(len(m.markdowns)) + } } // INIT func newStashModel() stashModel { s := spinner.NewModel() - s.Frames = spinner.Dot + s.Frames = spinner.Line s.ForegroundColor = common.SpinnerColor p := paginator.NewModel() @@ -313,7 +315,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Keep the index in bounds when paginating itemsOnPage := m.paginator.ItemsOnPage(len(m.markdowns)) if m.index > itemsOnPage-1 { - m.index = itemsOnPage - 1 + m.index = max(0, itemsOnPage-1) } // If we're on the last page and we haven't loaded everything, get From 70070d2948f77d0dc9eaf34455f8b831b59b2cca Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 15 Jul 2020 16:41:41 -0400 Subject: [PATCH 342/911] Draw a spinner in the file listing while stuff is loading --- ui/stash.go | 79 +++++++++++++++++++++++++++++++++++++---------------- ui/ui.go | 49 ++++++++++----------------------- 2 files changed, 69 insertions(+), 59 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index ba817f0..313bfe9 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -74,6 +74,20 @@ func (m markdownsByLocalFirst) Less(i, j int) bool { return m[i].CreatedAt.After(*m[j].CreatedAt) } +type loadedState byte + +const ( + loadedStash loadedState = 1 << iota + loadedNews + loadedLocalFiles +) + +func (s loadedState) done() bool { + return s&loadedStash != 0 && + s&loadedNews != 0 && + s&loadedLocalFiles != 0 +} + type stashState int const ( @@ -84,18 +98,19 @@ const ( ) type stashModel struct { - cc *charm.Client - state stashState - markdowns []*markdown - spinner spinner.Model - noteInput textinput.Model - terminalWidth int - terminalHeight int - loading bool // are we currently loading something? - fullyLoaded bool // Have we loaded everything from the server? - hasStash bool // do we have stashed files to show? - hasLocalFiles bool // do we have local files to show? - hasNews bool // do we have news to show? + cc *charm.Client + state stashState + markdowns []*markdown + spinner spinner.Model + noteInput textinput.Model + terminalWidth int + terminalHeight int + stashFullyLoaded bool // have we loaded everything from the server? + hasStash bool // do we have stashed files to show? + hasLocalFiles bool // do we have local files to show? + hasNews bool // do we have news to show? + loadingFromNetwork bool // are we currently loading something from the network? + loaded loadedState // what's loaded? we find out with bitmasking // This is just the index of the current page in view. To get the index // of the selected item as it relates to the full set of documents we've @@ -171,11 +186,11 @@ func newStashModel() stashModel { ni.Focus() m := stashModel{ - spinner: s, - noteInput: ni, - page: 1, - paginator: p, - loading: true, + spinner: s, + noteInput: ni, + page: 1, + paginator: p, + loadingFromNetwork: true, } return m @@ -191,13 +206,22 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { switch msg := msg.(type) { + // We're finished searching for local files + case localFileSearchFinished: + m.loaded |= loadedLocalFiles + // Stash results have come in from the server case gotStashMsg: - m.loading = false + // This doesn't mean the whole stash listing is loaded, but some we've + // finished checking for the stash, at least, so mark the stash as + // loaded here. + m.loaded |= loadedStash + + m.loadingFromNetwork = false if len(msg) == 0 { // If the server comes back with nothing then we've got everything - m.fullyLoaded = true + m.stashFullyLoaded = true } else { docs := wrapMarkdowns(stashedMarkdown, msg) m.addMarkdowns(docs...) @@ -206,6 +230,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // News has come in from the server case gotNewsMsg: + m.loaded |= loadedNews if len(msg) > 0 { docs := wrapMarkdowns(newsMarkdown, msg) m.addMarkdowns(docs...) @@ -213,7 +238,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } case spinner.TickMsg: - if m.state == stashStateLoadingDocument { + if !m.loaded.done() || m.loadingFromNetwork || m.state == stashStateLoadingDocument { m.spinner, cmd = spinner.Update(msg, m.spinner) cmds = append(cmds, cmd) } @@ -320,9 +345,9 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // If we're on the last page and we haven't loaded everything, get // more stuff. - if m.paginator.OnLastPage() && !m.loading && !m.fullyLoaded { + if m.paginator.OnLastPage() && !m.loadingFromNetwork && !m.stashFullyLoaded { m.page++ - m.loading = true + m.loadingFromNetwork = true cmds = append(cmds, loadStash(m)) } @@ -397,6 +422,11 @@ func stashView(m stashModel) string { s += " " + spinner.View(m.spinner) + " Loading document..." case stashStateReady, stashStateSettingNote, stashStatePromptDelete: + loadingIndicator := "" + if !m.loaded.done() || m.loadingFromNetwork { + loadingIndicator = spinner.View(m.spinner) + } + // We need to fill any empty height with newlines so the footer reaches // the bottom. numBlankLines := max(0, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)%stashViewItemHeight) @@ -431,14 +461,15 @@ func stashView(m stashModel) string { if m.paginator.TotalPages > 1 { pagination = paginator.View(m.paginator) - if !m.fullyLoaded { + if !m.stashFullyLoaded { pagination += common.Subtle(" ···") } } s += fmt.Sprintf( - " %s\n\n %s\n\n%s\n\n%s %s\n\n %s", + " %s %s\n\n %s\n\n%s\n\n%s %s\n\n %s", glowLogoView(" Glow "), + loadingIndicator, header, stashPopulatedView(m), blankLines, diff --git a/ui/ui.go b/ui/ui.go index 7d7652c..5252b4c 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -7,6 +7,7 @@ import ( "os" "strings" + "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" @@ -59,20 +60,6 @@ type gotNewsMsg []*charm.Markdown // MODEL -type loadedState byte - -const ( - loadedStash loadedState = 1 << iota - loadedNews - loadedLocalFiles -) - -func (s loadedState) done() bool { - return s&loadedStash != 0 && - s&loadedNews != 0 && - s&loadedLocalFiles != 0 -} - type state int const ( @@ -111,8 +98,7 @@ type model struct { pager pagerModel terminalWidth int terminalHeight int - cwd string // directory from which we're running Glow - loaded loadedState // what's loaded? we find out with bitmasking + cwd string // directory from which we're running Glow // Channel that receives paths to local markdown files // (via the github.com/muesli/gitcha package) @@ -139,15 +125,18 @@ func initialize(style string) func() (tea.Model, tea.Cmd) { } } - return model{ - stash: newStashModel(), - pager: newPagerModel(style), - state: stateShowStash, - keygenState: keygenUnstarted, - }, tea.Batch( - findLocalFiles, - newCharmClient, - ) + m := model{ + stash: newStashModel(), + pager: newPagerModel(style), + state: stateShowStash, + keygenState: keygenUnstarted, + } + + return m, tea.Batch( + findLocalFiles, + newCharmClient, + spinner.Tick(m.stash.spinner), + ) } } @@ -250,10 +239,6 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { } cmds = append(cmds, findNextLocalFile(m)) - // We're finished searching for local files - case localFileSearchFinished: - m.loaded |= loadedLocalFiles - case sshAuthErrMsg: // If we haven't run the keygen yet, do that if m.keygenState != keygenFinished { @@ -278,12 +263,6 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { m.pager.cc = msg cmds = append(cmds, loadStash(m.stash), loadNews(m.stash)) - case gotStashMsg: - m.loaded |= loadedStash - - case gotNewsMsg: - m.loaded |= loadedNews - case noteSavedMsg: // A note was saved to a document. This will have be done in the // pager, so we'll need to find the corresponding note in the stash. From 70833af87fa8d24428d0bc90806626ccefd99d49 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 15 Jul 2020 18:29:58 -0400 Subject: [PATCH 343/911] Use keygen directly; we don't need the Bubble Tea component anymore --- ui/ui.go | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 5252b4c..7dbcb61 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -11,7 +11,6 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" - "github.com/charmbracelet/charm/ui/keygen" "github.com/muesli/gitcha" te "github.com/muesli/termenv" ) @@ -49,6 +48,8 @@ func NewProgram(style string, cfg UIConfig) *tea.Program { type errMsg error type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} +type keygenFailedMsg struct{} +type keygenSuccessMsg struct{} type initLocalFileSearchMsg struct { cwd string ch chan string @@ -90,7 +91,6 @@ func (s state) String() string { type model struct { cc *charm.Client user *charm.User - keygen keygen.Model keygenState keygenState state state err error @@ -243,15 +243,26 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // If we haven't run the keygen yet, do that if m.keygenState != keygenFinished { m.keygenState = keygenRunning - m.keygen = keygen.NewModel() - cmds = append(cmds, keygen.GenerateKeys) + cmds = append(cmds, generateSSHKeys) } else { - // The keygen didn't work and we can't auth - m.err = errors.New("SSH authentication failed") - return m, tea.Quit + // The keygen ran but things still didn't work and we can't auth + m.err = errors.New("SSH authentication failed; we tried ssh-agent, loading keys from disk, and generating SSH keys") + + // Even though it failed, news/stash loading is finished + m.stash.loaded |= loadedStash | loadedNews + m.stash.loadingFromNetwork = false } - case keygen.DoneMsg: + case keygenFailedMsg: + // Keygen failed. That sucks. + m.err = errors.New("could not authenticate; could not generate SSH keys") + m.keygenState = keygenFinished + + // Even though it failed, news/stash loading is finished + m.stash.loaded |= loadedStash | loadedNews + m.stash.loadingFromNetwork = false + + case keygenSuccessMsg: // The keygen's done, so let's try initializing the charm client again m.keygenState = keygenFinished cmds = append(cmds, newCharmClient) @@ -279,18 +290,6 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { } - // Process keygen - if m.keygenState == keygenRunning { - mdl, cmd := keygen.Update(msg, tea.Model(m.keygen)) - keygenModel, ok := mdl.(keygen.Model) - if !ok { - m.err = errors.New("could not perform assertion on keygen model in main update") - return m, tea.Quit - } - m.keygen = keygenModel - cmds = append(cmds, cmd) - } - // Process children switch m.state { @@ -405,6 +404,14 @@ func loadNews(m stashModel) tea.Cmd { } } +func generateSSHKeys() tea.Msg { + _, err := charm.NewSSHKeyPair() + if err != nil { + return keygenFailedMsg{} + } + return keygenSuccessMsg{} +} + // ETC // Convert local file path to Markdown. Note that we could be doing things From 091c3be039546939104e86c84170e1fd72cd8425 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 15 Jul 2020 19:11:48 -0400 Subject: [PATCH 344/911] Keep loading stuff in the background while viewing a document --- ui/stash.go | 5 +---- ui/ui.go | 37 ++++++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 313bfe9..c8bd457 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -302,10 +302,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { cmd = loadRemoteMarkdown(m.cc, md.ID, md.markdownType) } - cmds = append(cmds, - cmd, - spinner.Tick(m.spinner), - ) + cmds = append(cmds, cmd, spinner.Tick(m.spinner)) // Set note case "m": diff --git a/ui/ui.go b/ui/ui.go index 7dbcb61..b604c50 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -185,17 +185,24 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // Special cases for the pager case stateShowDocument: + var cmds []tea.Cmd if m.pager.state == pagerStateBrowse { // If the user is just browing a document, exit the pager. m.unloadDocument() if m.pager.viewport.HighPerformanceRendering { - cmd = tea.ClearScrollArea + cmds = append(cmds, tea.ClearScrollArea) + } + if !m.stash.loaded.done() || m.stash.loadingFromNetwork { + cmds = append(cmds, spinner.Tick(m.stash.spinner)) } } else { - // Otherwise send keys through to pager for processing - m.pager, cmd = pagerUpdate(msg, m.pager) + // Otherwise send these key messages through to pager for + // processing + newPagerModel, cmd := pagerUpdate(msg, m.pager) + m.pager = newPagerModel + cmds = append(cmds, cmd) } - return m, cmd + return m, tea.Batch(cmds...) } return m, tea.Quit @@ -274,13 +281,6 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { m.pager.cc = msg cmds = append(cmds, loadStash(m.stash), loadNews(m.stash)) - case noteSavedMsg: - // A note was saved to a document. This will have be done in the - // pager, so we'll need to find the corresponding note in the stash. - // So, pass the message to the stash for processing. - m.stash, cmd = stashUpdate(msg, m.stash) - cmds = append(cmds, cmd) - case fetchedMarkdownMsg: m.pager.currentDocument = msg cmds = append(cmds, renderWithGlamour(m.pager, msg.Body)) @@ -288,6 +288,21 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case contentRenderedMsg: m.state = stateShowDocument + case noteSavedMsg: + // A note was saved to a document. This will have be done in the + // pager, so we'll need to find the corresponding note in the stash. + // So, pass the message to the stash for processing. + stashModel, cmd := stashUpdate(msg, m.stash) + m.stash = stashModel + return m, cmd + + case localFileSearchFinished, gotStashMsg, gotNewsMsg: + // Also pass these messages to the stash so we can keep it updated + // about network activity. + stashModel, cmd := stashUpdate(msg, m.stash) + m.stash = stashModel + return m, cmd + } // Process children From 9263f82ebc7face06318865eaa00773226539736 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 15 Jul 2020 19:19:44 -0400 Subject: [PATCH 345/911] Avoid potential variable capture situations --- ui/stash.go | 22 +++++++++++----------- ui/ui.go | 27 +++++++++++---------------- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index c8bd457..83d6f35 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -199,10 +199,7 @@ func newStashModel() stashModel { // UPDATE func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { - var ( - cmd tea.Cmd - cmds []tea.Cmd - ) + var cmds []tea.Cmd switch msg := msg.(type) { @@ -239,7 +236,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case spinner.TickMsg: if !m.loaded.done() || m.loadingFromNetwork || m.state == stashStateLoadingDocument { - m.spinner, cmd = spinner.Update(msg, m.spinner) + newSpinnerModel, cmd := spinner.Update(msg, m.spinner) + m.spinner = newSpinnerModel cmds = append(cmds, cmd) } @@ -297,12 +295,12 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { md := m.selectedMarkdown() if md.markdownType == localFile { - cmd = loadLocalMarkdown(md) + cmds = append(cmds, loadLocalMarkdown(md)) } else { - cmd = loadRemoteMarkdown(m.cc, md.ID, md.markdownType) + cmds = append(cmds, loadRemoteMarkdown(m.cc, md.ID, md.markdownType)) } - cmds = append(cmds, cmd, spinner.Tick(m.spinner)) + cmds = append(cmds, spinner.Tick(m.spinner)) // Set note case "m": @@ -331,7 +329,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } // Update paginator - m.paginator, cmd = paginator.Update(msg, m.paginator) + newPaginatorModel, cmd := paginator.Update(msg, m.paginator) + m.paginator = newPaginatorModel cmds = append(cmds, cmd) // Keep the index in bounds when paginating @@ -390,7 +389,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Set new note md := m.selectedMarkdown() newNote := m.noteInput.Value() - cmd = saveDocumentNote(m.cc, md.ID, newNote) + cmd := saveDocumentNote(m.cc, md.ID, newNote) md.Note = newNote m.noteInput.Reset() m.state = stashStateReady @@ -399,7 +398,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } // Update the text input component used to set notes - m.noteInput, cmd = textinput.Update(msg, m.noteInput) + newNoteInputModel, cmd := textinput.Update(msg, m.noteInput) + m.noteInput = newNoteInputModel cmds = append(cmds, cmd) } diff --git a/ui/ui.go b/ui/ui.go index b604c50..f13400d 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -157,13 +157,9 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { } } - var ( - cmd tea.Cmd - cmds []tea.Cmd - ) + var cmds []tea.Cmd switch msg := msg.(type) { - case tea.KeyMsg: switch msg.String() { case "q": @@ -185,24 +181,24 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // Special cases for the pager case stateShowDocument: - var cmds []tea.Cmd + var batch []tea.Cmd if m.pager.state == pagerStateBrowse { // If the user is just browing a document, exit the pager. m.unloadDocument() if m.pager.viewport.HighPerformanceRendering { - cmds = append(cmds, tea.ClearScrollArea) + batch = append(batch, tea.ClearScrollArea) } if !m.stash.loaded.done() || m.stash.loadingFromNetwork { - cmds = append(cmds, spinner.Tick(m.stash.spinner)) + batch = append(batch, spinner.Tick(m.stash.spinner)) } } else { // Otherwise send these key messages through to pager for // processing newPagerModel, cmd := pagerUpdate(msg, m.pager) m.pager = newPagerModel - cmds = append(cmds, cmd) + cmds = append(batch, cmd) } - return m, tea.Batch(cmds...) + return m, tea.Batch(batch...) } return m, tea.Quit @@ -309,11 +305,13 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { switch m.state { case stateShowStash: - m.stash, cmd = stashUpdate(msg, m.stash) + newStashModel, cmd := stashUpdate(msg, m.stash) + m.stash = newStashModel cmds = append(cmds, cmd) case stateShowDocument: - m.pager, cmd = pagerUpdate(msg, m.pager) + newPagerModel, cmd := pagerUpdate(msg, m.pager) + m.pager = newPagerModel cmds = append(cmds, cmd) } @@ -365,10 +363,7 @@ func findLocalFiles() tea.Msg { } ch := gitcha.FindFileFromList(cwd, []string{"*.md"}) - return initLocalFileSearchMsg{ - ch: ch, - cwd: cwd, - } + return initLocalFileSearchMsg{ch: ch, cwd: cwd} } func findNextLocalFile(m model) tea.Cmd { From aa0c48f9835b78ac93e68d0a3055c0207323d017 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 15 Jul 2020 19:56:37 -0400 Subject: [PATCH 346/911] Show local and stashed counts in header --- ui/stash.go | 60 ++++++++++++++++++++++++++++++++++------------------- ui/ui.go | 3 +-- 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 83d6f35..d9bdc0c 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -42,7 +42,7 @@ type markdownType int const ( stashedMarkdown markdownType = iota newsMarkdown - localFile + localMarkdown ) // markdown wraps charm.Markdown so we can differentiate between stashed items @@ -63,10 +63,10 @@ func (m markdownsByLocalFirst) Less(i, j int) bool { jType := m[j].markdownType // Local files come first - if iType == localFile && jType != localFile { + if iType == localMarkdown && jType != localMarkdown { return true } - if iType != localFile && jType == localFile { + if iType != localMarkdown && jType == localMarkdown { return false } @@ -106,9 +106,6 @@ type stashModel struct { terminalWidth int terminalHeight int stashFullyLoaded bool // have we loaded everything from the server? - hasStash bool // do we have stashed files to show? - hasLocalFiles bool // do we have local files to show? - hasNews bool // do we have news to show? loadingFromNetwork bool // are we currently loading something from the network? loaded loadedState // what's loaded? we find out with bitmasking @@ -168,6 +165,18 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) { } } +func (m stashModel) countMarkdowns(t markdownType) (found int) { + if len(m.markdowns) == 0 { + return + } + for i := 0; i < len(m.markdowns); i++ { + if m.markdowns[i].markdownType == t { + found++ + } + } + return +} + // INIT func newStashModel() stashModel { @@ -222,7 +231,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } else { docs := wrapMarkdowns(stashedMarkdown, msg) m.addMarkdowns(docs...) - m.hasStash = true } // News has come in from the server @@ -231,7 +239,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { if len(msg) > 0 { docs := wrapMarkdowns(newsMarkdown, msg) m.addMarkdowns(docs...) - m.hasNews = true } case spinner.TickMsg: @@ -294,7 +301,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.state = stashStateLoadingDocument md := m.selectedMarkdown() - if md.markdownType == localFile { + if md.markdownType == localMarkdown { cmds = append(cmds, loadLocalMarkdown(md)) } else { cmds = append(cmds, loadRemoteMarkdown(m.cc, md.ID, md.markdownType)) @@ -432,18 +439,29 @@ func stashView(m stashModel) string { blankLines = strings.Repeat("\n", numBlankLines) } + localItems := m.countMarkdowns(localMarkdown) + stashedItems := m.countMarkdowns(stashedMarkdown) + var header string - if m.hasStash && m.hasLocalFiles { - header = "Here are your local and stashed markdown files:" - } else if m.hasStash { - header = "Here’s your markdown stash:" - } else if m.hasLocalFiles { - header = "Here are your local markdown files:" - } else if m.hasNews { - // TODO: proper help - header = "Here are some Glow updates:" - } else { - // TODO: proper help + if localItems > 0 { + var plural string + if localItems > 1 { + plural = "s" + } + header += fmt.Sprintf("%d File%s", localItems, plural) + } + if stashedItems > 0 { + var divider string + if localItems > 0 { + divider = " • " + } + header += fmt.Sprintf("%s%d Stashed", divider, stashedItems) + } + header = common.Subtle(header) + + // TODO: show proper help if no stashed items or local items are found + // (even if there's news) + if localItems == 0 && stashedItems == 0 { header = "Nothing stashed yet. To stash you can " + common.Code("glow stash path/to/file.md") + "." } @@ -580,7 +598,7 @@ func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { func loadLocalMarkdown(md *markdown) tea.Cmd { return func() tea.Msg { - if md.markdownType != localFile { + if md.markdownType != localMarkdown { return errMsg(errors.New("could not load local file: not a local file")) } if md.localPath == "" { diff --git a/ui/ui.go b/ui/ui.go index f13400d..cb2e0e5 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -237,7 +237,6 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case foundLocalFileMsg: pathStr, err := localFileToMarkdown(m.cwd, string(msg)) if err == nil { - m.stash.hasLocalFiles = true m.stash.addMarkdowns(pathStr) } cmds = append(cmds, findNextLocalFile(m)) @@ -429,7 +428,7 @@ func generateSSHKeys() tea.Msg { // already done that. func localFileToMarkdown(cwd, path string) (*markdown, error) { md := &markdown{ - markdownType: localFile, + markdownType: localMarkdown, localPath: path, Markdown: &charm.Markdown{}, } From abff9d47de1d4cb304ec6b0a2790b087653b2a1e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 16 Jul 2020 15:09:06 -0400 Subject: [PATCH 347/911] Better header messages depending on what we find --- ui/stash.go | 84 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 29 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index d9bdc0c..c0f77cd 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -17,10 +17,12 @@ import ( "github.com/charmbracelet/charm/ui/common" "github.com/dustin/go-humanize" runewidth "github.com/mattn/go-runewidth" + "github.com/muesli/reflow/wordwrap" te "github.com/muesli/termenv" ) const ( + stashIndent = 1 stashViewItemHeight = 3 stashViewTopPadding = 5 stashViewBottomPadding = 4 @@ -425,6 +427,9 @@ func stashView(m stashModel) string { case stashStateLoadingDocument: s += " " + spinner.View(m.spinner) + " Loading document..." case stashStateReady, stashStateSettingNote, stashStatePromptDelete: + var ( + header string + ) loadingIndicator := "" if !m.loaded.done() || m.loadingFromNetwork { @@ -439,32 +444,6 @@ func stashView(m stashModel) string { blankLines = strings.Repeat("\n", numBlankLines) } - localItems := m.countMarkdowns(localMarkdown) - stashedItems := m.countMarkdowns(stashedMarkdown) - - var header string - if localItems > 0 { - var plural string - if localItems > 1 { - plural = "s" - } - header += fmt.Sprintf("%d File%s", localItems, plural) - } - if stashedItems > 0 { - var divider string - if localItems > 0 { - divider = " • " - } - header += fmt.Sprintf("%s%d Stashed", divider, stashedItems) - } - header = common.Subtle(header) - - // TODO: show proper help if no stashed items or local items are found - // (even if there's news) - if localItems == 0 && stashedItems == 0 { - header = "Nothing stashed yet. To stash you can " + common.Code("glow stash path/to/file.md") + "." - } - switch m.state { case stashStatePromptDelete: header = redFg("Delete this item? ") + faintRedFg("(y/N)") @@ -472,6 +451,12 @@ func stashView(m stashModel) string { header = yellowFg("Set the memo for this item?") } + // Only draw the normal header if we're not using the header area for + // something else (like a prompt) + if header == "" { + header = stashHeaderView(m) + } + var pagination string if m.paginator.TotalPages > 1 { pagination = paginator.View(m.paginator) @@ -492,7 +477,7 @@ func stashView(m stashModel) string { stashHelpView(m), ) } - return "\n" + indent(s, 1) + return "\n" + indent(s, stashIndent) } func glowLogoView(text string) string { @@ -503,8 +488,49 @@ func glowLogoView(text string) string { String() } -func stashEmtpyView(m stashModel) string { - return "Nothing stashed yet." +func stashHeaderView(m stashModel) string { + loading := !m.loaded.done() + noMarkdowns := len(m.markdowns) == 0 + + // Still loading. We haven't found files, stashed items, or news yet. + if loading && noMarkdowns { + return common.Subtle("Looking for stuff...") + } + + // Loading's finished. We didn't find anything, the stash is empty and + // there's no news. + if !loading && noMarkdowns { + s := "Nothing found. Try running " + common.Code("glow") + + " in a directory with markdown files, or stashing a file with " + + common.Code("glow stash") + ". For more, see " + common.Code("glow help") + "." + return wordwrap.String(s, stashIndent) + } + + localItems := m.countMarkdowns(localMarkdown) + stashedItems := m.countMarkdowns(stashedMarkdown) + + // Loading's finished and all we have is news. + if localItems == 0 && stashedItems == 0 { + return common.Subtle("No local or stashed markdown files found.") + } + + // There are local and/or stashed files, so display counts. + var s string + if localItems > 0 { + var plural string + if localItems > 1 { + plural = "s" + } + s += fmt.Sprintf("%d File%s", localItems, plural) + } + if stashedItems > 0 { + var divider string + if localItems > 0 { + divider = " • " + } + s += fmt.Sprintf("%s%d Stashed", divider, stashedItems) + } + return common.Subtle(s) } func stashPopulatedView(m stashModel) string { From e8eea0b1a1529b82a86ac63f0f84d268288e7bad Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 16 Jul 2020 15:19:59 -0400 Subject: [PATCH 348/911] Don't shut down when we encounter network errors --- ui/stash.go | 8 ++++++++ ui/ui.go | 23 ++++++++++------------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index c0f77cd..60fe4d1 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -102,6 +102,7 @@ const ( type stashModel struct { cc *charm.Client state stashState + err error markdowns []*markdown spinner spinner.Model noteInput textinput.Model @@ -214,6 +215,9 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { switch msg := msg.(type) { + case errMsg: + m.err = msg + // We're finished searching for local files case localFileSearchFinished: m.loaded |= loadedLocalFiles @@ -457,6 +461,10 @@ func stashView(m stashModel) string { header = stashHeaderView(m) } + if m.err != nil { + header = m.err.Error() + } + var pagination string if m.paginator.TotalPages > 1 { pagination = paginator.View(m.paginator) diff --git a/ui/ui.go b/ui/ui.go index cb2e0e5..60b7cd3 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -93,7 +93,7 @@ type model struct { user *charm.User keygenState keygenState state state - err error + fatalErr error stash stashModel pager pagerModel terminalWidth int @@ -146,12 +146,12 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { m, ok := mdl.(model) if !ok { return model{ - err: errors.New("could not perform assertion on model in update"), + fatalErr: errors.New("could not perform assertion on model in update"), }, tea.Quit } // If there's been an error, any key exits - if m.err != nil { + if m.fatalErr != nil { if _, ok := msg.(tea.KeyMsg); ok { return m, tea.Quit } @@ -213,10 +213,6 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { return m, nil } - case errMsg: - m.err = msg - return m, nil - // Window size is received when starting up and on every resize case tea.WindowSizeMsg: m.terminalWidth = msg.Width @@ -248,7 +244,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { cmds = append(cmds, generateSSHKeys) } else { // The keygen ran but things still didn't work and we can't auth - m.err = errors.New("SSH authentication failed; we tried ssh-agent, loading keys from disk, and generating SSH keys") + m.stash.err = errors.New("SSH authentication failed; we tried ssh-agent, loading keys from disk, and generating SSH keys") // Even though it failed, news/stash loading is finished m.stash.loaded |= loadedStash | loadedNews @@ -257,7 +253,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case keygenFailedMsg: // Keygen failed. That sucks. - m.err = errors.New("could not authenticate; could not generate SSH keys") + m.stash.err = errors.New("could not authenticate; could not generate SSH keys") m.keygenState = keygenFinished // Even though it failed, news/stash loading is finished @@ -326,8 +322,8 @@ func view(mdl tea.Model) string { return "could not perform assertion on model in view" } - if m.err != nil { - return "\n" + indent(errorView(m.err), 2) + if m.fatalErr != nil { + return fatalErrorView(m.fatalErr) } var s string @@ -342,8 +338,8 @@ func view(mdl tea.Model) string { return "\n" + indent(s, 2) } -func errorView(err error) string { - return fmt.Sprintf("%s\n\n%v\n\n%s", +func fatalErrorView(err error) string { + s := fmt.Sprintf("%s\n\n%v\n\n%s", te.String(" ERROR "). Foreground(common.Cream.Color()). Background(common.Red.Color()). @@ -351,6 +347,7 @@ func errorView(err error) string { err, common.Subtle("Press any key to exit"), ) + return "\n" + indent(s, 2) } // COMMANDS From d156142f5741f4dad480878e46eb18ead6313499 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 16 Jul 2020 15:37:48 -0400 Subject: [PATCH 349/911] Press "r" to view errors in the stash --- ui/stash.go | 27 +++++++++++++++++++++++---- ui/ui.go | 6 +++--- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 60fe4d1..cbba85c 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -103,6 +103,7 @@ type stashModel struct { cc *charm.Client state stashState err error + showError bool markdowns []*markdown spinner spinner.Model noteInput textinput.Model @@ -266,6 +267,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { switch m.state { case stashStateReady: + + // Handle keys if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { @@ -338,7 +341,20 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.state = stashStatePromptDelete } + // Show errors + case "r": + if m.err != nil && !m.showError { + m.showError = true + return m, nil + } + } + + // If the error view is visible any key hides it. + if m.showError { + m.showError = false + } + } // Update paginator @@ -426,6 +442,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // VIEW func stashView(m stashModel) string { + if m.showError { + return errorView(m.err) + } + var s string switch m.state { case stashStateLoadingDocument: @@ -461,10 +481,6 @@ func stashView(m stashModel) string { header = stashHeaderView(m) } - if m.err != nil { - header = m.err.Error() - } - var pagination string if m.paginator.TotalPages > 1 { pagination = paginator.View(m.paginator) @@ -599,6 +615,9 @@ func stashHelpView(m stashModel) string { if isStashed && len(m.markdowns) > 0 { h = append(h, []string{"x: delete", "m: set memo"}...) } + if m.err != nil { + h = append(h, []string{"r: errors"}...) + } h = append(h, []string{"esc: exit"}...) } return common.HelpView(h...) diff --git a/ui/ui.go b/ui/ui.go index 60b7cd3..02dbc96 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -323,7 +323,7 @@ func view(mdl tea.Model) string { } if m.fatalErr != nil { - return fatalErrorView(m.fatalErr) + return errorView(m.fatalErr) } var s string @@ -338,7 +338,7 @@ func view(mdl tea.Model) string { return "\n" + indent(s, 2) } -func fatalErrorView(err error) string { +func errorView(err error) string { s := fmt.Sprintf("%s\n\n%v\n\n%s", te.String(" ERROR "). Foreground(common.Cream.Color()). @@ -347,7 +347,7 @@ func fatalErrorView(err error) string { err, common.Subtle("Press any key to exit"), ) - return "\n" + indent(s, 2) + return "\n" + indent(s, 3) } // COMMANDS From 3409ca342a1e9da6fe5ccd6898216319fc8123b8 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 16 Jul 2020 15:38:48 -0400 Subject: [PATCH 350/911] Don't show navigation help in the stash if there's only one item --- ui/stash.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/stash.go b/ui/stash.go index cbba85c..bf6aa00 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -607,6 +607,8 @@ func stashHelpView(m stashModel) string { } else { if len(m.markdowns) > 0 { h = append(h, "enter: open") + } + if len(m.markdowns) > 1 { h = append(h, "j/k, ↑/↓: choose") } if m.paginator.TotalPages > 1 { From 4cfd1fc897f8f9264c66119246c1cd641d403114 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 16 Jul 2020 15:41:16 -0400 Subject: [PATCH 351/911] Better error view language depending on whether error is fatal --- ui/stash.go | 2 +- ui/ui.go | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index bf6aa00..4e01ade 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -443,7 +443,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { func stashView(m stashModel) string { if m.showError { - return errorView(m.err) + return errorView(m.err, false) } var s string diff --git a/ui/ui.go b/ui/ui.go index 02dbc96..114a68a 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -323,7 +323,7 @@ func view(mdl tea.Model) string { } if m.fatalErr != nil { - return errorView(m.fatalErr) + return errorView(m.fatalErr, true) } var s string @@ -338,14 +338,20 @@ func view(mdl tea.Model) string { return "\n" + indent(s, 2) } -func errorView(err error) string { +func errorView(err error, fatal bool) string { + exitMsg := "press any key to " + if fatal { + exitMsg += "exit" + } else { + exitMsg += "return" + } s := fmt.Sprintf("%s\n\n%v\n\n%s", te.String(" ERROR "). Foreground(common.Cream.Color()). Background(common.Red.Color()). String(), err, - common.Subtle("Press any key to exit"), + common.Subtle(exitMsg), ) return "\n" + indent(s, 3) } From 74aad5324ace6f51e74717556bea8d9d24420453 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 16 Jul 2020 15:54:55 -0400 Subject: [PATCH 352/911] Don't quit if user uses esc/q to exit the non-fatal error view --- ui/stash.go | 25 +++++++++++-------------- ui/ui.go | 4 +--- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 4e01ade..b5b7765 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -97,13 +97,13 @@ const ( stashStatePromptDelete stashStateLoadingDocument stashStateSettingNote + stashStateShowingError ) type stashModel struct { cc *charm.Client state stashState err error - showError bool markdowns []*markdown spinner spinner.Model noteInput textinput.Model @@ -341,20 +341,13 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.state = stashStatePromptDelete } - // Show errors case "r": - if m.err != nil && !m.showError { - m.showError = true + if m.err != nil && m.state == stashStateReady { + m.state = stashStateShowingError return m, nil } } - - // If the error view is visible any key hides it. - if m.showError { - m.showError = false - } - } // Update paginator @@ -407,7 +400,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } case stashStateSettingNote: - if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { case "esc": @@ -431,6 +423,12 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.noteInput = newNoteInputModel cmds = append(cmds, cmd) + case stashStateShowingError: + // Any key exists the error view + if _, ok := msg.(tea.KeyMsg); ok { + m.state = stashStateReady + } + } // If an item is being confirmed for delete, any key (other than the key @@ -442,12 +440,11 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // VIEW func stashView(m stashModel) string { - if m.showError { - return errorView(m.err, false) - } var s string switch m.state { + case stashStateShowingError: + return errorView(m.err, false) case stashStateLoadingDocument: s += " " + spinner.View(m.spinner) + " Loading document..." case stashStateReady, stashStateSettingNote, stashStatePromptDelete: diff --git a/ui/ui.go b/ui/ui.go index 114a68a..6ca8c1f 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -172,9 +172,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case stateShowStash: switch m.stash.state { - case stashStateSettingNote: - fallthrough - case stashStatePromptDelete: + case stashStateSettingNote, stashStatePromptDelete, stashStateShowingError: m.stash, cmd = stashUpdate(msg, m.stash) return m, cmd } From a35d83d5d25dc4ebf4d8545866a156403ca06e75 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 16 Jul 2020 16:51:44 -0400 Subject: [PATCH 353/911] View errors with "!" --- ui/stash.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index b5b7765..f96d4f2 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -341,7 +341,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.state = stashStatePromptDelete } - case "r": + case "!": if m.err != nil && m.state == stashStateReady { m.state = stashStateShowingError return m, nil @@ -615,7 +615,7 @@ func stashHelpView(m stashModel) string { h = append(h, []string{"x: delete", "m: set memo"}...) } if m.err != nil { - h = append(h, []string{"r: errors"}...) + h = append(h, []string{"!: errors"}...) } h = append(h, []string{"esc: exit"}...) } From 3b3bf684f9e0f48fb84bc2ba7308d1331a7e6d38 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 17 Jul 2020 12:25:40 -0400 Subject: [PATCH 354/911] Detect when stash and news loading fails (and update the UI accordingly) --- Makefile | 19 +++++++++++++++++++ ui/stash.go | 10 ++++++++++ ui/ui.go | 8 +++++--- 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b93836d --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +# This Makefile is just for development purposes + +.PHONY: default clean glow run log + +default: glow + +clean: + rm -f ./glow + +glow: + go build + +run: clean glow + ./glow + +log: + GLOW_UI_LOGFILE=debug.log + > debug.log + tail -f debug.log diff --git a/ui/stash.go b/ui/stash.go index f96d4f2..ccfb169 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -219,6 +219,16 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case errMsg: m.err = msg + case stashLoadErrMsg: + m.err = msg.err + m.loaded |= loadedStash // still done, albeit unsuccessfully + m.stashFullyLoaded = true + m.loadingFromNetwork = false + + case newsLoadErrMsg: + m.err = msg.err + m.loaded |= loadedNews // still done, albeit unsuccessfully + // We're finished searching for local files case localFileSearchFinished: m.loaded |= loadedLocalFiles diff --git a/ui/ui.go b/ui/ui.go index 6ca8c1f..4912ba5 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -37,7 +37,7 @@ func NewProgram(style string, cfg UIConfig) *tea.Program { if config.Logfile != "" { log.Println("-- Starting Glow ----------------") log.Printf("High performance pager: %v", cfg.HighPerformancePager) - log.Printf("Render with Glamour: %v", cfg.GlamourEnabled) + log.Printf("Glamour rendering: %v", cfg.GlamourEnabled) log.Println("Bubble Tea now initializing...") } return tea.NewProgram(initialize(style), update, view) @@ -57,7 +57,9 @@ type initLocalFileSearchMsg struct { type foundLocalFileMsg string type localFileSearchFinished struct{} type gotStashMsg []*charm.Markdown +type stashLoadErrMsg struct{ err error } type gotNewsMsg []*charm.Markdown +type newsLoadErrMsg struct{ err error } // MODEL @@ -398,7 +400,7 @@ func loadStash(m stashModel) tea.Cmd { return func() tea.Msg { stash, err := m.cc.GetStash(m.page) if err != nil { - return errMsg(err) + return stashLoadErrMsg{err: err} } return gotStashMsg(stash) } @@ -408,7 +410,7 @@ func loadNews(m stashModel) tea.Cmd { return func() tea.Msg { news, err := m.cc.GetNews(1) // just fetch the first page if err != nil { - return errMsg(err) + return newsLoadErrMsg{err: err} } return gotNewsMsg(news) } From c00fe7fc4a5752e3777d63b2fa3d371b9f724632 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 17 Jul 2020 18:30:53 -0400 Subject: [PATCH 355/911] Correct env var placement in Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b93836d..bb5106f 100644 --- a/Makefile +++ b/Makefile @@ -11,9 +11,9 @@ glow: go build run: clean glow + export GLOW_UI_LOGFILE=debug.log ./glow log: - GLOW_UI_LOGFILE=debug.log > debug.log tail -f debug.log From ad77b91f64e27904140fefa9483233643dc86973 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 17 Jul 2020 18:42:14 -0400 Subject: [PATCH 356/911] Bump bubbles for latest viewport fixes --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 2360c5d..81715a7 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.4.0 + github.com/charmbracelet/bubbles v0.4.1-0.20200717223838-185a19e56f4e github.com/charmbracelet/bubbletea v0.10.0 github.com/charmbracelet/charm v0.5.2 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 diff --git a/go.sum b/go.sum index 600d915..785cca0 100644 --- a/go.sum +++ b/go.sum @@ -15,8 +15,9 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/bubbles v0.4.0 h1:6VqieEcz5e03/nyM+psVw61xCwWu88JFVZ4331jFCfc= github.com/charmbracelet/bubbles v0.4.0/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= +github.com/charmbracelet/bubbles v0.4.1-0.20200717223838-185a19e56f4e h1:CyQ3NgyqRyN45dgfvpn2x3bu6exBvLlg9hVCJMJToBE= +github.com/charmbracelet/bubbles v0.4.1-0.20200717223838-185a19e56f4e/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.0 h1:rzbxI+eWoVuQ3Z7wOlefmxGtcxYr46Lu0fqIKYCZg7s= github.com/charmbracelet/bubbletea v0.10.0/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= From 3b06c1fcd6a0f96ea9c4dbd4e852b1a8d917f212 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 17 Jul 2020 18:55:02 -0400 Subject: [PATCH 357/911] Correction help-toggling method name in pager --- ui/pager.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 9399cc4..6d7f8ef 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -132,14 +132,14 @@ func (m *pagerModel) setContent(s string) { m.viewport.SetContent(s) } -func (m *pagerModel) toggleHeight() { +func (m *pagerModel) toggleHelp() { m.showHelp = !m.showHelp m.setSize(m.width, m.height) } func (m *pagerModel) unload() { if m.showHelp { - m.toggleHeight() + m.toggleHelp() } m.state = pagerStateBrowse m.viewport.SetContent("") @@ -197,7 +197,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { } return m, textinput.Blink(m.textInput) case "?": - m.toggleHeight() + m.toggleHelp() if m.viewport.HighPerformanceRendering { cmds = append(cmds, viewport.Sync(m.viewport)) } From 3619ad137a68f29e2d199b76e03f5b13d2a4c3b9 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 17 Jul 2020 19:23:34 -0400 Subject: [PATCH 358/911] Remove the bottom gap when closing the pager help whilst at the bottom --- go.mod | 2 +- go.sum | 4 ++-- ui/pager.go | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 81715a7..4bf2e9b 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.4.1-0.20200717223838-185a19e56f4e + github.com/charmbracelet/bubbles v0.4.1-0.20200717232208-b130d9643487 github.com/charmbracelet/bubbletea v0.10.0 github.com/charmbracelet/charm v0.5.2 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 diff --git a/go.sum b/go.sum index 785cca0..2984b13 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.4.0/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= -github.com/charmbracelet/bubbles v0.4.1-0.20200717223838-185a19e56f4e h1:CyQ3NgyqRyN45dgfvpn2x3bu6exBvLlg9hVCJMJToBE= -github.com/charmbracelet/bubbles v0.4.1-0.20200717223838-185a19e56f4e/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= +github.com/charmbracelet/bubbles v0.4.1-0.20200717232208-b130d9643487 h1:12MHTHjB26n5aVYw9NpJo2KTRFSn/UlpvlXNQW7aBuA= +github.com/charmbracelet/bubbles v0.4.1-0.20200717232208-b130d9643487/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.0 h1:rzbxI+eWoVuQ3Z7wOlefmxGtcxYr46Lu0fqIKYCZg7s= github.com/charmbracelet/bubbletea v0.10.0/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= diff --git a/ui/pager.go b/ui/pager.go index 6d7f8ef..da11521 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -135,6 +135,9 @@ func (m *pagerModel) setContent(s string) { func (m *pagerModel) toggleHelp() { m.showHelp = !m.showHelp m.setSize(m.width, m.height) + if m.viewport.PastBottom() { + m.viewport.GotoBottom() + } } func (m *pagerModel) unload() { From 85c121d0aca8fb10be239a2ec685f438670ef26e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 20 Jul 2020 11:00:17 -0400 Subject: [PATCH 359/911] Add Arabic pagination if the dot nav gets wider than the terminal width --- ui/stash.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ui/stash.go b/ui/stash.go index ccfb169..a177231 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -17,6 +17,7 @@ import ( "github.com/charmbracelet/charm/ui/common" "github.com/dustin/go-humanize" runewidth "github.com/mattn/go-runewidth" + "github.com/muesli/reflow/ansi" "github.com/muesli/reflow/wordwrap" te "github.com/muesli/termenv" ) @@ -492,6 +493,13 @@ func stashView(m stashModel) string { if m.paginator.TotalPages > 1 { pagination = paginator.View(m.paginator) + // If the dot pagination is wider than the width of the window + // switch to the arabic paginator. + if ansi.PrintableRuneWidth(pagination) > m.terminalWidth-stashViewHorizontalPadding { + m.paginator.Type = paginator.Arabic + pagination = common.Subtle(paginator.View(m.paginator)) + } + if !m.stashFullyLoaded { pagination += common.Subtle(" ···") } From f2fce69671d4de8bb7f7e326fc6af4e6f7b86f36 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 20 Jul 2020 11:59:03 -0400 Subject: [PATCH 360/911] Bump Bubbletea dep for pgup/pgdown fixes (also bump Termenv to 0.6) --- go.mod | 6 +++--- go.sum | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 4bf2e9b..6641a1e 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.4.1-0.20200717232208-b130d9643487 - github.com/charmbracelet/bubbletea v0.10.0 + github.com/charmbracelet/bubbles v0.4.1-0.20200720155635-88469a499e1a + github.com/charmbracelet/bubbletea v0.10.1-0.20200720155027-2ee871862a49 github.com/charmbracelet/charm v0.5.2 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac @@ -12,7 +12,7 @@ require ( github.com/meowgorithm/babyenv v1.2.1 github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d - github.com/muesli/termenv v0.5.3-0.20200715143749-3facc679bc62 + github.com/muesli/termenv v0.6.0 github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect diff --git a/go.sum b/go.sum index 2984b13..5824ec5 100644 --- a/go.sum +++ b/go.sum @@ -16,11 +16,12 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.4.0/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= -github.com/charmbracelet/bubbles v0.4.1-0.20200717232208-b130d9643487 h1:12MHTHjB26n5aVYw9NpJo2KTRFSn/UlpvlXNQW7aBuA= -github.com/charmbracelet/bubbles v0.4.1-0.20200717232208-b130d9643487/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= +github.com/charmbracelet/bubbles v0.4.1-0.20200720155635-88469a499e1a h1:Saz5ZuA/YfFjTM8Tk2KfAUPDutSIsU+GbSykL4LWUS0= +github.com/charmbracelet/bubbles v0.4.1-0.20200720155635-88469a499e1a/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/bubbletea v0.10.0 h1:rzbxI+eWoVuQ3Z7wOlefmxGtcxYr46Lu0fqIKYCZg7s= github.com/charmbracelet/bubbletea v0.10.0/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= +github.com/charmbracelet/bubbletea v0.10.1-0.20200720155027-2ee871862a49 h1:cc2ntD1GuEeaXZ/rweyMZnHYbi3VYPkeGhvVpNJUYQo= +github.com/charmbracelet/bubbletea v0.10.1-0.20200720155027-2ee871862a49/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/charm v0.5.2 h1:cgqc1LJuPwVTzZFD3CczgyxUC0oAkHSqnkUxIHUb+yc= github.com/charmbracelet/charm v0.5.2/go.mod h1:tpIHCBAc6qk1zl/uSuYMKDmKtEro7XJxe38P0tFyR54= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= @@ -99,8 +100,8 @@ github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d h1:ok5jhmKQze1yERN github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= -github.com/muesli/termenv v0.5.3-0.20200715143749-3facc679bc62 h1:W1+qXP5nmjE+c6IG2xQGs1tUit2NZXAKqBiYM4zf/vg= -github.com/muesli/termenv v0.5.3-0.20200715143749-3facc679bc62/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= +github.com/muesli/termenv v0.6.0 h1:zxvzTBmo4ZcxhNGGWeMz+Tttm51eF5bmPjfy4MCRYlk= +github.com/muesli/termenv v0.6.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= From 2b42115599e0e0ca9b20e715f305a52cbe326acc Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 20 Jul 2020 13:33:49 -0400 Subject: [PATCH 361/911] Bump bubbles to get pgup/pgdown in the stash (via the paginator) --- go.mod | 2 +- go.sum | 4 ++-- ui/stash.go | 12 +++++------- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 6641a1e..f9bce5b 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.4.1-0.20200720155635-88469a499e1a + github.com/charmbracelet/bubbles v0.4.1-0.20200720161353-5a26cb0d8eb6 github.com/charmbracelet/bubbletea v0.10.1-0.20200720155027-2ee871862a49 github.com/charmbracelet/charm v0.5.2 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 diff --git a/go.sum b/go.sum index 5824ec5..7cb8be6 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.4.0/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= -github.com/charmbracelet/bubbles v0.4.1-0.20200720155635-88469a499e1a h1:Saz5ZuA/YfFjTM8Tk2KfAUPDutSIsU+GbSykL4LWUS0= -github.com/charmbracelet/bubbles v0.4.1-0.20200720155635-88469a499e1a/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= +github.com/charmbracelet/bubbles v0.4.1-0.20200720161353-5a26cb0d8eb6 h1:aRg6jZ74pEvFkLpPvtP99ZrbZrf1C7bEeOdh9XE/JfM= +github.com/charmbracelet/bubbles v0.4.1-0.20200720161353-5a26cb0d8eb6/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.0/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.1-0.20200720155027-2ee871862a49 h1:cc2ntD1GuEeaXZ/rweyMZnHYbi3VYPkeGhvVpNJUYQo= diff --git a/ui/stash.go b/ui/stash.go index a177231..0234849 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -283,9 +283,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { - case "k": - fallthrough - case "up": + case "k", "up": m.index-- if m.index < 0 && m.paginator.Page == 0 { // Stop @@ -296,9 +294,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.index = m.paginator.ItemsOnPage(len(m.markdowns)) - 1 } - case "j": - fallthrough - case "down": + case "j", "down": itemsOnPage := m.paginator.ItemsOnPage(len(m.markdowns)) m.index++ if m.index >= itemsOnPage && m.paginator.OnLastPage() { @@ -361,7 +357,9 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } } - // Update paginator + // Update paginator. Pagination key handling is done here, but it could + // also be moved up to this level, in which case we'd use model methods + // like model.PageUp(). newPaginatorModel, cmd := paginator.Update(msg, m.paginator) m.paginator = newPaginatorModel cmds = append(cmds, cmd) From 3f22be5ae429365cf44a8224050f78df7aacb6fc Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 20 Jul 2020 13:48:09 -0400 Subject: [PATCH 362/911] Bump gitcha and adjust for gitcha API changes --- go.mod | 2 +- go.sum | 4 ++-- ui/ui.go | 20 ++++++++------------ 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index f9bce5b..e4c361c 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.2.1 - github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1 + github.com/muesli/gitcha v0.0.0-20200720155539-ccc362df0fe6 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d github.com/muesli/termenv v0.6.0 github.com/spf13/cobra v0.0.7 diff --git a/go.sum b/go.sum index 7cb8be6..4ef4adb 100644 --- a/go.sum +++ b/go.sum @@ -93,8 +93,8 @@ github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/le github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1 h1:UhmEuW8xAMA+CdXQgYQ9Iilnhyf+uNYWCJSotCldI7o= -github.com/muesli/gitcha v0.0.0-20200714001838-c071c3c6c6e1/go.mod h1:o3FpDWpvjmTm4Tzzrgq1ZhtYrplVPSpdgav7+YzaLLs= +github.com/muesli/gitcha v0.0.0-20200720155539-ccc362df0fe6 h1:0oi9UPRBektS6Fuuu1SnROx++2FHahRWaeGQ+IfTdGU= +github.com/muesli/gitcha v0.0.0-20200720155539-ccc362df0fe6/go.mod h1:o3FpDWpvjmTm4Tzzrgq1ZhtYrplVPSpdgav7+YzaLLs= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d h1:ok5jhmKQze1yERN73u46EZhUH4vgC1z4qfeFJ8iOwvg= github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= diff --git a/ui/ui.go b/ui/ui.go index 4912ba5..428fcda 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -52,9 +52,9 @@ type keygenFailedMsg struct{} type keygenSuccessMsg struct{} type initLocalFileSearchMsg struct { cwd string - ch chan string + ch chan gitcha.SearchResult } -type foundLocalFileMsg string +type foundLocalFileMsg gitcha.SearchResult type localFileSearchFinished struct{} type gotStashMsg []*charm.Markdown type stashLoadErrMsg struct{ err error } @@ -104,7 +104,7 @@ type model struct { // Channel that receives paths to local markdown files // (via the github.com/muesli/gitcha package) - localFileFinder chan string + localFileFinder chan gitcha.SearchResult } func (m *model) unloadDocument() { @@ -231,7 +231,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // We found a local file case foundLocalFileMsg: - pathStr, err := localFileToMarkdown(m.cwd, string(msg)) + pathStr, err := localFileToMarkdown(m.cwd, gitcha.SearchResult(msg)) if err == nil { m.stash.addMarkdowns(pathStr) } @@ -429,22 +429,18 @@ func generateSSHKeys() tea.Msg { // Convert local file path to Markdown. Note that we could be doing things // like checking if the file is a directory, but we trust that gitcha has // already done that. -func localFileToMarkdown(cwd, path string) (*markdown, error) { +func localFileToMarkdown(cwd string, res gitcha.SearchResult) (*markdown, error) { md := &markdown{ markdownType: localMarkdown, - localPath: path, + localPath: res.Path, Markdown: &charm.Markdown{}, } // Strip absolute path - md.Markdown.Note = strings.Replace(path, cwd+"/", "", -1) + md.Markdown.Note = strings.Replace(res.Path, cwd+"/", "", -1) // Get last modified time - info, err := os.Stat(path) - if err != nil { - return nil, err - } - t := info.ModTime() + t := res.Info.ModTime() md.CreatedAt = &t return md, nil From 2c71185ba613e856af8ee45801bb1a7a6f0c2a64 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 20 Jul 2020 13:50:14 -0400 Subject: [PATCH 363/911] Remove mysterious "stash may not be totally loaded" dots for now --- ui/stash.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 0234849..e42b4bf 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -498,9 +498,11 @@ func stashView(m stashModel) string { pagination = common.Subtle(paginator.View(m.paginator)) } - if !m.stashFullyLoaded { - pagination += common.Subtle(" ···") - } + /* + if !m.stashFullyLoaded { + pagination += common.Subtle(" ···") + } + */ } s += fmt.Sprintf( From 83eec3f833c037d95a5f1d2f1217f86d33d1079a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 20 Jul 2020 14:03:27 -0400 Subject: [PATCH 364/911] Don't change the state when initializing the Charm client This was residue from an earlier version in the application when it opened with a spinner rather than directly in the stash. It caused the pager to lock up and it's status bar to disappear if a local markdown file was opened before the Charm client initialized. --- ui/ui.go | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 428fcda..b71b277 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -70,6 +70,15 @@ const ( stateShowDocument ) +// String translates the staus to a human-readable string. This is just for +// debugging. +func (s state) String() string { + return [...]string{ + "showing stash", + "showing document", + }[s] +} + type keygenState int const ( @@ -78,18 +87,6 @@ const ( keygenFinished ) -// String translates the staus to a human-readable string. This is just for -// debugging. -func (s state) String() string { - return [...]string{ - "initializing", - "running keygen", - "keygen finished", - "showing stash", - "showing document", - }[s] -} - type model struct { cc *charm.Client user *charm.User @@ -267,7 +264,6 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case newCharmClientMsg: m.cc = msg - m.state = stateShowStash m.stash.cc = msg m.pager.cc = msg cmds = append(cmds, loadStash(m.stash), loadNews(m.stash)) From 97d11c00659b97f4f766f887dc852eeab2550ffb Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 20 Jul 2020 17:47:48 -0400 Subject: [PATCH 365/911] Bump bubbles for fix where scroll wheel would render extra lines In particular, the extra lines would be on the top and bottom of the pager depending on the size of the terminal window. --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e4c361c..4d8fdf4 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.4.1-0.20200720161353-5a26cb0d8eb6 + github.com/charmbracelet/bubbles v0.4.1-0.20200720214615-5357dd61bdfc github.com/charmbracelet/bubbletea v0.10.1-0.20200720155027-2ee871862a49 github.com/charmbracelet/charm v0.5.2 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 diff --git a/go.sum b/go.sum index 4ef4adb..a996a2c 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.4.0/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= -github.com/charmbracelet/bubbles v0.4.1-0.20200720161353-5a26cb0d8eb6 h1:aRg6jZ74pEvFkLpPvtP99ZrbZrf1C7bEeOdh9XE/JfM= -github.com/charmbracelet/bubbles v0.4.1-0.20200720161353-5a26cb0d8eb6/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= +github.com/charmbracelet/bubbles v0.4.1-0.20200720214615-5357dd61bdfc h1:IUiJHofnt59zovLvfrR2QkFHKHfKbWrZzyPUVcs9rB4= +github.com/charmbracelet/bubbles v0.4.1-0.20200720214615-5357dd61bdfc/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.0/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.1-0.20200720155027-2ee871862a49 h1:cc2ntD1GuEeaXZ/rweyMZnHYbi3VYPkeGhvVpNJUYQo= From 01de36670316351eef6be5a304b130809299eee8 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 20 Jul 2020 18:16:12 -0400 Subject: [PATCH 366/911] Truncate long lines in `stash get` command + cosmetic stuff --- stash.go | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/stash.go b/stash.go index 91457cf..ffb3e87 100644 --- a/stash.go +++ b/stash.go @@ -6,9 +6,12 @@ import ( "log" "os" "strconv" + "strings" "github.com/charmbracelet/charm" + "github.com/mattn/go-runewidth" "github.com/spf13/cobra" + "golang.org/x/crypto/ssh/terminal" ) var ( @@ -51,13 +54,31 @@ var ( cc := initCharmClient() mds, err := cc.GetStash(1) if err != nil { - return fmt.Errorf("error getting stash") + return fmt.Errorf("error getting stash: " + err.Error()) } - fmt.Println("ID\tNote") - fmt.Println("--\t----") + + const gap = " " + const gapWidth = len(gap) + numDigits := len(fmt.Sprintf("%d", len(mds))) + termWidth, _, err := terminal.GetSize(int(os.Stdout.Fd())) + if err != nil { + return err + } + noteColWidth := termWidth - numDigits - gapWidth + + // Header + fmt.Println("ID" + gap + "Note") + fmt.Println(strings.Repeat("─", numDigits) + gap + strings.Repeat("─", noteColWidth)) + + // Body for _, md := range mds { - fmt.Printf("%d\t%s\n", md.ID, md.Note) + fmt.Printf("%"+fmt.Sprintf("%d", numDigits)+".d%s%s\n", + md.ID, + gap, + runewidth.Truncate(md.Note, noteColWidth, "…"), + ) } + return nil }, } From 45163be06faaeed5500541ffab4387d3bd85b273 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 20 Jul 2020 18:34:06 -0400 Subject: [PATCH 367/911] Refer to local files as "local" instead of "files" --- ui/stash.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index e42b4bf..65bc72b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -556,11 +556,7 @@ func stashHeaderView(m stashModel) string { // There are local and/or stashed files, so display counts. var s string if localItems > 0 { - var plural string - if localItems > 1 { - plural = "s" - } - s += fmt.Sprintf("%d File%s", localItems, plural) + s += fmt.Sprintf("%d Local", localItems) } if stashedItems > 0 { var divider string From d941957b92bc605dc654fdff8ffd26c4513dc8a7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 20 Jul 2020 19:22:12 -0400 Subject: [PATCH 368/911] Also exit the pager with left arrow, h and delete/backspace --- ui/pager.go | 6 ++---- ui/ui.go | 30 +++++++++++++++++++----------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index da11521..5bab71a 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -179,9 +179,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { } default: switch msg.String() { - case "q": - fallthrough - case "esc": + case "q", "esc": if m.state != pagerStateBrowse { m.state = pagerStateBrowse return m, nil @@ -194,7 +192,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { m.state = pagerStateSetNote if m.textInput.Value() == "" { - // Pre-populate with existing value + // Pre-populate note with existing value m.textInput.SetValue(m.currentDocument.Note) m.textInput.CursorEnd() } diff --git a/ui/ui.go b/ui/ui.go index b71b277..3a46fce 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -104,11 +104,22 @@ type model struct { localFileFinder chan gitcha.SearchResult } -func (m *model) unloadDocument() { +// unloadDocument unloads a document from the pager. Note that while this +// method alters the model we also need to send along any commands returned. +func (m *model) unloadDocument() []tea.Cmd { m.state = stateShowStash m.stash.state = stashStateReady m.pager.unload() m.pager.showHelp = false + + var batch []tea.Cmd + if m.pager.viewport.HighPerformanceRendering { + batch = append(batch, tea.ClearScrollArea) + } + if !m.stash.loaded.done() || m.stash.loadingFromNetwork { + batch = append(batch, spinner.Tick(m.stash.spinner)) + } + return batch } // INIT @@ -161,9 +172,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { - case "q": - fallthrough - case "esc": + case "q", "esc": var cmd tea.Cmd // Send these keys through to stash @@ -181,13 +190,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { var batch []tea.Cmd if m.pager.state == pagerStateBrowse { // If the user is just browing a document, exit the pager. - m.unloadDocument() - if m.pager.viewport.HighPerformanceRendering { - batch = append(batch, tea.ClearScrollArea) - } - if !m.stash.loaded.done() || m.stash.loadingFromNetwork { - batch = append(batch, spinner.Tick(m.stash.spinner)) - } + batch = m.unloadDocument() } else { // Otherwise send these key messages through to pager for // processing @@ -200,6 +203,11 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { return m, tea.Quit + case "left", "h", "delete": + if m.state == stateShowDocument && m.pager.state == pagerStateBrowse { + cmds = append(cmds, m.unloadDocument()...) + } + // Ctrl+C always quits no matter where in the application you are. case "ctrl+c": return m, tea.Quit From b31aba3c4ee86f5011575453f8f17cb08f271f0e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 20 Jul 2020 19:41:36 -0400 Subject: [PATCH 369/911] Fix case where pager commands could be lost --- ui/ui.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/ui.go b/ui/ui.go index 3a46fce..4337366 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -196,7 +196,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // processing newPagerModel, cmd := pagerUpdate(msg, m.pager) m.pager = newPagerModel - cmds = append(batch, cmd) + batch = append(batch, cmd) } return m, tea.Batch(batch...) } From fc2f05626ef58e76472a4c78cf75ed7f63fdc2f9 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 20 Jul 2020 21:29:03 -0400 Subject: [PATCH 370/911] Pressing q quits no matter where you are --- ui/pager.go | 9 ++++++--- ui/ui.go | 26 ++++++++++++++++++-------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 5bab71a..6e5366c 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -304,18 +304,21 @@ func pagerSetNoteView(b *strings.Builder, m pagerModel) { } func pagerHelpView(m pagerModel, width int) (s string) { - col1 := [2]string{ + col1 := [...]string{ "m set memo", - "esc/q back to stash", + "esc back to files", + "q quit", } if m.currentDocument != nil && m.currentDocument.markdownType != stashedMarkdown { col1[0] = col1[1] - col1[1] = "" + col1[1] = col1[2] + col1[2] = "" } s += "\n" s += "k/↑ up " + col1[0] + "\n" s += "j/↓ down " + col1[1] + "\n" + s += "j/↓ down " + col1[2] + "\n" s += "b/pgup page up\n" s += "f/pgdn page down\n" s += "u ½ page up\n" diff --git a/ui/ui.go b/ui/ui.go index 4337366..d47a817 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -187,18 +187,28 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // Special cases for the pager case stateShowDocument: - var batch []tea.Cmd - if m.pager.state == pagerStateBrowse { - // If the user is just browing a document, exit the pager. - batch = m.unloadDocument() - } else { - // Otherwise send these key messages through to pager for - // processing + switch m.pager.state { + + // If browsing, these keys have special cases + case pagerStateBrowse: + switch msg.String() { + case "q": + return m, tea.Quit + case "esc": + var batch []tea.Cmd + batch = m.unloadDocument() + return m, tea.Batch(batch...) + } + + // If setting a note send all keys straight through + case pagerStateSetNote: + var batch []tea.Cmd newPagerModel, cmd := pagerUpdate(msg, m.pager) m.pager = newPagerModel batch = append(batch, cmd) + return m, tea.Batch(batch...) } - return m, tea.Batch(batch...) + } return m, tea.Quit From f611b6e71f186577c3bf55578e29c69d685124bb Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 21 Jul 2020 14:55:00 -0400 Subject: [PATCH 371/911] Also use f and b to change pages in the file listing view --- ui/stash.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ui/stash.go b/ui/stash.go index 65bc72b..40ba330 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -364,6 +364,18 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.paginator = newPaginatorModel cmds = append(cmds, cmd) + // Extra paginator keystrokes + if key, ok := msg.(tea.KeyMsg); ok { + if key.Type == tea.KeyRune { + switch key.Rune { + case 'b': + m.paginator.PrevPage() + case 'f': + m.paginator.NextPage() + } + } + } + // Keep the index in bounds when paginating itemsOnPage := m.paginator.ItemsOnPage(len(m.markdowns)) if m.index > itemsOnPage-1 { From e0d6d7bea1d16423329859156c90bc62824c0c71 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 21 Jul 2020 17:38:37 -0400 Subject: [PATCH 372/911] Use the little green dot from the TUI when stashing on the CLI --- stash.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/stash.go b/stash.go index ffb3e87..cc87fb6 100644 --- a/stash.go +++ b/stash.go @@ -9,7 +9,9 @@ import ( "strings" "github.com/charmbracelet/charm" + "github.com/charmbracelet/charm/ui/common" "github.com/mattn/go-runewidth" + "github.com/muesli/termenv" "github.com/spf13/cobra" "golang.org/x/crypto/ssh/terminal" ) @@ -39,7 +41,8 @@ var ( if err != nil { return fmt.Errorf("error stashing markdown") } - fmt.Println("Stashed!") + dot := termenv.String("•").Foreground(common.Green.Color()).String() + fmt.Println(dot + " Stashed!") return nil }, } From 8903ad88cd85bb78e935fe4f5560d5777d4974e7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 21 Jul 2020 17:45:42 -0400 Subject: [PATCH 373/911] Update stash help to push the notion that q quits --- ui/stash.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 40ba330..caef982 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -643,7 +643,7 @@ func stashHelpView(m stashModel) string { if m.err != nil { h = append(h, []string{"!: errors"}...) } - h = append(h, []string{"esc: exit"}...) + h = append(h, []string{"q: quit"}...) } return common.HelpView(h...) } From a04ca3f61e47797ce91aa7a1d48832d08356b172 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 21 Jul 2020 17:52:16 -0400 Subject: [PATCH 374/911] Fix bug where pressing left to exit the pager would also page the stash --- ui/ui.go | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/ui.go b/ui/ui.go index d47a817..1d4e939 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -216,6 +216,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case "left", "h", "delete": if m.state == stateShowDocument && m.pager.state == pagerStateBrowse { cmds = append(cmds, m.unloadDocument()...) + return m, tea.Batch(cmds...) } // Ctrl+C always quits no matter where in the application you are. From 66dd3a74cb96ef61bec79fa091cb8024f54dbf4c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 21 Jul 2020 18:24:15 -0400 Subject: [PATCH 375/911] Bump bubbles to fix crash when deleting memo text --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4d8fdf4..4697c0b 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.4.1-0.20200720214615-5357dd61bdfc + github.com/charmbracelet/bubbles v0.4.2-0.20200721222218-10022c964cdf github.com/charmbracelet/bubbletea v0.10.1-0.20200720155027-2ee871862a49 github.com/charmbracelet/charm v0.5.2 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 diff --git a/go.sum b/go.sum index a996a2c..c21412c 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.4.0/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= -github.com/charmbracelet/bubbles v0.4.1-0.20200720214615-5357dd61bdfc h1:IUiJHofnt59zovLvfrR2QkFHKHfKbWrZzyPUVcs9rB4= -github.com/charmbracelet/bubbles v0.4.1-0.20200720214615-5357dd61bdfc/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= +github.com/charmbracelet/bubbles v0.4.2-0.20200721222218-10022c964cdf h1:0ewP/4HFss7umGhzZYXVkep/tVNuklJMFCrUBUQv/w4= +github.com/charmbracelet/bubbles v0.4.2-0.20200721222218-10022c964cdf/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.0/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.1-0.20200720155027-2ee871862a49 h1:cc2ntD1GuEeaXZ/rweyMZnHYbi3VYPkeGhvVpNJUYQo= From 71d6ab0476d3e7e73fd00333530ef77f7929d9a4 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 22 Jul 2020 08:08:22 +0200 Subject: [PATCH 376/911] Bump gitcha dependency --- go.mod | 2 +- go.sum | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4697c0b..24f03d7 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.2.1 - github.com/muesli/gitcha v0.0.0-20200720155539-ccc362df0fe6 + github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d github.com/muesli/termenv v0.6.0 github.com/spf13/cobra v0.0.7 diff --git a/go.sum b/go.sum index c21412c..3133656 100644 --- a/go.sum +++ b/go.sum @@ -37,6 +37,8 @@ github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5 github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denormal/go-gitignore v0.0.0-20180930084346-ae8ad1d07817 h1:0nsrg//Dc7xC74H/TZ5sYR8uk4UQRNjsw8zejqH5a4Q= +github.com/denormal/go-gitignore v0.0.0-20180930084346-ae8ad1d07817/go.mod h1:C/+sI4IFnEpCn6VQ3GIPEp+FrQnQw+YQP3+n+GdGq7o= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -93,8 +95,8 @@ github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/le github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/muesli/gitcha v0.0.0-20200720155539-ccc362df0fe6 h1:0oi9UPRBektS6Fuuu1SnROx++2FHahRWaeGQ+IfTdGU= -github.com/muesli/gitcha v0.0.0-20200720155539-ccc362df0fe6/go.mod h1:o3FpDWpvjmTm4Tzzrgq1ZhtYrplVPSpdgav7+YzaLLs= +github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446 h1:5I7/I/1aGJq6ChiTm7635O5O+kGbyMsdItLE7PJch7s= +github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446/go.mod h1:+Pq8IXso2OklLavHxYpH30LWgIc50BF5xr2ch56ZV4Q= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d h1:ok5jhmKQze1yERN73u46EZhUH4vgC1z4qfeFJ8iOwvg= github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= From 6b21789417430d392a43772cefb38ab620873ac9 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 22 Jul 2020 16:32:07 +0200 Subject: [PATCH 377/911] Ensure sorting is stable: type -> timestamp -> path/ID --- ui/stash.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index caef982..b671904 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -74,7 +74,17 @@ func (m markdownsByLocalFirst) Less(i, j int) bool { } // Both or neither are local files so sort by date descending - return m[i].CreatedAt.After(*m[j].CreatedAt) + if !m[i].CreatedAt.Equal(*m[j].CreatedAt) { + return m[i].CreatedAt.After(*m[j].CreatedAt) + } + + // If the timestamps also match, sort by ID/path + if iType != localMarkdown { + // non-local items have an ID + return m[i].ID > m[j].ID + } + + return strings.Compare(m[i].localPath, m[j].localPath) == -1 } type loadedState byte From a2fd25d0f0fc1001f8a429a2bcf7c2b8a09c6027 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 22 Jul 2020 12:47:59 -0400 Subject: [PATCH 378/911] Sort local items by filename rather than date --- ui/stash.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index b671904..494350c 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -73,18 +73,19 @@ func (m markdownsByLocalFirst) Less(i, j int) bool { return false } - // Both or neither are local files so sort by date descending + // If both are local files, sort by filename. Note that we should never + // hit equality here since two files can't have the same path. + if iType == localMarkdown && jType == localMarkdown { + return strings.Compare(m[i].localPath, m[j].localPath) == -1 + } + + // Neither are local files so sort by date descending if !m[i].CreatedAt.Equal(*m[j].CreatedAt) { return m[i].CreatedAt.After(*m[j].CreatedAt) } - // If the timestamps also match, sort by ID/path - if iType != localMarkdown { - // non-local items have an ID - return m[i].ID > m[j].ID - } - - return strings.Compare(m[i].localPath, m[j].localPath) == -1 + // If the timestamps also match, sort by ID. + return m[i].ID > m[j].ID } type loadedState byte From 7dbd264deb322a6c06da9d54550f08fb4ec1837a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 23 Jul 2020 12:49:45 -0400 Subject: [PATCH 379/911] Bump bubbletea and bubbles for paste support in notes --- go.mod | 6 +++--- go.sum | 13 ++++++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 24f03d7..2f0cd5a 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.4.2-0.20200721222218-10022c964cdf - github.com/charmbracelet/bubbletea v0.10.1-0.20200720155027-2ee871862a49 + github.com/charmbracelet/bubbles v0.5.0 + github.com/charmbracelet/bubbletea v0.10.2 github.com/charmbracelet/charm v0.5.2 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac @@ -16,5 +16,5 @@ require ( github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae + golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6 ) diff --git a/go.sum b/go.sum index 3133656..f745ddc 100644 --- a/go.sum +++ b/go.sum @@ -10,18 +10,20 @@ github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1p github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY= +github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.4.0/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= -github.com/charmbracelet/bubbles v0.4.2-0.20200721222218-10022c964cdf h1:0ewP/4HFss7umGhzZYXVkep/tVNuklJMFCrUBUQv/w4= -github.com/charmbracelet/bubbles v0.4.2-0.20200721222218-10022c964cdf/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= +github.com/charmbracelet/bubbles v0.5.0 h1:pCm4XRZLYTaQGmyByztTUfCMzp7Ks30+9BpXg1gK9zM= +github.com/charmbracelet/bubbles v0.5.0/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.0/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/bubbletea v0.10.1-0.20200720155027-2ee871862a49 h1:cc2ntD1GuEeaXZ/rweyMZnHYbi3VYPkeGhvVpNJUYQo= -github.com/charmbracelet/bubbletea v0.10.1-0.20200720155027-2ee871862a49/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= +github.com/charmbracelet/bubbletea v0.10.2 h1:He5Ybch9TiqErJH2B02JUNkPU36GnPwXCuxwASGZyn4= +github.com/charmbracelet/bubbletea v0.10.2/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/charm v0.5.2 h1:cgqc1LJuPwVTzZFD3CczgyxUC0oAkHSqnkUxIHUb+yc= github.com/charmbracelet/charm v0.5.2/go.mod h1:tpIHCBAc6qk1zl/uSuYMKDmKtEro7XJxe38P0tFyR54= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= @@ -184,8 +186,9 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6 h1:X9xIZ1YU8bLZA3l6gqDUHSFiD0GFI9S548h6C8nDtOY= +golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 89a794be7be670e37a8bac88bc0484e23d3c2eaa Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 24 Jul 2020 18:54:15 -0400 Subject: [PATCH 380/911] Bump charm lib dependency to get prod server settings --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 2f0cd5a..754e0e2 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.5.0 github.com/charmbracelet/bubbletea v0.10.2 - github.com/charmbracelet/charm v0.5.2 + github.com/charmbracelet/charm v0.5.3-0.20200724225223-612d5486c481 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 @@ -16,5 +16,5 @@ require ( github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6 + golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c ) diff --git a/go.sum b/go.sum index f745ddc..b280f71 100644 --- a/go.sum +++ b/go.sum @@ -24,8 +24,8 @@ github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h github.com/charmbracelet/bubbletea v0.10.0/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.2 h1:He5Ybch9TiqErJH2B02JUNkPU36GnPwXCuxwASGZyn4= github.com/charmbracelet/bubbletea v0.10.2/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/charm v0.5.2 h1:cgqc1LJuPwVTzZFD3CczgyxUC0oAkHSqnkUxIHUb+yc= -github.com/charmbracelet/charm v0.5.2/go.mod h1:tpIHCBAc6qk1zl/uSuYMKDmKtEro7XJxe38P0tFyR54= +github.com/charmbracelet/charm v0.5.3-0.20200724225223-612d5486c481 h1:i7d5E8PkxC22yw0fgUjParrzpbJYt+hav9u/rx8ZLcI= +github.com/charmbracelet/charm v0.5.3-0.20200724225223-612d5486c481/go.mod h1:tpIHCBAc6qk1zl/uSuYMKDmKtEro7XJxe38P0tFyR54= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06/go.mod h1:ECr5vYu2tKCePqAbZNUh94HiZDPMtbc9ggAy4n585JU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -187,8 +187,8 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6 h1:X9xIZ1YU8bLZA3l6gqDUHSFiD0GFI9S548h6C8nDtOY= -golang.org/x/sys v0.0.0-20200722175500-76b94024e4b6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c h1:UIcGWL6/wpCfyGuJnRFJRurA+yj8RrW7Q6x2YMCXt6c= +golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From d16c13f92949398fa2dab1c6cb8f9b883ebc7c21 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 27 Jul 2020 12:03:43 -0400 Subject: [PATCH 381/911] Disable mouse for now --- main.go | 1 - 1 file changed, 1 deletion(-) diff --git a/main.go b/main.go index b51ec1d..30cc5ca 100644 --- a/main.go +++ b/main.go @@ -187,7 +187,6 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { // Run Bubble Tea program p := ui.NewProgram(style, cfg) p.EnterAltScreen() - p.EnableMouseCellMotion() if err := p.Start(); err != nil { return err } From 6aadaf8a695d95ae88edc511de2d172c949802ac Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 27 Jul 2020 12:06:59 -0400 Subject: [PATCH 382/911] Remove stash list, get and delete commands --- main.go | 2 +- stash.go | 85 -------------------------------------------------------- 2 files changed, 1 insertion(+), 86 deletions(-) diff --git a/main.go b/main.go index 30cc5ca..3026dc9 100644 --- a/main.go +++ b/main.go @@ -296,5 +296,5 @@ func init() { // Stash stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") - rootCmd.AddCommand(stashCmd, stashListCmd, stashGetCmd, stashDeleteCmd) + rootCmd.AddCommand(stashCmd) } diff --git a/stash.go b/stash.go index cc87fb6..6c55050 100644 --- a/stash.go +++ b/stash.go @@ -5,15 +5,11 @@ import ( "io/ioutil" "log" "os" - "strconv" - "strings" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" - "github.com/mattn/go-runewidth" "github.com/muesli/termenv" "github.com/spf13/cobra" - "golang.org/x/crypto/ssh/terminal" ) var ( @@ -46,87 +42,6 @@ var ( return nil }, } - - stashListCmd = &cobra.Command{ - Use: "stash-list", - Hidden: false, - Short: "list your stashed markdowns", - Long: "", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - cc := initCharmClient() - mds, err := cc.GetStash(1) - if err != nil { - return fmt.Errorf("error getting stash: " + err.Error()) - } - - const gap = " " - const gapWidth = len(gap) - numDigits := len(fmt.Sprintf("%d", len(mds))) - termWidth, _, err := terminal.GetSize(int(os.Stdout.Fd())) - if err != nil { - return err - } - noteColWidth := termWidth - numDigits - gapWidth - - // Header - fmt.Println("ID" + gap + "Note") - fmt.Println(strings.Repeat("─", numDigits) + gap + strings.Repeat("─", noteColWidth)) - - // Body - for _, md := range mds { - fmt.Printf("%"+fmt.Sprintf("%d", numDigits)+".d%s%s\n", - md.ID, - gap, - runewidth.Truncate(md.Note, noteColWidth, "…"), - ) - } - - return nil - }, - } - - stashGetCmd = &cobra.Command{ - Use: "stash-get", - Hidden: false, - Short: "get a stashed markdown by id", - Long: "", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - id, err := strconv.Atoi(args[0]) - if err != nil { - return fmt.Errorf("invalid markdown id") - } - cc := initCharmClient() - md, err := cc.GetStashMarkdown(id) - if err != nil { - return fmt.Errorf("error getting markdown") - } - fmt.Println(md.Body) - return nil - }, - } - - stashDeleteCmd = &cobra.Command{ - Use: "stash-delete", - Hidden: false, - Short: "get a stashed markdown by id", - Long: "", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - id, err := strconv.Atoi(args[0]) - if err != nil { - return fmt.Errorf("invalid markdown id") - } - cc := initCharmClient() - err = cc.DeleteMarkdown(id) - if err != nil { - return fmt.Errorf("error deleting markdown") - } - fmt.Println("Deleted!") - return nil - }, - } ) func getCharmConfig() *charm.Config { From 25a5e6ee10473e692dab0b22b092cee10da83adf Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 27 Jul 2020 16:47:27 -0400 Subject: [PATCH 383/911] Bump Charm, Bubble Tea, and Termenv --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 754e0e2..44434d2 100644 --- a/go.mod +++ b/go.mod @@ -4,17 +4,17 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.5.0 - github.com/charmbracelet/bubbletea v0.10.2 - github.com/charmbracelet/charm v0.5.3-0.20200724225223-612d5486c481 + github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c + github.com/charmbracelet/charm v0.5.3-0.20200727203715-66ccdbff3ded github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.2.1 github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d - github.com/muesli/termenv v0.6.0 + github.com/muesli/termenv v0.7.0 github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c + golang.org/x/sys v0.0.0-20200727154430-2d971f7391a4 ) diff --git a/go.sum b/go.sum index b280f71..ddc2788 100644 --- a/go.sum +++ b/go.sum @@ -22,10 +22,10 @@ github.com/charmbracelet/bubbles v0.5.0 h1:pCm4XRZLYTaQGmyByztTUfCMzp7Ks30+9BpXg github.com/charmbracelet/bubbles v0.5.0/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.0/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/bubbletea v0.10.2 h1:He5Ybch9TiqErJH2B02JUNkPU36GnPwXCuxwASGZyn4= -github.com/charmbracelet/bubbletea v0.10.2/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/charm v0.5.3-0.20200724225223-612d5486c481 h1:i7d5E8PkxC22yw0fgUjParrzpbJYt+hav9u/rx8ZLcI= -github.com/charmbracelet/charm v0.5.3-0.20200724225223-612d5486c481/go.mod h1:tpIHCBAc6qk1zl/uSuYMKDmKtEro7XJxe38P0tFyR54= +github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c h1:nb4KGAydLS6q3277+IqZLCGFNO2tdwrSKZ75AXAnnUI= +github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= +github.com/charmbracelet/charm v0.5.3-0.20200727203715-66ccdbff3ded h1:UDYj9pmqhqwYb+IZiil1NrSrTvux/4JQLS/hxJAm570= +github.com/charmbracelet/charm v0.5.3-0.20200727203715-66ccdbff3ded/go.mod h1:tpIHCBAc6qk1zl/uSuYMKDmKtEro7XJxe38P0tFyR54= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06/go.mod h1:ECr5vYu2tKCePqAbZNUh94HiZDPMtbc9ggAy4n585JU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -104,8 +104,8 @@ github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d h1:ok5jhmKQze1yERN github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= -github.com/muesli/termenv v0.6.0 h1:zxvzTBmo4ZcxhNGGWeMz+Tttm51eF5bmPjfy4MCRYlk= -github.com/muesli/termenv v0.6.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= +github.com/muesli/termenv v0.7.0 h1:KcLfgg/KICGxOxNr+P9gmkrJ5azxOm3WzkfXMePGTq4= +github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= @@ -187,8 +187,8 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c h1:UIcGWL6/wpCfyGuJnRFJRurA+yj8RrW7Q6x2YMCXt6c= -golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200727154430-2d971f7391a4 h1:gtF+PUC1CD1a9ocwQHbVNXuTp6RQsAYt6tpi6zjT81Y= +golang.org/x/sys v0.0.0-20200727154430-2d971f7391a4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From b831afc966128e8e2c011ac19119ed85950e795a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 28 Jul 2020 16:21:36 -0400 Subject: [PATCH 384/911] Don't say we haven't found anything until we're done searching --- ui/stash.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 494350c..8e7d0f9 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -572,7 +572,7 @@ func stashHeaderView(m stashModel) string { stashedItems := m.countMarkdowns(stashedMarkdown) // Loading's finished and all we have is news. - if localItems == 0 && stashedItems == 0 { + if !loading && localItems == 0 && stashedItems == 0 { return common.Subtle("No local or stashed markdown files found.") } From 8471c52fd7dd1260ad3229d9bc6505f1ac07b83b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 28 Jul 2020 16:41:44 -0400 Subject: [PATCH 385/911] Keep the stash help view from wrapping in very narrow windows --- ui/stash.go | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 8e7d0f9..3d6026b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -31,6 +31,11 @@ const ( setNotePromptText = "Memo: " ) +var ( + stashHelpItemStyle func(string) string = te.Style{}.Foreground(common.NewColorPair("#5C5C5C", "#9B9B9B").Color()).Styled + stashHelpDivider string = te.String(" • ").Foreground(common.NewColorPair("#3C3C3C", "#DDDADA").Color()).String() +) + // MSG type fetchedMarkdownMsg *markdown @@ -656,7 +661,37 @@ func stashHelpView(m stashModel) string { } h = append(h, []string{"q: quit"}...) } - return common.HelpView(h...) + return stashHelpViewBuilder(m.terminalWidth, h...) +} + +// stashHelpViewBuilder builds the help view text, truncating it if it would +// otherwise wrap to two lines. +func stashHelpViewBuilder(windowWidth int, sections ...string) string { + const truncationWidth = 1 // width of "…" + var ( + s string + next string + maxWidth = windowWidth - stashViewHorizontalPadding - truncationWidth + ) + + if len(sections) == 0 { + return s + } + for i := 0; i < len(sections); i++ { + + next = stashHelpItemStyle(sections[i]) + if i < len(sections)-1 { + next += stashHelpDivider + } + + if ansi.PrintableRuneWidth(s)+ansi.PrintableRuneWidth(next) >= maxWidth { + s += common.Subtle("…") + break + } + + s += next + } + return s } // CMD From 60cee4a9a1c84ff3ea11d910b9520ca5849888c1 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 28 Jul 2020 16:46:23 -0400 Subject: [PATCH 386/911] u/d also pages back/forth in the the file listing --- ui/stash.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 3d6026b..4d20d8d 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -384,9 +384,9 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { if key, ok := msg.(tea.KeyMsg); ok { if key.Type == tea.KeyRune { switch key.Rune { - case 'b': + case 'b', 'u': m.paginator.PrevPage() - case 'f': + case 'f', 'd': m.paginator.NextPage() } } From a5febb92ffe106a44f9d3ce8f80c2756af5b3653 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 29 Jul 2020 16:58:33 +0200 Subject: [PATCH 387/911] Disable Windows & FreeBSD builds temporarily --- .goreleaser.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 0b27e47..ad36354 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -10,8 +10,8 @@ builds: ldflags: -s -w -X main.Version={{ .Version }} -X main.CommitSHA={{ .Commit }} goos: - linux - - freebsd - - windows + #- freebsd + #- windows goarch: - amd64 - arm64 From 844cdcdaafcec4d20c164a83ce6163fb111c1a82 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 29 Jul 2020 12:32:18 -0400 Subject: [PATCH 388/911] Pull out Windows language from README for now --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 95e1694..667dda6 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,9 @@ nix-env -iA nixpkgs.glow pkg install glow ``` -Or download a binary from the [releases][] page. Windows, MacOS, and Linux -(including ARM) binaries are available, as well as Debian and RPM packages. +Or download a binary from the [releases][] page. MacOS, Linux, FreeBSD +binaries are available, as well as Debian and RPM packages. ARM builds are also +available for Linux and FreeBSD. Or just use `go get`: From accb5fb7d51774a4d28629deca9fe9a70769838a Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Wed, 29 Jul 2020 11:49:36 -0500 Subject: [PATCH 389/911] Stash documentation draft --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 667dda6..2fa4433 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,15 @@ Render markdown on the CLI, with _pizzazz_! ![Glow example output](https://github.com/charmbracelet/glow/raw/master/example.png) +## What is it? + +Glow is a terminal based markdown reader designed from the ground up to bring +out the beauty of the CLI. + +Use it to quickly discover markdown files in a folder (it will automatically +search subdirectories for you), read documentation directly on the command line +and stash markdown files to your own private collection in the Charm Cloud so +you can read them anywhere. ## Installation @@ -68,6 +77,19 @@ glow https://host.tld/file.md When `glow` is started without a markdown source, it will try to find a `README.md` or `README` file in the current working directory. +### Stashing + +Glow works with the Charm Cloud to allow you to store any markdown file in your +own private collection. When you run: + +`glow stash README.md` + +You'll add that markdown file to your stash. Running `glow` without arguments +will let you browse through all your stashed documents. This is a great way to +keep track of documentation that you need to reference. + +Stashing is private and your stash will not be exposed publicly. + ### Word Wrapping The `-w` flag lets you set a maximum width at which the output will be wrapped: From d5045fa4db85d2adef3f4103dc5aa23e59712aff Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 29 Jul 2020 17:09:38 -0400 Subject: [PATCH 390/911] Remove windows from CI for now --- .github/workflows/go.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index e3e092d..69e8423 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -5,7 +5,7 @@ jobs: strategy: matrix: go-version: [1.13.x, 1.14.x] - platform: [ubuntu-latest, macos-latest, windows-latest] + platform: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.platform }} env: GO111MODULE: "on" From 956fc9ec5794749e7c76634ed9bbeebf6714594d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 7 Aug 2020 11:18:25 -0400 Subject: [PATCH 391/911] Bump dependencies --- go.mod | 10 +++++----- go.sum | 22 ++++++++++++---------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 44434d2..45c94e5 100644 --- a/go.mod +++ b/go.mod @@ -3,18 +3,18 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.5.0 + github.com/charmbracelet/bubbles v0.5.1 github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c - github.com/charmbracelet/charm v0.5.3-0.20200727203715-66ccdbff3ded + github.com/charmbracelet/charm v0.5.3-0.20200804221332-0d6911bec999 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 - github.com/meowgorithm/babyenv v1.2.1 + github.com/meowgorithm/babyenv v1.3.0 github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d github.com/muesli/termenv v0.7.0 github.com/spf13/cobra v0.0.7 - golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 + golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200727154430-2d971f7391a4 + golang.org/x/sys v0.0.0-20200806125547-5acd03effb82 ) diff --git a/go.sum b/go.sum index ddc2788..f1ca657 100644 --- a/go.sum +++ b/go.sum @@ -17,15 +17,14 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/bubbles v0.4.0/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= -github.com/charmbracelet/bubbles v0.5.0 h1:pCm4XRZLYTaQGmyByztTUfCMzp7Ks30+9BpXg1gK9zM= -github.com/charmbracelet/bubbles v0.5.0/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= +github.com/charmbracelet/bubbles v0.5.1 h1:41u1Nl1qQra1otd8T9MEQMpis9+f3MRmxVd9YnmS/kQ= +github.com/charmbracelet/bubbles v0.5.1/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/bubbletea v0.10.0/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= +github.com/charmbracelet/bubbletea v0.10.2/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c h1:nb4KGAydLS6q3277+IqZLCGFNO2tdwrSKZ75AXAnnUI= github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/charm v0.5.3-0.20200727203715-66ccdbff3ded h1:UDYj9pmqhqwYb+IZiil1NrSrTvux/4JQLS/hxJAm570= -github.com/charmbracelet/charm v0.5.3-0.20200727203715-66ccdbff3ded/go.mod h1:tpIHCBAc6qk1zl/uSuYMKDmKtEro7XJxe38P0tFyR54= +github.com/charmbracelet/charm v0.5.3-0.20200804221332-0d6911bec999 h1:A7QpVVwsdTHJzYptFEOCgEIHw0wSc+v5gk43XtbNJ5w= +github.com/charmbracelet/charm v0.5.3-0.20200804221332-0d6911bec999/go.mod h1:oVGSjOFSAP20xua6zWXn6F1WC0cf5UYvZAYfgi1T/h0= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06/go.mod h1:ECr5vYu2tKCePqAbZNUh94HiZDPMtbc9ggAy4n585JU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -90,8 +89,9 @@ github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/meowgorithm/babyenv v1.2.1 h1:DyASQz69kr5Zq6Z/euCb6/+zdwoze/xrt4w9PteaUOM= github.com/meowgorithm/babyenv v1.2.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= +github.com/meowgorithm/babyenv v1.3.0 h1:klb7ugoZt0/Xlqkd5kLxM7eLZX8waiwxHZWW5nfEZ0Q= +github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -159,8 +159,9 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -187,8 +188,9 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200727154430-2d971f7391a4 h1:gtF+PUC1CD1a9ocwQHbVNXuTp6RQsAYt6tpi6zjT81Y= -golang.org/x/sys v0.0.0-20200727154430-2d971f7391a4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200806125547-5acd03effb82 h1:6cBnXxYO+CiRVrChvCosSv7magqTPbyAgz1M8iOv5wM= +golang.org/x/sys v0.0.0-20200806125547-5acd03effb82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From fa7c8f09f93e33fc5421ba3458045b2748986772 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 7 Aug 2020 12:34:48 -0400 Subject: [PATCH 392/911] Respect -i/--identity flag in the TUI --- go.mod | 2 +- go.sum | 4 ++-- main.go | 7 +++++-- ui/ui.go | 54 ++++++++++++++++++++++++++++++++---------------------- 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index 45c94e5..5270a04 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.5.1 github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c - github.com/charmbracelet/charm v0.5.3-0.20200804221332-0d6911bec999 + github.com/charmbracelet/charm v0.5.3-0.20200807155853-9fd04eeb7cae github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 diff --git a/go.sum b/go.sum index f1ca657..616f983 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h github.com/charmbracelet/bubbletea v0.10.2/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c h1:nb4KGAydLS6q3277+IqZLCGFNO2tdwrSKZ75AXAnnUI= github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/charm v0.5.3-0.20200804221332-0d6911bec999 h1:A7QpVVwsdTHJzYptFEOCgEIHw0wSc+v5gk43XtbNJ5w= -github.com/charmbracelet/charm v0.5.3-0.20200804221332-0d6911bec999/go.mod h1:oVGSjOFSAP20xua6zWXn6F1WC0cf5UYvZAYfgi1T/h0= +github.com/charmbracelet/charm v0.5.3-0.20200807155853-9fd04eeb7cae h1:ADpWgyN9GapfrQ50tSEWty//z76XDQ8i4lhlsn0i1eY= +github.com/charmbracelet/charm v0.5.3-0.20200807155853-9fd04eeb7cae/go.mod h1:oVGSjOFSAP20xua6zWXn6F1WC0cf5UYvZAYfgi1T/h0= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06/go.mod h1:ECr5vYu2tKCePqAbZNUh94HiZDPMtbc9ggAy4n585JU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= diff --git a/main.go b/main.go index 3026dc9..aaf9692 100644 --- a/main.go +++ b/main.go @@ -170,11 +170,14 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { if arg == "" { // Read environment to get debugging stuff - var cfg ui.UIConfig + var cfg ui.Config if err := babyenv.Parse(&cfg); err != nil { return fmt.Errorf("error parsing config: %v", err) } + // Config from flags + cfg.IdentityFile = identityFile + // Log to file, if set if cfg.Logfile != "" { f, err := tea.LogToFile(cfg.Logfile, "glow") @@ -292,7 +295,7 @@ func init() { // For network-related operations, namely stashing and the TUI rootCmd.PersistentFlags().StringVarP(&identityFile, "identity", "i", "", "path to identity file (that is, an ssh private key)") - rootCmd.PersistentFlags().BoolVarP(&forceKey, "force-key", "f", false, "for the use of the SSH key on disk (that is, ignore ssh-agent)") + rootCmd.PersistentFlags().BoolVarP(&forceKey, "force-key", "f", false, "force the use of the SSH key on disk (that is, ignore ssh-agent)") // Stash stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") diff --git a/ui/ui.go b/ui/ui.go index 1d4e939..d10f645 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -19,28 +19,30 @@ const ( noteCharacterLimit = 256 // should match server ) -// UIConfig contains flags for debugging the TUI. -type UIConfig struct { +// Config contains configuration specified to the TUI +type Config struct { + IdentityFile string + + // For debugging the UI Logfile string `env:"GLOW_UI_LOGFILE"` HighPerformancePager bool `env:"GLOW_UI_HIGH_PERFORMANCE_PAGER" default:"true"` GlamourEnabled bool `env:"GLOW_UI_ENABLE_GLAMOUR" default:"true"` } var ( - config UIConfig + config Config glowLogoTextColor = common.Color("#ECFD65") ) // NewProgram returns a new Tea program -func NewProgram(style string, cfg UIConfig) *tea.Program { - config = cfg - if config.Logfile != "" { +func NewProgram(style string, cfg Config) *tea.Program { + if cfg.Logfile != "" { log.Println("-- Starting Glow ----------------") log.Printf("High performance pager: %v", cfg.HighPerformancePager) log.Printf("Glamour rendering: %v", cfg.GlamourEnabled) log.Println("Bubble Tea now initializing...") } - return tea.NewProgram(initialize(style), update, view) + return tea.NewProgram(initialize(cfg, style), update, view) } // MESSAGES @@ -88,6 +90,7 @@ const ( ) type model struct { + cfg Config cc *charm.Client user *charm.User keygenState keygenState @@ -124,7 +127,7 @@ func (m *model) unloadDocument() []tea.Cmd { // INIT -func initialize(style string) func() (tea.Model, tea.Cmd) { +func initialize(cfg Config, style string) func() (tea.Model, tea.Cmd) { return func() (tea.Model, tea.Cmd) { if style == "auto" { dbg := te.HasDarkBackground() @@ -136,6 +139,7 @@ func initialize(style string) func() (tea.Model, tea.Cmd) { } m := model{ + cfg: cfg, stash: newStashModel(), pager: newPagerModel(style), state: stateShowStash, @@ -144,7 +148,7 @@ func initialize(style string) func() (tea.Model, tea.Cmd) { return m, tea.Batch( findLocalFiles, - newCharmClient, + newCharmClient(&cfg.IdentityFile), spinner.Tick(m.stash.spinner), ) } @@ -279,7 +283,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case keygenSuccessMsg: // The keygen's done, so let's try initializing the charm client again m.keygenState = keygenFinished - cmds = append(cmds, newCharmClient) + cmds = append(cmds, newCharmClient(nil)) case newCharmClientMsg: m.cc = msg @@ -395,20 +399,26 @@ func findNextLocalFile(m model) tea.Cmd { } } -func newCharmClient() tea.Msg { - cfg, err := charm.ConfigFromEnv() - if err != nil { - return errMsg(err) - } +func newCharmClient(identityFile *string) tea.Cmd { + return func() tea.Msg { + cfg, err := charm.ConfigFromEnv() + if err != nil { + return errMsg(err) + } - cc, err := charm.NewClient(cfg) - if err == charm.ErrMissingSSHAuth { - return sshAuthErrMsg{} - } else if err != nil { - return errMsg(err) - } + if identityFile != nil { + cfg.SSHKeyPath = *identityFile + } - return newCharmClientMsg(cc) + cc, err := charm.NewClient(cfg) + if err == charm.ErrMissingSSHAuth { + return sshAuthErrMsg{} + } else if err != nil { + return errMsg(err) + } + + return newCharmClientMsg(cc) + } } func loadStash(m stashModel) tea.Cmd { From 428a31594782331e0fd023d9dc55559d824eabd1 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 7 Aug 2020 14:05:05 -0400 Subject: [PATCH 393/911] Restore Glamour rendering, performance pager, and debug logging I accidentally hosed all of these features in the last revision. --- ui/ui.go | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/ui.go b/ui/ui.go index d10f645..fcdd1a9 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -42,6 +42,7 @@ func NewProgram(style string, cfg Config) *tea.Program { log.Printf("Glamour rendering: %v", cfg.GlamourEnabled) log.Println("Bubble Tea now initializing...") } + config = cfg return tea.NewProgram(initialize(cfg, style), update, view) } From bf683538f8474bbc35cc24ac1e488bef63d248ad Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sun, 9 Aug 2020 10:37:37 -0400 Subject: [PATCH 394/911] Bump charm dependency and update keygen import --- go.mod | 4 ++-- go.sum | 8 ++++---- ui/ui.go | 3 ++- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 5270a04..6742fea 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.5.1 github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c - github.com/charmbracelet/charm v0.5.3-0.20200807155853-9fd04eeb7cae + github.com/charmbracelet/charm v0.5.3-0.20200809141941-213d1ca4b7ef github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 @@ -16,5 +16,5 @@ require ( github.com/spf13/cobra v0.0.7 golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200806125547-5acd03effb82 + golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9 ) diff --git a/go.sum b/go.sum index 616f983..8908c1f 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h github.com/charmbracelet/bubbletea v0.10.2/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c h1:nb4KGAydLS6q3277+IqZLCGFNO2tdwrSKZ75AXAnnUI= github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/charm v0.5.3-0.20200807155853-9fd04eeb7cae h1:ADpWgyN9GapfrQ50tSEWty//z76XDQ8i4lhlsn0i1eY= -github.com/charmbracelet/charm v0.5.3-0.20200807155853-9fd04eeb7cae/go.mod h1:oVGSjOFSAP20xua6zWXn6F1WC0cf5UYvZAYfgi1T/h0= +github.com/charmbracelet/charm v0.5.3-0.20200809141941-213d1ca4b7ef h1:KU4A4oI4BOz7O/Klwubl8HhPv4jKir3IfSqTnNo7OVw= +github.com/charmbracelet/charm v0.5.3-0.20200809141941-213d1ca4b7ef/go.mod h1:oVGSjOFSAP20xua6zWXn6F1WC0cf5UYvZAYfgi1T/h0= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06/go.mod h1:ECr5vYu2tKCePqAbZNUh94HiZDPMtbc9ggAy4n585JU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -189,8 +189,8 @@ golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200806125547-5acd03effb82 h1:6cBnXxYO+CiRVrChvCosSv7magqTPbyAgz1M8iOv5wM= -golang.org/x/sys v0.0.0-20200806125547-5acd03effb82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9 h1:yi1hN8dcqI9l8klZfy4B8mJvFmmAxJEePIQQFNSd7Cs= +golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/ui/ui.go b/ui/ui.go index fcdd1a9..a94cb67 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -10,6 +10,7 @@ import ( "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" + "github.com/charmbracelet/charm/keygen" "github.com/charmbracelet/charm/ui/common" "github.com/muesli/gitcha" te "github.com/muesli/termenv" @@ -443,7 +444,7 @@ func loadNews(m stashModel) tea.Cmd { } func generateSSHKeys() tea.Msg { - _, err := charm.NewSSHKeyPair() + _, err := keygen.NewSSHKeyPair() if err != nil { return keygenFailedMsg{} } From 2c3c5a8c87ab86962e9a695aa4da7ef36f55204f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 13 Aug 2020 12:32:48 -0400 Subject: [PATCH 395/911] Replace commented-out code about stash-related pagination with a note --- ui/stash.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 4d20d8d..cb4a853 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -526,11 +526,9 @@ func stashView(m stashModel) string { pagination = common.Subtle(paginator.View(m.paginator)) } - /* - if !m.stashFullyLoaded { - pagination += common.Subtle(" ···") - } - */ + // We could also look at m.stashFullyLoaded and add an indicator + // showing that we don't actually know how many more pages there + // are. } s += fmt.Sprintf( From 2a3fa6139c817e910f5c6777938a32c098017e59 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 13 Aug 2020 12:51:53 -0400 Subject: [PATCH 396/911] Simplify messaging in (rare) state where there's absolutely nothing to show --- ui/stash.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index cb4a853..6bb4795 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -18,7 +18,6 @@ import ( "github.com/dustin/go-humanize" runewidth "github.com/mattn/go-runewidth" "github.com/muesli/reflow/ansi" - "github.com/muesli/reflow/wordwrap" te "github.com/muesli/termenv" ) @@ -562,15 +561,6 @@ func stashHeaderView(m stashModel) string { return common.Subtle("Looking for stuff...") } - // Loading's finished. We didn't find anything, the stash is empty and - // there's no news. - if !loading && noMarkdowns { - s := "Nothing found. Try running " + common.Code("glow") + - " in a directory with markdown files, or stashing a file with " + - common.Code("glow stash") + ". For more, see " + common.Code("glow help") + "." - return wordwrap.String(s, stashIndent) - } - localItems := m.countMarkdowns(localMarkdown) stashedItems := m.countMarkdowns(stashedMarkdown) From 2ed9e71533b0f16c0ab8f6a8b66f7ee33f115ff8 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 13 Aug 2020 15:07:37 -0400 Subject: [PATCH 397/911] Bump Charm library + tiny associated code update --- go.mod | 6 +++--- go.sum | 20 +++++++++++++------- ui/stash.go | 2 +- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 6742fea..5d61bcb 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.5.1 github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c - github.com/charmbracelet/charm v0.5.3-0.20200809141941-213d1ca4b7ef + github.com/charmbracelet/charm v0.5.3-0.20200813190313-3e6a9e216ba7 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 @@ -13,8 +13,8 @@ require ( github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d github.com/muesli/termenv v0.7.0 - github.com/spf13/cobra v0.0.7 + github.com/spf13/cobra v1.0.0 golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9 + golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d ) diff --git a/go.sum b/go.sum index 8908c1f..a125bc7 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h github.com/charmbracelet/bubbletea v0.10.2/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c h1:nb4KGAydLS6q3277+IqZLCGFNO2tdwrSKZ75AXAnnUI= github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/charm v0.5.3-0.20200809141941-213d1ca4b7ef h1:KU4A4oI4BOz7O/Klwubl8HhPv4jKir3IfSqTnNo7OVw= -github.com/charmbracelet/charm v0.5.3-0.20200809141941-213d1ca4b7ef/go.mod h1:oVGSjOFSAP20xua6zWXn6F1WC0cf5UYvZAYfgi1T/h0= +github.com/charmbracelet/charm v0.5.3-0.20200813190313-3e6a9e216ba7 h1:MsPl7dADOuL0T7ApzrTqOp/RyHaqLuq3/bbask83AaM= +github.com/charmbracelet/charm v0.5.3-0.20200813190313-3e6a9e216ba7/go.mod h1:n9G/E8vzXiAqGqkwrvw41dHmjGrTYPLKc92wKYehCv0= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06/go.mod h1:ECr5vYu2tKCePqAbZNUh94HiZDPMtbc9ggAy4n585JU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -64,6 +64,8 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f h1:5CjVwnuUcp5adK4gmY6i72gpVFVnZDP2h5TmPScB6u4= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= @@ -94,6 +96,8 @@ github.com/meowgorithm/babyenv v1.3.0 h1:klb7ugoZt0/Xlqkd5kLxM7eLZX8waiwxHZWW5nf github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a h1:eU8j/ClY2Ty3qdHnn0TyW3ivFoPC/0F1gQZz8yTxbbE= +github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -102,6 +106,8 @@ github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446/go.mod h1:+Pq8IXso2O github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d h1:ok5jhmKQze1yERN73u46EZhUH4vgC1z4qfeFJ8iOwvg= github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= +github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= +github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.7.0 h1:KcLfgg/KICGxOxNr+P9gmkrJ5azxOm3WzkfXMePGTq4= @@ -135,8 +141,8 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.7 h1:FfTH+vuMXOas8jmfb5/M7dzEYx7LpcLb7a0LPe34uOU= -github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -188,9 +194,9 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9 h1:yi1hN8dcqI9l8klZfy4B8mJvFmmAxJEePIQQFNSd7Cs= -golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d h1:QQrM/CCYEzTs91GZylDCQjGHudbPTxF/1fvXdVh5lMo= +golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/ui/stash.go b/ui/stash.go index 6bb4795..87dba57 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -202,7 +202,7 @@ func (m stashModel) countMarkdowns(t markdownType) (found int) { func newStashModel() stashModel { s := spinner.NewModel() s.Frames = spinner.Line - s.ForegroundColor = common.SpinnerColor + s.ForegroundColor = common.SpinnerColor.String() p := paginator.NewModel() p.Type = paginator.Dots From 3d5d203217217c71324b8e7efbc8fbde2afc2059 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 13 Aug 2020 15:26:34 -0400 Subject: [PATCH 398/911] Remove unused variable --- ui/ui.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index a94cb67..e17bf75 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -347,16 +347,12 @@ func view(mdl tea.Model) string { return errorView(m.fatalErr, true) } - var s string - switch m.state { - case stateShowStash: - return stashView(m.stash) case stateShowDocument: return pagerView(m.pager) + default: + return stashView(m.stash) } - - return "\n" + indent(s, 2) } func errorView(err error, fatal bool) string { From c55bb237441b7fa08fcd56f8c7f5a3646bafc8e5 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 13 Aug 2020 15:37:53 -0400 Subject: [PATCH 399/911] Minor comments and cleanup in the TUI --- ui/pager.go | 2 +- ui/stash.go | 16 +++++++--------- ui/ui.go | 20 +++++++++----------- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 6e5366c..4aa518e 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -85,7 +85,7 @@ type pagerModel struct { showHelp bool // Current document being rendered, sans-glamour rendering. We cache - // this here so we can re-render it on resize. + // it here so we can re-render it on resize. currentDocument *markdown } diff --git a/ui/stash.go b/ui/stash.go index 87dba57..f27b571 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -101,9 +101,7 @@ const ( ) func (s loadedState) done() bool { - return s&loadedStash != 0 && - s&loadedNews != 0 && - s&loadedLocalFiles != 0 + return s&loadedStash != 0 && s&loadedNews != 0 && s&loadedLocalFiles != 0 } type stashState int @@ -176,7 +174,7 @@ func (m stashModel) selectedMarkdown() *markdown { return m.markdowns[i] } -// addDocuments adds markdown documents to the model +// adds markdown documents to the model func (m *stashModel) addMarkdowns(mds ...*markdown) { if len(mds) > 0 { m.markdowns = append(m.markdowns, mds...) @@ -185,6 +183,7 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) { } } +// return the number of markdown documents of a given type func (m stashModel) countMarkdowns(t markdownType) (found int) { if len(m.markdowns) == 0 { return @@ -363,6 +362,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.state = stashStatePromptDelete } + // Show errors case "!": if m.err != nil && m.state == stashStateReady { m.state = stashStateShowingError @@ -484,9 +484,6 @@ func stashView(m stashModel) string { case stashStateLoadingDocument: s += " " + spinner.View(m.spinner) + " Loading document..." case stashStateReady, stashStateSettingNote, stashStatePromptDelete: - var ( - header string - ) loadingIndicator := "" if !m.loaded.done() || m.loadingFromNetwork { @@ -501,6 +498,7 @@ func stashView(m stashModel) string { blankLines = strings.Repeat("\n", numBlankLines) } + var header string switch m.state { case stashStatePromptDelete: header = redFg("Delete this item? ") + faintRedFg("(y/N)") @@ -652,8 +650,8 @@ func stashHelpView(m stashModel) string { return stashHelpViewBuilder(m.terminalWidth, h...) } -// stashHelpViewBuilder builds the help view text, truncating it if it would -// otherwise wrap to two lines. +// builds the help view from various sections pieces, truncating it if the view +// would otherwise wrap to two lines. func stashHelpViewBuilder(windowWidth int, sections ...string) string { const truncationWidth = 1 // width of "…" var ( diff --git a/ui/ui.go b/ui/ui.go index e17bf75..7d20d8b 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -16,11 +16,14 @@ import ( te "github.com/muesli/termenv" ) -const ( - noteCharacterLimit = 256 // should match server +const noteCharacterLimit = 256 // should match server + +var ( + config Config + glowLogoTextColor = common.Color("#ECFD65") ) -// Config contains configuration specified to the TUI +// Config contains configuration specified to the TUI. type Config struct { IdentityFile string @@ -30,12 +33,7 @@ type Config struct { GlamourEnabled bool `env:"GLOW_UI_ENABLE_GLAMOUR" default:"true"` } -var ( - config Config - glowLogoTextColor = common.Color("#ECFD65") -) - -// NewProgram returns a new Tea program +// NewProgram returns a new Tea program. func NewProgram(style string, cfg Config) *tea.Program { if cfg.Logfile != "" { log.Println("-- Starting Glow ----------------") @@ -423,7 +421,7 @@ func loadStash(m stashModel) tea.Cmd { return func() tea.Msg { stash, err := m.cc.GetStash(m.page) if err != nil { - return stashLoadErrMsg{err: err} + return stashLoadErrMsg{err} } return gotStashMsg(stash) } @@ -433,7 +431,7 @@ func loadNews(m stashModel) tea.Cmd { return func() tea.Msg { news, err := m.cc.GetNews(1) // just fetch the first page if err != nil { - return newsLoadErrMsg{err: err} + return newsLoadErrMsg{err} } return gotNewsMsg(news) } From 994b85b9bd6a7052ab790da274d186d9f4ab7483 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 13 Aug 2020 15:47:37 -0400 Subject: [PATCH 400/911] Add Go 1.15.x to build matrix --- .github/workflows/go.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 69e8423..1cceb0b 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -4,7 +4,7 @@ jobs: test: strategy: matrix: - go-version: [1.13.x, 1.14.x] + go-version: [1.13.x, 1.14.x, 1.15.x] platform: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.platform }} env: @@ -40,4 +40,4 @@ jobs: go test -race -covermode atomic -coverprofile=profile.cov ./... GO111MODULE=off go get github.com/mattn/goveralls $(go env GOPATH)/bin/goveralls -coverprofile=profile.cov -service=github - if: matrix.go-version == '1.14.x' && matrix.platform == 'ubuntu-latest' + if: matrix.go-version == '1.15.x' && matrix.platform == 'ubuntu-latest' From ad13b0738259ee9d70abbc5515badc564d87a35f Mon Sep 17 00:00:00 2001 From: Toby Padilla Date: Sat, 15 Aug 2020 13:18:45 -0500 Subject: [PATCH 401/911] Updated charm version --- go.mod | 2 +- go.sum | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 5d61bcb..dc8545d 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.5.1 github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c - github.com/charmbracelet/charm v0.5.3-0.20200813190313-3e6a9e216ba7 + github.com/charmbracelet/charm v0.6.0 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 diff --git a/go.sum b/go.sum index a125bc7..a3a8559 100644 --- a/go.sum +++ b/go.sum @@ -17,14 +17,20 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/charmbracelet/bubbles v0.4.0/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= github.com/charmbracelet/bubbles v0.5.1 h1:41u1Nl1qQra1otd8T9MEQMpis9+f3MRmxVd9YnmS/kQ= github.com/charmbracelet/bubbles v0.5.1/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= +github.com/charmbracelet/bubbletea v0.10.0/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.2/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c h1:nb4KGAydLS6q3277+IqZLCGFNO2tdwrSKZ75AXAnnUI= github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= +github.com/charmbracelet/charm v0.5.2 h1:cgqc1LJuPwVTzZFD3CczgyxUC0oAkHSqnkUxIHUb+yc= +github.com/charmbracelet/charm v0.5.2/go.mod h1:tpIHCBAc6qk1zl/uSuYMKDmKtEro7XJxe38P0tFyR54= github.com/charmbracelet/charm v0.5.3-0.20200813190313-3e6a9e216ba7 h1:MsPl7dADOuL0T7ApzrTqOp/RyHaqLuq3/bbask83AaM= github.com/charmbracelet/charm v0.5.3-0.20200813190313-3e6a9e216ba7/go.mod h1:n9G/E8vzXiAqGqkwrvw41dHmjGrTYPLKc92wKYehCv0= +github.com/charmbracelet/charm v0.6.0 h1:I47HmnEptBoTnbfe4ZhNMpd6l8KKDktaVP02GL1yRyA= +github.com/charmbracelet/charm v0.6.0/go.mod h1:n9G/E8vzXiAqGqkwrvw41dHmjGrTYPLKc92wKYehCv0= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06/go.mod h1:ECr5vYu2tKCePqAbZNUh94HiZDPMtbc9ggAy4n585JU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -141,9 +147,11 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= From 7f26d27e844d2fd3e8607d8b50e3fa330031132b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 17 Aug 2020 10:29:30 -0400 Subject: [PATCH 402/911] Bump termenv --- go.mod | 4 ++-- go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index dc8545d..524b32b 100644 --- a/go.mod +++ b/go.mod @@ -12,9 +12,9 @@ require ( github.com/meowgorithm/babyenv v1.3.0 github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d - github.com/muesli/termenv v0.7.0 + github.com/muesli/termenv v0.7.1 github.com/spf13/cobra v1.0.0 golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d + golang.org/x/sys v0.0.0-20200817085935-3ff754bf58a9 ) diff --git a/go.sum b/go.sum index a3a8559..bcc1f5c 100644 --- a/go.sum +++ b/go.sum @@ -118,6 +118,8 @@ github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9 github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.7.0 h1:KcLfgg/KICGxOxNr+P9gmkrJ5azxOm3WzkfXMePGTq4= github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= +github.com/muesli/termenv v0.7.1 h1:f/0LJlWtufB7yG24zpnxtbC1MmGMbUFPRF5DqAnfSQg= +github.com/muesli/termenv v0.7.1/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= @@ -203,8 +205,8 @@ golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d h1:QQrM/CCYEzTs91GZylDCQjGHudbPTxF/1fvXdVh5lMo= -golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817085935-3ff754bf58a9 h1:MEU99+Z67sctTw1UjDlQ6wjRF77I43fOt7YKWktVvXw= +golang.org/x/sys v0.0.0-20200817085935-3ff754bf58a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 705665bda9b5dbd99294ab5961525116b57c1c37 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 18 Aug 2020 17:08:39 +0200 Subject: [PATCH 403/911] Bump charm dependency --- go.mod | 2 +- go.sum | 18 ++++-------------- ui/ui.go | 2 +- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index 524b32b..b9434d5 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.5.1 github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c - github.com/charmbracelet/charm v0.6.0 + github.com/charmbracelet/charm v0.6.1-0.20200818150622-8ef4a46f8e4f github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 diff --git a/go.sum b/go.sum index bcc1f5c..aeacc12 100644 --- a/go.sum +++ b/go.sum @@ -17,20 +17,14 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/bubbles v0.4.0/go.mod h1:yhk6OKN3haEO3i/vYQVrvbPamvOPo2dVavWfbpsuUjg= github.com/charmbracelet/bubbles v0.5.1 h1:41u1Nl1qQra1otd8T9MEQMpis9+f3MRmxVd9YnmS/kQ= github.com/charmbracelet/bubbles v0.5.1/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/bubbletea v0.10.0/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.2/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c h1:nb4KGAydLS6q3277+IqZLCGFNO2tdwrSKZ75AXAnnUI= github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/charm v0.5.2 h1:cgqc1LJuPwVTzZFD3CczgyxUC0oAkHSqnkUxIHUb+yc= -github.com/charmbracelet/charm v0.5.2/go.mod h1:tpIHCBAc6qk1zl/uSuYMKDmKtEro7XJxe38P0tFyR54= -github.com/charmbracelet/charm v0.5.3-0.20200813190313-3e6a9e216ba7 h1:MsPl7dADOuL0T7ApzrTqOp/RyHaqLuq3/bbask83AaM= -github.com/charmbracelet/charm v0.5.3-0.20200813190313-3e6a9e216ba7/go.mod h1:n9G/E8vzXiAqGqkwrvw41dHmjGrTYPLKc92wKYehCv0= -github.com/charmbracelet/charm v0.6.0 h1:I47HmnEptBoTnbfe4ZhNMpd6l8KKDktaVP02GL1yRyA= -github.com/charmbracelet/charm v0.6.0/go.mod h1:n9G/E8vzXiAqGqkwrvw41dHmjGrTYPLKc92wKYehCv0= +github.com/charmbracelet/charm v0.6.1-0.20200818150622-8ef4a46f8e4f h1:fL6CrFYqpC5IrZE2csKMmuf+IEXPf1E26o4TwrLRikA= +github.com/charmbracelet/charm v0.6.1-0.20200818150622-8ef4a46f8e4f/go.mod h1:ybooFS04wB+pDl6xZSRXr3mU9WWp6zEMbFFtBC1LxhU= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06/go.mod h1:ECr5vYu2tKCePqAbZNUh94HiZDPMtbc9ggAy4n585JU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -68,7 +62,6 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f h1:5CjVwnuUcp5adK4gmY6i72gpVFVnZDP2h5TmPScB6u4= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -109,6 +102,8 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446 h1:5I7/I/1aGJq6ChiTm7635O5O+kGbyMsdItLE7PJch7s= github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446/go.mod h1:+Pq8IXso2OklLavHxYpH30LWgIc50BF5xr2ch56ZV4Q= +github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= +github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d h1:ok5jhmKQze1yERN73u46EZhUH4vgC1z4qfeFJ8iOwvg= github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= @@ -116,8 +111,6 @@ github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9 github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= -github.com/muesli/termenv v0.7.0 h1:KcLfgg/KICGxOxNr+P9gmkrJ5azxOm3WzkfXMePGTq4= -github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/muesli/termenv v0.7.1 h1:f/0LJlWtufB7yG24zpnxtbC1MmGMbUFPRF5DqAnfSQg= github.com/muesli/termenv v0.7.1/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -149,11 +142,9 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -204,7 +195,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200817085935-3ff754bf58a9 h1:MEU99+Z67sctTw1UjDlQ6wjRF77I43fOt7YKWktVvXw= golang.org/x/sys v0.0.0-20200817085935-3ff754bf58a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/ui/ui.go b/ui/ui.go index 7d20d8b..582785e 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -438,7 +438,7 @@ func loadNews(m stashModel) tea.Cmd { } func generateSSHKeys() tea.Msg { - _, err := keygen.NewSSHKeyPair() + _, err := keygen.NewSSHKeyPair(nil) if err != nil { return keygenFailedMsg{} } From ddbacffc0b59553ebfb121dcdca9d7680423c203 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 18 Aug 2020 15:41:57 -0400 Subject: [PATCH 404/911] Log IO errors if a logfile is set --- ui/pager.go | 7 +++++++ ui/stash.go | 7 +++++++ ui/ui.go | 40 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 4aa518e..df86a2e 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -3,6 +3,7 @@ package ui import ( "errors" "fmt" + "log" "math" "strings" @@ -347,6 +348,9 @@ func renderWithGlamour(m pagerModel, md string) tea.Cmd { return func() tea.Msg { s, err := glamourRender(m, md) if err != nil { + if debug { + log.Println("error rendering with Glamour:", err) + } return errMsg(err) } return contentRenderedMsg(s) @@ -361,6 +365,9 @@ func saveDocumentNote(cc *charm.Client, id int, note string) tea.Cmd { } return func() tea.Msg { if err := cc.SetMarkdownNote(id, note); err != nil { + if debug { + log.Println("error saving note:", err) + } return errMsg(err) } return noteSavedMsg(&charm.Markdown{ID: id, Note: note}) diff --git a/ui/stash.go b/ui/stash.go index f27b571..11f06a6 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "io/ioutil" + "log" "math" "sort" "strings" @@ -696,6 +697,9 @@ func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { } if err != nil { + if debug { + log.Println("error loading remote markdown:", err) + } return errMsg(err) } @@ -717,6 +721,9 @@ func loadLocalMarkdown(md *markdown) tea.Cmd { data, err := ioutil.ReadFile(md.localPath) if err != nil { + if debug { + log.Println("error reading local markdown:", err) + } return errMsg(err) } md.Body = string(data) diff --git a/ui/ui.go b/ui/ui.go index 582785e..9e52a19 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -21,6 +21,7 @@ const noteCharacterLimit = 256 // should match server var ( config Config glowLogoTextColor = common.Color("#ECFD65") + debug = false // true if we're logging to a file, in which case we'll log more stuff ) // Config contains configuration specified to the TUI. @@ -40,6 +41,7 @@ func NewProgram(style string, cfg Config) *tea.Program { log.Printf("High performance pager: %v", cfg.HighPerformancePager) log.Printf("Glamour rendering: %v", cfg.GlamourEnabled) log.Println("Bubble Tea now initializing...") + debug = true } config = cfg return tea.NewProgram(initialize(cfg, style), update, view) @@ -50,7 +52,14 @@ func NewProgram(style string, cfg Config) *tea.Program { type errMsg error type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} -type keygenFailedMsg struct{} +type keygenFailedMsg struct { + err error +} + +func (k keygenFailedMsg) Error() string { + return k.err.Error() +} + type keygenSuccessMsg struct{} type initLocalFileSearchMsg struct { cwd string @@ -60,9 +69,18 @@ type foundLocalFileMsg gitcha.SearchResult type localFileSearchFinished struct{} type gotStashMsg []*charm.Markdown type stashLoadErrMsg struct{ err error } + +func (s stashLoadErrMsg) Error() string { + return s.err.Error() +} + type gotNewsMsg []*charm.Markdown type newsLoadErrMsg struct{ err error } +func (s newsLoadErrMsg) Error() string { + return s.err.Error() +} + // MODEL type state int @@ -376,6 +394,9 @@ func errorView(err error, fatal bool) string { func findLocalFiles() tea.Msg { cwd, err := os.Getwd() if err != nil { + if debug { + log.Println("error finding local files:", err) + } return errMsg(err) } @@ -408,8 +429,14 @@ func newCharmClient(identityFile *string) tea.Cmd { cc, err := charm.NewClient(cfg) if err == charm.ErrMissingSSHAuth { + if debug { + log.Println("missing SSH auth:", err) + } return sshAuthErrMsg{} } else if err != nil { + if debug { + log.Println("error creating new charm client:", err) + } return errMsg(err) } @@ -421,6 +448,9 @@ func loadStash(m stashModel) tea.Cmd { return func() tea.Msg { stash, err := m.cc.GetStash(m.page) if err != nil { + if debug { + log.Println("error loading stash:", err) + } return stashLoadErrMsg{err} } return gotStashMsg(stash) @@ -431,6 +461,9 @@ func loadNews(m stashModel) tea.Cmd { return func() tea.Msg { news, err := m.cc.GetNews(1) // just fetch the first page if err != nil { + if debug { + log.Println("error loading news:", err) + } return newsLoadErrMsg{err} } return gotNewsMsg(news) @@ -440,7 +473,10 @@ func loadNews(m stashModel) tea.Cmd { func generateSSHKeys() tea.Msg { _, err := keygen.NewSSHKeyPair(nil) if err != nil { - return keygenFailedMsg{} + if debug { + log.Println("keygen failed:", err) + } + return keygenFailedMsg{err} } return keygenSuccessMsg{} } From 881504e603112a466cf275b65c4feca2e918c172 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 19 Aug 2020 14:19:47 -0400 Subject: [PATCH 405/911] Bump Charm and Bubble Tea + de-bump Termenv to 0.7.0 --- go.mod | 8 ++++---- go.sum | 17 ++++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index b9434d5..34f983b 100644 --- a/go.mod +++ b/go.mod @@ -4,17 +4,17 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.5.1 - github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c - github.com/charmbracelet/charm v0.6.1-0.20200818150622-8ef4a46f8e4f + github.com/charmbracelet/bubbletea v0.10.3 + github.com/charmbracelet/charm v0.6.1-0.20200819181515-4a9548655a62 github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.3.0 github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d - github.com/muesli/termenv v0.7.1 + github.com/muesli/termenv v0.7.0 github.com/spf13/cobra v1.0.0 golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect - golang.org/x/sys v0.0.0-20200817085935-3ff754bf58a9 + golang.org/x/sys v0.0.0-20200819171115-d785dc25833f ) diff --git a/go.sum b/go.sum index aeacc12..dc35642 100644 --- a/go.sum +++ b/go.sum @@ -20,11 +20,10 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/charmbracelet/bubbles v0.5.1 h1:41u1Nl1qQra1otd8T9MEQMpis9+f3MRmxVd9YnmS/kQ= github.com/charmbracelet/bubbles v0.5.1/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/bubbletea v0.10.2/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c h1:nb4KGAydLS6q3277+IqZLCGFNO2tdwrSKZ75AXAnnUI= -github.com/charmbracelet/bubbletea v0.10.3-0.20200727185851-c6a1afd3c79c/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/charm v0.6.1-0.20200818150622-8ef4a46f8e4f h1:fL6CrFYqpC5IrZE2csKMmuf+IEXPf1E26o4TwrLRikA= -github.com/charmbracelet/charm v0.6.1-0.20200818150622-8ef4a46f8e4f/go.mod h1:ybooFS04wB+pDl6xZSRXr3mU9WWp6zEMbFFtBC1LxhU= +github.com/charmbracelet/bubbletea v0.10.3 h1:ofUkNNiXDzVONagDDPQLTEoyv4cyPYQrzaxXAj2OCbs= +github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:Ms0ktCuv95sM5us8vncXfW8KlsXkBBFuZzuP6sIJ2iU= +github.com/charmbracelet/charm v0.6.1-0.20200819181515-4a9548655a62 h1:9LcZPImjWJE0v2PxfW4B83b5L59urSe1C8uQDP7Bwv0= +github.com/charmbracelet/charm v0.6.1-0.20200819181515-4a9548655a62/go.mod h1:JxdWbfhqy6lZcXQhMCC5lc2Cv3AkN7qYXxx2/BCra2E= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06/go.mod h1:ECr5vYu2tKCePqAbZNUh94HiZDPMtbc9ggAy4n585JU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -111,8 +110,8 @@ github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9 github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= -github.com/muesli/termenv v0.7.1 h1:f/0LJlWtufB7yG24zpnxtbC1MmGMbUFPRF5DqAnfSQg= -github.com/muesli/termenv v0.7.1/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= +github.com/muesli/termenv v0.7.0 h1:KcLfgg/KICGxOxNr+P9gmkrJ5azxOm3WzkfXMePGTq4= +github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= @@ -195,8 +194,8 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817085935-3ff754bf58a9 h1:MEU99+Z67sctTw1UjDlQ6wjRF77I43fOt7YKWktVvXw= -golang.org/x/sys v0.0.0-20200817085935-3ff754bf58a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200819171115-d785dc25833f h1:KJuwZVtZBVzDmEDtB2zro9CXkD9O0dpCv4o2LHbQIAw= +golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From b39b2e64feed3bc962fef54b567c6146e7845383 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 19 Aug 2020 14:24:31 -0400 Subject: [PATCH 406/911] Fix checksums in go.sum --- go.sum | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go.sum b/go.sum index dc35642..12242c6 100644 --- a/go.sum +++ b/go.sum @@ -20,8 +20,8 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/charmbracelet/bubbles v0.5.1 h1:41u1Nl1qQra1otd8T9MEQMpis9+f3MRmxVd9YnmS/kQ= github.com/charmbracelet/bubbles v0.5.1/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/bubbletea v0.10.3 h1:ofUkNNiXDzVONagDDPQLTEoyv4cyPYQrzaxXAj2OCbs= -github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:Ms0ktCuv95sM5us8vncXfW8KlsXkBBFuZzuP6sIJ2iU= +github.com/charmbracelet/bubbletea v0.10.3 h1:arYCVde6OHbejtz08VOtAjsw4LlMR9pQhJCkqk3bwr8= +github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= github.com/charmbracelet/charm v0.6.1-0.20200819181515-4a9548655a62 h1:9LcZPImjWJE0v2PxfW4B83b5L59urSe1C8uQDP7Bwv0= github.com/charmbracelet/charm v0.6.1-0.20200819181515-4a9548655a62/go.mod h1:JxdWbfhqy6lZcXQhMCC5lc2Cv3AkN7qYXxx2/BCra2E= github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= From 3c04fc891c22d1546a2de28a1de29cfce6dea1a7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 20 Aug 2020 13:03:54 -0400 Subject: [PATCH 407/911] Update deprecated homebrew tap section in goreleaser config --- .goreleaser.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index ad36354..47eb66a 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -65,7 +65,7 @@ nfpms: brews: - ids: - darwin - github: + tap: owner: charmbracelet name: homebrew-tap commit_author: From d34a687ddcf5a117fedbea76caeb32117ae9cda3 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 20 Aug 2020 13:35:12 -0400 Subject: [PATCH 408/911] Pin charm, glamour, and bubbles deps at master --- go.mod | 11 +++++++---- go.sum | 35 +++++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index 34f983b..791d04e 100644 --- a/go.mod +++ b/go.mod @@ -3,18 +3,21 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/charmbracelet/bubbles v0.5.1 + github.com/alecthomas/chroma v0.8.0 // indirect + github.com/charmbracelet/bubbles v0.5.2-0.20200820173131-d4a0ecd3ee70 github.com/charmbracelet/bubbletea v0.10.3 - github.com/charmbracelet/charm v0.6.1-0.20200819181515-4a9548655a62 - github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 + github.com/charmbracelet/charm v0.7.1-0.20200820170102-1a2d97309792 + github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.3.0 + github.com/microcosm-cc/bluemonday v1.0.4 // indirect github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d github.com/muesli/termenv v0.7.0 github.com/spf13/cobra v1.0.0 + github.com/yuin/goldmark v1.2.1 // indirect golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de - golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 // indirect + golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect golang.org/x/sys v0.0.0-20200819171115-d785dc25833f ) diff --git a/go.sum b/go.sum index 12242c6..8e464bd 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,9 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= -github.com/alecthomas/chroma v0.7.3 h1:NfdAERMy+esYQs8OXk0I868/qDxxCEo7FMz1WIqMAeI= github.com/alecthomas/chroma v0.7.3/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= +github.com/alecthomas/chroma v0.8.0 h1:HS+HE97sgcqjQGu5uVr8jIE55Mmh5UeQ7kckAhHg2pY= +github.com/alecthomas/chroma v0.8.0/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= @@ -12,20 +13,25 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY= github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/bubbles v0.5.1 h1:41u1Nl1qQra1otd8T9MEQMpis9+f3MRmxVd9YnmS/kQ= github.com/charmbracelet/bubbles v0.5.1/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= +github.com/charmbracelet/bubbles v0.5.2-0.20200820173131-d4a0ecd3ee70 h1:AqQiGoDkSIpg+aXxA6h/D7YJjB9n6a7C4vomj2Fvd1s= +github.com/charmbracelet/bubbles v0.5.2-0.20200820173131-d4a0ecd3ee70/go.mod h1:a5j/GSk+sC2NBXqNXHeaYBDqutH+vd5eFX7Hl5tSmFo= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.3 h1:arYCVde6OHbejtz08VOtAjsw4LlMR9pQhJCkqk3bwr8= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= -github.com/charmbracelet/charm v0.6.1-0.20200819181515-4a9548655a62 h1:9LcZPImjWJE0v2PxfW4B83b5L59urSe1C8uQDP7Bwv0= -github.com/charmbracelet/charm v0.6.1-0.20200819181515-4a9548655a62/go.mod h1:JxdWbfhqy6lZcXQhMCC5lc2Cv3AkN7qYXxx2/BCra2E= -github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06 h1:FR5F7kH6i4Jm0+5ypNWWFKVcH07hIO3aGNuDXnOdWqY= -github.com/charmbracelet/glamour v0.1.1-0.20200521150359-e859bb067c06/go.mod h1:ECr5vYu2tKCePqAbZNUh94HiZDPMtbc9ggAy4n585JU= +github.com/charmbracelet/charm v0.7.1-0.20200820170102-1a2d97309792 h1:zn8834BrEdfiAYhKccRD95lUSMwH30y3c768RlAPh2M= +github.com/charmbracelet/charm v0.7.1-0.20200820170102-1a2d97309792/go.mod h1:kBWrZbEyxepjFthay19UTRNslbk8LkycGIFwR822Kvg= +github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f h1:VXwz/CsPDsrqUzQhp0eOB7VviujsiWKX/3H9cJOiHqc= +github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f/go.mod h1:DxzK1feHER8JTrWJ4uhme1kTGs4/ozEoQhIyYzwnew0= +github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= +github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -61,9 +67,12 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f h1:5CjVwnuUcp5adK4gmY6i72gpVFVnZDP2h5TmPScB6u4= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= @@ -92,8 +101,9 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 github.com/meowgorithm/babyenv v1.2.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/meowgorithm/babyenv v1.3.0 h1:klb7ugoZt0/Xlqkd5kLxM7eLZX8waiwxHZWW5nfEZ0Q= github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= -github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg= +github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a h1:eU8j/ClY2Ty3qdHnn0TyW3ivFoPC/0F1gQZz8yTxbbE= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -108,7 +118,6 @@ github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d h1:ok5jhmKQze1yERN github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= -github.com/muesli/termenv v0.5.2/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.7.0 h1:KcLfgg/KICGxOxNr+P9gmkrJ5azxOm3WzkfXMePGTq4= github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= @@ -156,8 +165,9 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1 github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.30 h1:j4d4Lw3zqZelDhBksEo3BnWg9xhXRQGJPPSL6OApZjI= -github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.0/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -165,6 +175,7 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -176,8 +187,8 @@ golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 h1:eDrdRpKgkcCqKZQwyZRyeFZgfqt37SL7Kv3tok06cKE= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc h1:zK/HqS5bZxDptfPJNq8v7vJfXtkU7r9TLIoSr1bXaP4= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= From df15d81dbba74b61a42ea751c4670657ea13b1b0 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 22 Aug 2020 09:33:20 +0200 Subject: [PATCH 409/911] Bump gitcha dependency --- go.mod | 2 +- go.sum | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 791d04e..a3a66ec 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.3.0 github.com/microcosm-cc/bluemonday v1.0.4 // indirect - github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446 + github.com/muesli/gitcha v0.0.0-20200822072946-4065b4f2ba56 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d github.com/muesli/termenv v0.7.0 github.com/spf13/cobra v1.0.0 diff --git a/go.sum b/go.sum index 8e464bd..faba552 100644 --- a/go.sum +++ b/go.sum @@ -43,8 +43,6 @@ github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5 github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denormal/go-gitignore v0.0.0-20180930084346-ae8ad1d07817 h1:0nsrg//Dc7xC74H/TZ5sYR8uk4UQRNjsw8zejqH5a4Q= -github.com/denormal/go-gitignore v0.0.0-20180930084346-ae8ad1d07817/go.mod h1:C/+sI4IFnEpCn6VQ3GIPEp+FrQnQw+YQP3+n+GdGq7o= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -109,8 +107,8 @@ github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2S github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446 h1:5I7/I/1aGJq6ChiTm7635O5O+kGbyMsdItLE7PJch7s= -github.com/muesli/gitcha v0.0.0-20200722055628-aebbb2551446/go.mod h1:+Pq8IXso2OklLavHxYpH30LWgIc50BF5xr2ch56ZV4Q= +github.com/muesli/gitcha v0.0.0-20200822072946-4065b4f2ba56 h1:H1SHFc5IXgYgUZpxXeOWC0CZvllald8h2gVCUtNfTGc= +github.com/muesli/gitcha v0.0.0-20200822072946-4065b4f2ba56/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= @@ -143,6 +141,8 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= +github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -161,6 +161,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= @@ -223,4 +224,5 @@ gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From be478cbaf341ad52059174a922224b7b9e617e2a Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 22 Aug 2020 10:16:01 +0200 Subject: [PATCH 410/911] Adapt to upstream gitcha API --- go.mod | 2 +- go.sum | 4 ++-- ui/ui.go | 9 ++++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index a3a66ec..514f171 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.3.0 github.com/microcosm-cc/bluemonday v1.0.4 // indirect - github.com/muesli/gitcha v0.0.0-20200822072946-4065b4f2ba56 + github.com/muesli/gitcha v0.0.0-20200822081321-a2a5e01d2e54 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d github.com/muesli/termenv v0.7.0 github.com/spf13/cobra v1.0.0 diff --git a/go.sum b/go.sum index faba552..e257b08 100644 --- a/go.sum +++ b/go.sum @@ -107,8 +107,8 @@ github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2S github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/muesli/gitcha v0.0.0-20200822072946-4065b4f2ba56 h1:H1SHFc5IXgYgUZpxXeOWC0CZvllald8h2gVCUtNfTGc= -github.com/muesli/gitcha v0.0.0-20200822072946-4065b4f2ba56/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= +github.com/muesli/gitcha v0.0.0-20200822081321-a2a5e01d2e54 h1:4SwuTPgw/ctzxFNLFk/Hs397Po4QU5tlDn8EKa7T0ks= +github.com/muesli/gitcha v0.0.0-20200822081321-a2a5e01d2e54/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= diff --git a/ui/ui.go b/ui/ui.go index 9e52a19..69e8e21 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -400,7 +400,14 @@ func findLocalFiles() tea.Msg { return errMsg(err) } - ch := gitcha.FindFileFromList(cwd, []string{"*.md"}) + ch, err := gitcha.FindFiles(cwd, []string{"*.md"}) + if err != nil { + if debug { + log.Println("error finding local files:", err) + } + return errMsg(err) + } + return initLocalFileSearchMsg{ch: ch, cwd: cwd} } From 2821cf2fb46be953a62df8262504c687863afda1 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 24 Aug 2020 14:53:55 +0200 Subject: [PATCH 411/911] Disable identity & force-key flags --- main.go | 8 +++++--- stash.go | 29 ++++++++++++++++++----------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/main.go b/main.go index aaf9692..b0bf5e5 100644 --- a/main.go +++ b/main.go @@ -176,7 +176,7 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { } // Config from flags - cfg.IdentityFile = identityFile + // cfg.IdentityFile = identityFile // Log to file, if set if cfg.Logfile != "" { @@ -294,8 +294,10 @@ func init() { rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") // For network-related operations, namely stashing and the TUI - rootCmd.PersistentFlags().StringVarP(&identityFile, "identity", "i", "", "path to identity file (that is, an ssh private key)") - rootCmd.PersistentFlags().BoolVarP(&forceKey, "force-key", "f", false, "force the use of the SSH key on disk (that is, ignore ssh-agent)") + /* + rootCmd.PersistentFlags().StringVarP(&identityFile, "identity", "i", "", "path to identity file (that is, an ssh private key)") + rootCmd.PersistentFlags().BoolVarP(&forceKey, "force-key", "f", false, "force the use of the SSH key on disk (that is, ignore ssh-agent)") + */ // Stash stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") diff --git a/stash.go b/stash.go index 6c55050..8019099 100644 --- a/stash.go +++ b/stash.go @@ -13,10 +13,13 @@ import ( ) var ( - identityFile string - forceKey bool - memo string - stashCmd = &cobra.Command{ + /* + identityFile string + forceKey bool + */ + + memo string + stashCmd = &cobra.Command{ Use: "stash SOURCE", Hidden: false, Short: "stash a markdown", @@ -49,13 +52,17 @@ func getCharmConfig() *charm.Config { if err != nil { log.Fatal(err) } - if identityFile != "" { - cfg.SSHKeyPath = identityFile - cfg.ForceKey = true - } - if forceKey { - cfg.ForceKey = true - } + + /* + if identityFile != "" { + cfg.SSHKeyPath = identityFile + cfg.ForceKey = true + } + if forceKey { + cfg.ForceKey = true + } + */ + return cfg } From 93eea84f3b329a85f36d4fd9c06bb42cdff2337a Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 24 Aug 2020 15:46:19 +0200 Subject: [PATCH 412/911] Add golangci config --- .golangci.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .golangci.yml diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..36f9966 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,26 @@ +run: + tests: false + +issues: + max-issues-per-linter: 0 + max-same-issues: 0 + +linters: + enable: + - bodyclose + - dupl + - exportloopref + - goconst + - godot + - godox + - goimports + - gomnd + - goprintffuncname + - gosec + - misspell + - prealloc + - rowserrcheck + - sqlclosecheck + - unconvert + - unparam + - whitespace From 593d9f07e773b1eb469af9a94ef39815ae6a77e7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 20 Aug 2020 20:21:52 -0400 Subject: [PATCH 413/911] Stash local files from the pager --- ui/pager.go | 183 +++++++++++++++++++++++++++++++++++++++++++--------- ui/stash.go | 6 +- ui/ui.go | 12 +++- 3 files changed, 163 insertions(+), 38 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index df86a2e..a47b552 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -5,7 +5,9 @@ import ( "fmt" "log" "math" + "path" "strings" + "time" "github.com/charmbracelet/bubbles/textinput" "github.com/charmbracelet/bubbles/viewport" @@ -24,6 +26,8 @@ const ( gray = "#333333" yellowGreen = "#ECFD65" fuschia = "#EE6FF8" + mintGreen = "#89F0CB" + darkGreen = "#089B66" noteHeadingText = " Set Memo " notePromptText = " > " ) @@ -40,31 +44,36 @@ var ( statusBarNoteFg = common.NewColorPair("#7D7D7D", "#656565") statusBarScrollPosFg = common.NewColorPair("#5A5A5A", "#949494") - statusBarScrollPosStyle = te.Style{}. - Foreground(statusBarScrollPosFg.Color()). - Background(statusBarBg.Color()). - Styled - - statusBarNoteStyle = te.Style{}. - Foreground(statusBarNoteFg.Color()). - Background(statusBarBg.Color()). - Styled - - statusBarHelpStyle = te.Style{}. - Foreground(statusBarNoteFg.Color()). - Background(common.NewColorPair("#323232", "#DCDCDC").Color()). - Styled - - helpViewStyle = te.Style{}. - Foreground(statusBarNoteFg.Color()). - Background(common.NewColorPair("#1B1B1B", "#f2f2f2").Color()). - Styled + // Styling functions + statusBarScrollPosStyle = newStyle(statusBarScrollPosFg.String(), statusBarBg.String()) + statusBarNoteStyle = newStyle(statusBarNoteFg.String(), statusBarBg.String()) + statusBarHelpStyle = newStyle(statusBarNoteFg.String(), common.NewColorPair("#323232", "#DCDCDC").String()) + statusBarMessageHeaderStyle = newStyle(common.Cream.String(), common.Green.String()) + statusBarMessageBodyStyle = newStyle(mintGreen, darkGreen) + helpViewStyle = newStyle(statusBarNoteFg.String(), common.NewColorPair("#1B1B1B", "#f2f2f2").String()) ) +// Create a new termenv styling function +func newStyle(fg, bg string) func(string) string { + return te.Style{}. + Foreground(te.ColorProfile().Color(fg)). + Background(te.ColorProfile().Color(bg)). + Styled +} + // MSG type contentRenderedMsg string type noteSavedMsg *charm.Markdown +type statusMessageTimeoutMsg struct{} +type stashSuccessMsg markdown +type stashErrMsg struct { + err error +} + +func (s stashErrMsg) Error() string { + return s.err.Error() +} // MODEL @@ -73,6 +82,8 @@ type pagerState int const ( pagerStateBrowse pagerState = iota pagerStateSetNote + pagerStateStashing + pagerStateStatusMessage ) type pagerModel struct { @@ -85,9 +96,13 @@ type pagerModel struct { textInput textinput.Model showHelp bool + statusMessageHeader string + statusMessageBody string + statusMessageTimer *time.Timer + // Current document being rendered, sans-glamour rendering. We cache // it here so we can re-render it on resize. - currentDocument *markdown + currentDocument markdown } func newPagerModel(glamourStyle string) pagerModel { @@ -145,6 +160,9 @@ func (m *pagerModel) unload() { if m.showHelp { m.toggleHelp() } + if m.statusMessageTimer != nil { + m.statusMessageTimer.Stop() + } m.state = pagerStateBrowse m.viewport.SetContent("") m.viewport.YOffset = 0 @@ -192,12 +210,38 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { } m.state = pagerStateSetNote + + // Stop the timer for hiding a status message since changing + // the state above will have cleared it. + if m.statusMessageTimer != nil { + m.statusMessageTimer.Stop() + } + + // Pre-populate note with existing value if m.textInput.Value() == "" { - // Pre-populate note with existing value m.textInput.SetValue(m.currentDocument.Note) m.textInput.CursorEnd() } + return m, textinput.Blink(m.textInput) + case "s": + // Stash a local document + if m.state != pagerStateStashing && m.currentDocument.markdownType == localMarkdown { + m.state = pagerStateStashing + + // Create new markdown based on loaded markdown + md := m.currentDocument + md.markdownType = stashedMarkdown + t := time.Now() + md.CreatedAt = &t + + // Set the note as the filename without the extension + p := md.localPath + md.Note = strings.Replace(path.Base(p), path.Ext(p), "", 1) + md.localPath = "" + + return m, stashDocument(m.cc, md) + } case "?": m.toggleHelp() if m.viewport.HighPerformanceRendering { @@ -216,11 +260,33 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { // We've reveived terminal dimensions, either for the first time or // after a resize case tea.WindowSizeMsg: - var cmd tea.Cmd - if m.currentDocument != nil { - cmd = renderWithGlamour(m, m.currentDocument.Body) - } - return m, cmd + return m, renderWithGlamour(m, m.currentDocument.Body) + + case stashSuccessMsg: + // Stashing was successful. Convert the loaded document to a stashed + // one. Note that we're also handling this message in the main update + // function where we're adding this stashed item to the stash listing. + + m.state = pagerStateBrowse + + // Replace the current document in the state so its metadata becomes + // that of a stashed document, but don't re-render since the body is + // identical to what's already rendered. + m.currentDocument = markdown(msg) + + // Show a success message to the user. + m.state = pagerStateStatusMessage + m.statusMessageHeader = "Stashed!" + m.statusMessageBody = "" + m.statusMessageTimer = time.NewTimer(time.Second * 3) + cmds = append(cmds, waitForStatusMessageTimeout(m.statusMessageTimer)) + + case stashErrMsg: + // TODO + + case statusMessageTimeoutMsg: + // Hide the status message bar + m.state = pagerStateBrowse } switch m.state { @@ -243,9 +309,12 @@ func pagerView(m pagerModel) string { fmt.Fprint(&b, viewport.View(m.viewport)+"\n") // Footer - if m.state == pagerStateSetNote { + switch m.state { + case pagerStateSetNote: pagerSetNoteView(&b, m) - } else { + case pagerStateStatusMessage: + pagerStatusMessageView(&b, m) + default: pagerStatusBarView(&b, m) } @@ -304,16 +373,37 @@ func pagerSetNoteView(b *strings.Builder, m pagerModel) { fmt.Fprint(b, textinput.View(m.textInput)) } +func pagerStatusMessageView(b *strings.Builder, m pagerModel) { + const bodyGapWidth = 2 // extra spaces we're adding before/after the body + + header := m.statusMessageHeader + if len(header) > 0 { + header = " " + header + " " + } + body := m.statusMessageBody + bodyWidth := runewidth.StringWidth(body) + availBodySpace := m.width - runewidth.StringWidth(header) - bodyGapWidth + + if availBodySpace < runewidth.StringWidth(body) { + body = runewidth.Truncate(body, availBodySpace, "…") + } else if availBodySpace > bodyWidth { + body = " " + body + " " + strings.Repeat(" ", availBodySpace-bodyWidth) + } + + if len(header) > 0 { + fmt.Fprintf(b, statusBarMessageHeaderStyle(header)) + } + fmt.Fprintf(b, statusBarMessageBodyStyle(body)) +} + func pagerHelpView(m pagerModel, width int) (s string) { col1 := [...]string{ "m set memo", "esc back to files", "q quit", } - if m.currentDocument != nil && m.currentDocument.markdownType != stashedMarkdown { - col1[0] = col1[1] - col1[1] = col1[2] - col1[2] = "" + if m.currentDocument.markdownType != stashedMarkdown { + col1[0] = "s stash this document" } s += "\n" @@ -374,6 +464,35 @@ func saveDocumentNote(cc *charm.Client, id int, note string) tea.Cmd { } } +func stashDocument(cc *charm.Client, md markdown) tea.Cmd { + if cc == nil { + return func() tea.Msg { + err := errors.New("can't stash; no charm client") + if debug { + log.Println("error stash document:", err) + } + return stashErrMsg{err} + } + } + return func() tea.Msg { + err := cc.StashMarkdown(md.Note, md.Body) + if err != nil { + if debug { + log.Println("error stashing document:", err) + } + return errMsg(err) + } + return stashSuccessMsg(md) + } +} + +func waitForStatusMessageTimeout(t *time.Timer) tea.Cmd { + return func() tea.Msg { + <-t.C + return statusMessageTimeoutMsg{} + } +} + // This is where the magic happens func glamourRender(m pagerModel, markdown string) (string, error) { diff --git a/ui/stash.go b/ui/stash.go index 11f06a6..3d9a731 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -58,7 +58,7 @@ const ( type markdown struct { markdownType markdownType localPath string // only relevent to local files - *charm.Markdown + charm.Markdown } // Sort documents with local files first, then by date @@ -705,7 +705,7 @@ func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { return fetchedMarkdownMsg(&markdown{ markdownType: t, - Markdown: md, + Markdown: *md, }) } } @@ -749,7 +749,7 @@ func wrapMarkdowns(t markdownType, md []*charm.Markdown) (m []*markdown) { for _, v := range md { m = append(m, &markdown{ markdownType: t, - Markdown: v, + Markdown: *v, }) } return m diff --git a/ui/ui.go b/ui/ui.go index 69e8e21..4f1dee2 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -236,7 +236,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { return m, tea.Quit case "left", "h", "delete": - if m.state == stateShowDocument && m.pager.state == pagerStateBrowse { + if m.state == stateShowDocument && (m.pager.state == pagerStateBrowse || m.pager.state == pagerStateStatusMessage) { cmds = append(cmds, m.unloadDocument()...) return m, tea.Batch(cmds...) } @@ -310,7 +310,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { cmds = append(cmds, loadStash(m.stash), loadNews(m.stash)) case fetchedMarkdownMsg: - m.pager.currentDocument = msg + m.pager.currentDocument = *msg cmds = append(cmds, renderWithGlamour(m.pager, msg.Body)) case contentRenderedMsg: @@ -331,6 +331,12 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { m.stash = stashModel return m, cmd + case stashSuccessMsg: + // Something was stashed. Update the stash listing. We're caching this + // here, rather than in the stash update function, because stashing + // may have occurred in the pager. + md := markdown(msg) + m.stash.addMarkdowns(&md) } // Process children @@ -497,7 +503,7 @@ func localFileToMarkdown(cwd string, res gitcha.SearchResult) (*markdown, error) md := &markdown{ markdownType: localMarkdown, localPath: res.Path, - Markdown: &charm.Markdown{}, + Markdown: charm.Markdown{}, } // Strip absolute path From 5613e3615464fdd60be8d0acf672f47eaee1eb5c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 20 Aug 2020 20:30:24 -0400 Subject: [PATCH 414/911] Adjust dark green color in status message bar --- ui/pager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index a47b552..589d664 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -27,7 +27,7 @@ const ( yellowGreen = "#ECFD65" fuschia = "#EE6FF8" mintGreen = "#89F0CB" - darkGreen = "#089B66" + darkGreen = "#1C8760" noteHeadingText = " Set Memo " notePromptText = " > " ) From 651683cd21e2de79d6d2ad15224faa84b44262f3 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 20 Aug 2020 20:47:28 -0400 Subject: [PATCH 415/911] Treat Markdown.CreatedAt as values per the updates in the charm lib --- go.mod | 6 +++--- go.sum | 8 ++++++-- ui/pager.go | 2 +- ui/stash.go | 4 ++-- ui/stashitem.go | 2 +- ui/ui.go | 2 +- 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 514f171..71df8c8 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/alecthomas/chroma v0.8.0 // indirect github.com/charmbracelet/bubbles v0.5.2-0.20200820173131-d4a0ecd3ee70 github.com/charmbracelet/bubbletea v0.10.3 - github.com/charmbracelet/charm v0.7.1-0.20200820170102-1a2d97309792 + github.com/charmbracelet/charm v0.7.1-0.20200821004146-148a655040c4 github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 @@ -17,7 +17,7 @@ require ( github.com/muesli/termenv v0.7.0 github.com/spf13/cobra v1.0.0 github.com/yuin/goldmark v1.2.1 // indirect - golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de + golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect - golang.org/x/sys v0.0.0-20200819171115-d785dc25833f + golang.org/x/sys v0.0.0-20200820212457-1fb795427249 ) diff --git a/go.sum b/go.sum index e257b08..f535026 100644 --- a/go.sum +++ b/go.sum @@ -26,8 +26,8 @@ github.com/charmbracelet/bubbles v0.5.2-0.20200820173131-d4a0ecd3ee70/go.mod h1: github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.3 h1:arYCVde6OHbejtz08VOtAjsw4LlMR9pQhJCkqk3bwr8= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= -github.com/charmbracelet/charm v0.7.1-0.20200820170102-1a2d97309792 h1:zn8834BrEdfiAYhKccRD95lUSMwH30y3c768RlAPh2M= -github.com/charmbracelet/charm v0.7.1-0.20200820170102-1a2d97309792/go.mod h1:kBWrZbEyxepjFthay19UTRNslbk8LkycGIFwR822Kvg= +github.com/charmbracelet/charm v0.7.1-0.20200821004146-148a655040c4 h1:JguzG6Hoy4qyxQeyAA4e1yQfRnBSxEMWn5CL8ATXc5o= +github.com/charmbracelet/charm v0.7.1-0.20200821004146-148a655040c4/go.mod h1:kBWrZbEyxepjFthay19UTRNslbk8LkycGIFwR822Kvg= github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f h1:VXwz/CsPDsrqUzQhp0eOB7VviujsiWKX/3H9cJOiHqc= github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f/go.mod h1:DxzK1feHER8JTrWJ4uhme1kTGs4/ozEoQhIyYzwnew0= github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= @@ -180,6 +180,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -208,6 +210,8 @@ golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200819171115-d785dc25833f h1:KJuwZVtZBVzDmEDtB2zro9CXkD9O0dpCv4o2LHbQIAw= golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200820212457-1fb795427249 h1:tKP05IMsVLZ4VeeCEFmrIUmxAAx6UD8IBdPtYlYNa8g= +golang.org/x/sys v0.0.0-20200820212457-1fb795427249/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/ui/pager.go b/ui/pager.go index 589d664..570c36d 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -233,7 +233,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { md := m.currentDocument md.markdownType = stashedMarkdown t := time.Now() - md.CreatedAt = &t + md.CreatedAt = t // Set the note as the filename without the extension p := md.localPath diff --git a/ui/stash.go b/ui/stash.go index 3d9a731..579af21 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -85,8 +85,8 @@ func (m markdownsByLocalFirst) Less(i, j int) bool { } // Neither are local files so sort by date descending - if !m[i].CreatedAt.Equal(*m[j].CreatedAt) { - return m[i].CreatedAt.After(*m[j].CreatedAt) + if !m[i].CreatedAt.Equal(m[j].CreatedAt) { + return m[i].CreatedAt.After(m[j].CreatedAt) } // If the timestamps also match, sort by ID. diff --git a/ui/stashitem.go b/ui/stashitem.go index 7e170f7..a488392 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -36,7 +36,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { truncateTo := m.terminalWidth - stashViewHorizontalPadding*2 gutter := " " title := md.Note - date := relativeTime(*md.CreatedAt) + date := relativeTime(md.CreatedAt) icon := "" switch md.markdownType { diff --git a/ui/ui.go b/ui/ui.go index 4f1dee2..5322ae0 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -511,7 +511,7 @@ func localFileToMarkdown(cwd string, res gitcha.SearchResult) (*markdown, error) // Get last modified time t := res.Info.ModTime() - md.CreatedAt = &t + md.CreatedAt = t return md, nil } From 3572ef5470e1aa30ac6b762aec8f54845c7a04f5 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 11:56:40 -0400 Subject: [PATCH 416/911] Log when local file search finishes --- ui/ui.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ui/ui.go b/ui/ui.go index 5322ae0..5cc69c9 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -425,6 +425,9 @@ func findNextLocalFile(m model) tea.Cmd { return foundLocalFileMsg(pathStr) } // We're done + if debug { + log.Println("Local file search finished") + } return localFileSearchFinished{} } } From 04b6089bd9fb17751ef4dc9a0947a1212b50d2a0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 13:39:59 -0400 Subject: [PATCH 417/911] Stash documents from the stash view --- ui/pager.go | 37 ++++++++++++---------------- ui/stash.go | 70 ++++++++++++++++++++++++++++++++++++++++++++++------- ui/ui.go | 44 ++++++++++++++++++++++----------- 3 files changed, 106 insertions(+), 45 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 570c36d..72defe7 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -65,7 +65,6 @@ func newStyle(fg, bg string) func(string) string { type contentRenderedMsg string type noteSavedMsg *charm.Markdown -type statusMessageTimeoutMsg struct{} type stashSuccessMsg markdown type stashErrMsg struct { err error @@ -228,19 +227,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { // Stash a local document if m.state != pagerStateStashing && m.currentDocument.markdownType == localMarkdown { m.state = pagerStateStashing - - // Create new markdown based on loaded markdown - md := m.currentDocument - md.markdownType = stashedMarkdown - t := time.Now() - md.CreatedAt = t - - // Set the note as the filename without the extension - p := md.localPath - md.Note = strings.Replace(path.Base(p), path.Ext(p), "", 1) - md.localPath = "" - - return m, stashDocument(m.cc, md) + return m, stashDocument(m.cc, m.currentDocument) } case "?": m.toggleHelp() @@ -278,8 +265,11 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { m.state = pagerStateStatusMessage m.statusMessageHeader = "Stashed!" m.statusMessageBody = "" + if m.statusMessageTimer != nil { + m.statusMessageTimer.Stop() + } m.statusMessageTimer = time.NewTimer(time.Second * 3) - cmds = append(cmds, waitForStatusMessageTimeout(m.statusMessageTimer)) + cmds = append(cmds, waitForStatusMessageTimeout(pagerContext, m.statusMessageTimer)) case stashErrMsg: // TODO @@ -474,6 +464,16 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { return stashErrMsg{err} } } + + // Turn local markdown into a stashed markdown + md.markdownType = stashedMarkdown + md.CreatedAt = time.Now() + + // Set the note as the filename without the extension + p := md.localPath + md.Note = strings.Replace(path.Base(p), path.Ext(p), "", 1) + md.localPath = "" + return func() tea.Msg { err := cc.StashMarkdown(md.Note, md.Body) if err != nil { @@ -486,13 +486,6 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { } } -func waitForStatusMessageTimeout(t *time.Timer) tea.Cmd { - return func() tea.Msg { - <-t.C - return statusMessageTimeoutMsg{} - } -} - // This is where the magic happens func glamourRender(m pagerModel, markdown string) (string, error) { diff --git a/ui/stash.go b/ui/stash.go index 579af21..3b23e32 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -142,6 +142,10 @@ type stashModel struct { // than we can display at a time so we can paginate locally without having // to fetch every time. page int + + showStatusMessage bool + statusMessage string + statusMessageTimer *time.Timer } func (m *stashModel) setSize(width, height int) { @@ -197,6 +201,13 @@ func (m stashModel) countMarkdowns(t markdownType) (found int) { return } +func (m *stashModel) hideStatusMessage() { + m.showStatusMessage = false + if m.statusMessageTimer != nil { + m.statusMessageTimer.Stop() + } +} + // INIT func newStashModel() stashModel { @@ -289,13 +300,33 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.markdowns[i].Note = msg.Note } } + + // Something was stashed. Add it to the stash listing. + case stashSuccessMsg: + md := markdown(msg) + m.addMarkdowns(&md) + + m.showStatusMessage = true + m.statusMessage = "Stashed!" + if m.statusMessageTimer != nil { + m.statusMessageTimer.Stop() + } + m.statusMessageTimer = time.NewTimer(time.Second * 3) + cmds = append(cmds, waitForStatusMessageTimeout(stashContext, m.statusMessageTimer)) + + case statusMessageTimeoutMsg: + if applicationContext(msg) == stashContext { + m.hideStatusMessage() + } } switch m.state { case stashStateReady: + switch msg := msg.(type) { + // Handle keys - if msg, ok := msg.(tea.KeyMsg); ok { + case tea.KeyMsg: switch msg.String() { case "k", "up": @@ -323,6 +354,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Open document case "enter": + m.hideStatusMessage() + if len(m.markdowns) == 0 { break } @@ -342,6 +375,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Set note case "m": + m.hideStatusMessage() + md := m.selectedMarkdown() isUserMarkdown := md.markdownType == stashedMarkdown isSettingNote := m.state == stashStateSettingNote @@ -354,8 +389,17 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { return m, textinput.Blink(m.noteInput) } + // Stash + case "s": + md := m.selectedMarkdown() + if md != nil && md.markdownType == localMarkdown { + cmds = append(cmds, stashDocument(m.cc, *md)) + } + // Prompt for deletion case "x": + m.hideStatusMessage() + isUserMarkdown := m.selectedMarkdown().markdownType == stashedMarkdown isValidState := m.state != stashStateSettingNote @@ -500,11 +544,15 @@ func stashView(m stashModel) string { } var header string - switch m.state { - case stashStatePromptDelete: - header = redFg("Delete this item? ") + faintRedFg("(y/N)") - case stashStateSettingNote: - header = yellowFg("Set the memo for this item?") + if m.showStatusMessage { + header = greenFg(m.statusMessage) + } else { + switch m.state { + case stashStatePromptDelete: + header = redFg("Delete this item? ") + faintRedFg("(y/N)") + case stashStateSettingNote: + header = yellowFg("Set the memo for this item?") + } } // Only draw the normal header if we're not using the header area for @@ -619,11 +667,13 @@ func stashHelpView(m stashModel) string { var ( h []string isStashed bool + isLocal bool ) if len(m.markdowns) > 0 { md := m.selectedMarkdown() isStashed = md != nil && md.markdownType == stashedMarkdown + isLocal = md != nil && md.markdownType == localMarkdown } if m.state == stashStateSettingNote { @@ -640,13 +690,15 @@ func stashHelpView(m stashModel) string { if m.paginator.TotalPages > 1 { h = append(h, "h/l, ←/→: page") } - if isStashed && len(m.markdowns) > 0 { + if isStashed { h = append(h, []string{"x: delete", "m: set memo"}...) + } else if isLocal { + h = append(h, "s: stash") } if m.err != nil { - h = append(h, []string{"!: errors"}...) + h = append(h, "!: errors") } - h = append(h, []string{"q: quit"}...) + h = append(h, "q: quit") } return stashHelpViewBuilder(m.terminalWidth, h...) } diff --git a/ui/ui.go b/ui/ui.go index 5cc69c9..c932ea5 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -6,6 +6,7 @@ import ( "log" "os" "strings" + "time" "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" @@ -52,13 +53,9 @@ func NewProgram(style string, cfg Config) *tea.Program { type errMsg error type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} -type keygenFailedMsg struct { - err error -} +type keygenFailedMsg struct{ err error } -func (k keygenFailedMsg) Error() string { - return k.err.Error() -} +func (k keygenFailedMsg) Error() string { return k.err.Error() } type keygenSuccessMsg struct{} type initLocalFileSearchMsg struct { @@ -70,19 +67,26 @@ type localFileSearchFinished struct{} type gotStashMsg []*charm.Markdown type stashLoadErrMsg struct{ err error } -func (s stashLoadErrMsg) Error() string { - return s.err.Error() -} +func (s stashLoadErrMsg) Error() string { return s.err.Error() } type gotNewsMsg []*charm.Markdown type newsLoadErrMsg struct{ err error } -func (s newsLoadErrMsg) Error() string { - return s.err.Error() -} +func (s newsLoadErrMsg) Error() string { return s.err.Error() } + +type statusMessageTimeoutMsg applicationContext // MODEL +// Which part of the application something appies to. Occasionally used as an +// arguments to command and messages. +type applicationContext int + +const ( + stashContext applicationContext = iota + pagerContext +) + type state int const ( @@ -335,8 +339,13 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // Something was stashed. Update the stash listing. We're caching this // here, rather than in the stash update function, because stashing // may have occurred in the pager. - md := markdown(msg) - m.stash.addMarkdowns(&md) + if m.state == stateShowDocument { + newStashModel, cmd := stashUpdate(msg, m.stash) + m.stash = newStashModel + if cmd != nil { + cmds = append(cmds, cmd) + } + } } // Process children @@ -497,6 +506,13 @@ func generateSSHKeys() tea.Msg { return keygenSuccessMsg{} } +func waitForStatusMessageTimeout(appCtx applicationContext, t *time.Timer) tea.Cmd { + return func() tea.Msg { + <-t.C + return statusMessageTimeoutMsg(appCtx) + } +} + // ETC // Convert local file path to Markdown. Note that we could be doing things From 2e16f2682ea6c046425355e6c980348ce351c7c4 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 14:04:46 -0400 Subject: [PATCH 418/911] Highlight stash choice in file listing footer --- ui/stash.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 3b23e32..8cd9512 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -718,7 +718,15 @@ func stashHelpViewBuilder(windowWidth int, sections ...string) string { } for i := 0; i < len(sections); i++ { - next = stashHelpItemStyle(sections[i]) + // If we need this more often we'll formalize something rather than + // use an if clause/switch here. + switch sections[i] { + case "s: stash": + next = greenFg(sections[i]) + default: + next = stashHelpItemStyle(sections[i]) + } + if i < len(sections)-1 { next += stashHelpDivider } From 40724af7e1b024f3ca4c22808c4ec8cdeda3baf0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 14:22:20 -0400 Subject: [PATCH 419/911] Short circuit help view sooner if we can --- ui/stash.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 8cd9512..8a27739 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -706,16 +706,18 @@ func stashHelpView(m stashModel) string { // builds the help view from various sections pieces, truncating it if the view // would otherwise wrap to two lines. func stashHelpViewBuilder(windowWidth int, sections ...string) string { + if len(sections) == 0 { + return "" + } + const truncationWidth = 1 // width of "…" + var ( s string next string maxWidth = windowWidth - stashViewHorizontalPadding - truncationWidth ) - if len(sections) == 0 { - return s - } for i := 0; i < len(sections); i++ { // If we need this more often we'll formalize something rather than @@ -731,6 +733,8 @@ func stashHelpViewBuilder(windowWidth int, sections ...string) string { next += stashHelpDivider } + // Only this (and the following) help text items if we have the + // horizontal space if ansi.PrintableRuneWidth(s)+ansi.PrintableRuneWidth(next) >= maxWidth { s += common.Subtle("…") break From d9b1d335d44257b2b2779fb5f05cb66d703cf16b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 14:22:41 -0400 Subject: [PATCH 420/911] Use "just now" rather than seconds for documents under 1 minute old --- ui/stash.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 8a27739..1ccbf23 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -845,7 +845,10 @@ var magnitudes = []humanize.RelTimeMagnitude{ func relativeTime(then time.Time) string { now := time.Now() - if now.Sub(then) < humanize.Week { + ago := now.Sub(then) + if ago < time.Minute { + return "just now" + } else if ago < humanize.Week { return humanize.CustomRelTime(then, now, "ago", "from now", magnitudes) } return then.Format("02 Jan 2006 15:04 MST") From 5bdf7649b0efde65fd035dc1d30f0e3c29861a81 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 15:52:53 -0400 Subject: [PATCH 421/911] Set ID of newly stashed markdowns so we can operate on them --- go.mod | 4 ++-- go.sum | 8 ++++---- stash.go | 2 +- ui/pager.go | 7 ++++++- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 71df8c8..668bb86 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/alecthomas/chroma v0.8.0 // indirect github.com/charmbracelet/bubbles v0.5.2-0.20200820173131-d4a0ecd3ee70 github.com/charmbracelet/bubbletea v0.10.3 - github.com/charmbracelet/charm v0.7.1-0.20200821004146-148a655040c4 + github.com/charmbracelet/charm v0.7.1-0.20200821194648-662b3ca6fc7e github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.9 @@ -19,5 +19,5 @@ require ( github.com/yuin/goldmark v1.2.1 // indirect golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect - golang.org/x/sys v0.0.0-20200820212457-1fb795427249 + golang.org/x/sys v0.0.0-20200821140526-fda516888d29 ) diff --git a/go.sum b/go.sum index f535026..47c5b66 100644 --- a/go.sum +++ b/go.sum @@ -26,8 +26,8 @@ github.com/charmbracelet/bubbles v0.5.2-0.20200820173131-d4a0ecd3ee70/go.mod h1: github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.3 h1:arYCVde6OHbejtz08VOtAjsw4LlMR9pQhJCkqk3bwr8= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= -github.com/charmbracelet/charm v0.7.1-0.20200821004146-148a655040c4 h1:JguzG6Hoy4qyxQeyAA4e1yQfRnBSxEMWn5CL8ATXc5o= -github.com/charmbracelet/charm v0.7.1-0.20200821004146-148a655040c4/go.mod h1:kBWrZbEyxepjFthay19UTRNslbk8LkycGIFwR822Kvg= +github.com/charmbracelet/charm v0.7.1-0.20200821194648-662b3ca6fc7e h1:3XtR0wWJVWCKiwt4acKh375nRmkuPYae6y8RsweS3AE= +github.com/charmbracelet/charm v0.7.1-0.20200821194648-662b3ca6fc7e/go.mod h1:kBWrZbEyxepjFthay19UTRNslbk8LkycGIFwR822Kvg= github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f h1:VXwz/CsPDsrqUzQhp0eOB7VviujsiWKX/3H9cJOiHqc= github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f/go.mod h1:DxzK1feHER8JTrWJ4uhme1kTGs4/ozEoQhIyYzwnew0= github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= @@ -210,8 +210,8 @@ golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200819171115-d785dc25833f h1:KJuwZVtZBVzDmEDtB2zro9CXkD9O0dpCv4o2LHbQIAw= golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200820212457-1fb795427249 h1:tKP05IMsVLZ4VeeCEFmrIUmxAAx6UD8IBdPtYlYNa8g= -golang.org/x/sys v0.0.0-20200820212457-1fb795427249/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200821140526-fda516888d29 h1:mNuhGagCf3lDDm5C0376C/sxh6V7fy9WbdEu/YDNA04= +golang.org/x/sys v0.0.0-20200821140526-fda516888d29/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/stash.go b/stash.go index 8019099..f68f6bc 100644 --- a/stash.go +++ b/stash.go @@ -36,7 +36,7 @@ var ( if err != nil { return fmt.Errorf("error reading file") } - err = cc.StashMarkdown(memo, string(b)) + _, err = cc.StashMarkdown(memo, string(b)) if err != nil { return fmt.Errorf("error stashing markdown") } diff --git a/ui/pager.go b/ui/pager.go index 72defe7..f2f6c99 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -475,13 +475,18 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { md.localPath = "" return func() tea.Msg { - err := cc.StashMarkdown(md.Note, md.Body) + newMd, err := cc.StashMarkdown(md.Note, md.Body) if err != nil { if debug { log.Println("error stashing document:", err) } return errMsg(err) } + + // We really just need to know the ID so we can operate on this newly + // stashed markdown. + md.ID = newMd.ID + return stashSuccessMsg(md) } } From 0897472ca2ae8bb030c1b0de381af6c7daeec110 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 16:10:39 -0400 Subject: [PATCH 422/911] Attempt to cleanup the Msg grab bag formatting --- ui/pager.go | 1 - ui/ui.go | 13 ++++--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index f2f6c99..50806b1 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -486,7 +486,6 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { // We really just need to know the ID so we can operate on this newly // stashed markdown. md.ID = newMd.ID - return stashSuccessMsg(md) } } diff --git a/ui/ui.go b/ui/ui.go index c932ea5..31a9d05 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -54,9 +54,6 @@ type errMsg error type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} type keygenFailedMsg struct{ err error } - -func (k keygenFailedMsg) Error() string { return k.err.Error() } - type keygenSuccessMsg struct{} type initLocalFileSearchMsg struct { cwd string @@ -66,15 +63,13 @@ type foundLocalFileMsg gitcha.SearchResult type localFileSearchFinished struct{} type gotStashMsg []*charm.Markdown type stashLoadErrMsg struct{ err error } - -func (s stashLoadErrMsg) Error() string { return s.err.Error() } - type gotNewsMsg []*charm.Markdown +type statusMessageTimeoutMsg applicationContext type newsLoadErrMsg struct{ err error } -func (s newsLoadErrMsg) Error() string { return s.err.Error() } - -type statusMessageTimeoutMsg applicationContext +func (k keygenFailedMsg) Error() string { return k.err.Error() } +func (s stashLoadErrMsg) Error() string { return s.err.Error() } +func (s newsLoadErrMsg) Error() string { return s.err.Error() } // MODEL From 9db7c2e3adbd70bd5933f88de0af243623d4d5b6 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 16:13:38 -0400 Subject: [PATCH 423/911] Make general error msg a struct for type safety --- ui/pager.go | 8 ++++---- ui/stash.go | 10 +++++----- ui/ui.go | 9 +++++---- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 50806b1..60f7434 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -431,7 +431,7 @@ func renderWithGlamour(m pagerModel, md string) tea.Cmd { if debug { log.Println("error rendering with Glamour:", err) } - return errMsg(err) + return errMsg{err} } return contentRenderedMsg(s) } @@ -440,7 +440,7 @@ func renderWithGlamour(m pagerModel, md string) tea.Cmd { func saveDocumentNote(cc *charm.Client, id int, note string) tea.Cmd { if cc == nil { return func() tea.Msg { - return errMsg(errors.New("can't set note; no charm client")) + return errMsg{errors.New("can't set note; no charm client")} } } return func() tea.Msg { @@ -448,7 +448,7 @@ func saveDocumentNote(cc *charm.Client, id int, note string) tea.Cmd { if debug { log.Println("error saving note:", err) } - return errMsg(err) + return errMsg{err} } return noteSavedMsg(&charm.Markdown{ID: id, Note: note}) } @@ -480,7 +480,7 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { if debug { log.Println("error stashing document:", err) } - return errMsg(err) + return errMsg{err} } // We really just need to know the ID so we can operate on this newly diff --git a/ui/stash.go b/ui/stash.go index 1ccbf23..7d441cc 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -764,7 +764,7 @@ func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { if debug { log.Println("error loading remote markdown:", err) } - return errMsg(err) + return errMsg{err} } return fetchedMarkdownMsg(&markdown{ @@ -777,10 +777,10 @@ func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { func loadLocalMarkdown(md *markdown) tea.Cmd { return func() tea.Msg { if md.markdownType != localMarkdown { - return errMsg(errors.New("could not load local file: not a local file")) + return errMsg{errors.New("could not load local file: not a local file")} } if md.localPath == "" { - return errMsg(errors.New("could not load file: missing path")) + return errMsg{errors.New("could not load file: missing path")} } data, err := ioutil.ReadFile(md.localPath) @@ -788,7 +788,7 @@ func loadLocalMarkdown(md *markdown) tea.Cmd { if debug { log.Println("error reading local markdown:", err) } - return errMsg(err) + return errMsg{err} } md.Body = string(data) return fetchedMarkdownMsg(md) @@ -799,7 +799,7 @@ func deleteStashedItem(cc *charm.Client, id int) tea.Cmd { return func() tea.Msg { err := cc.DeleteMarkdown(id) if err != nil { - return errMsg(err) + return errMsg{err} } return deletedStashedItemMsg(id) } diff --git a/ui/ui.go b/ui/ui.go index 31a9d05..75706b7 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -50,7 +50,7 @@ func NewProgram(style string, cfg Config) *tea.Program { // MESSAGES -type errMsg error +type errMsg struct{ err error } type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} type keygenFailedMsg struct{ err error } @@ -67,6 +67,7 @@ type gotNewsMsg []*charm.Markdown type statusMessageTimeoutMsg applicationContext type newsLoadErrMsg struct{ err error } +func (e errMsg) Error() string { return e.err.Error() } func (k keygenFailedMsg) Error() string { return k.err.Error() } func (s stashLoadErrMsg) Error() string { return s.err.Error() } func (s newsLoadErrMsg) Error() string { return s.err.Error() } @@ -407,7 +408,7 @@ func findLocalFiles() tea.Msg { if debug { log.Println("error finding local files:", err) } - return errMsg(err) + return errMsg{err} } ch, err := gitcha.FindFiles(cwd, []string{"*.md"}) @@ -440,7 +441,7 @@ func newCharmClient(identityFile *string) tea.Cmd { return func() tea.Msg { cfg, err := charm.ConfigFromEnv() if err != nil { - return errMsg(err) + return errMsg{err} } if identityFile != nil { @@ -457,7 +458,7 @@ func newCharmClient(identityFile *string) tea.Cmd { if debug { log.Println("error creating new charm client:", err) } - return errMsg(err) + return errMsg{err} } return newCharmClientMsg(cc) From d6f296c44b35123ccd4a8a7c34409a6f25bdcf6e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 16:24:37 -0400 Subject: [PATCH 424/911] Load document body before stashing when stashing from the file listing --- ui/pager.go | 52 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 60f7434..f138254 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -3,6 +3,7 @@ package ui import ( "errors" "fmt" + "io/ioutil" "log" "math" "path" @@ -455,32 +456,43 @@ func saveDocumentNote(cc *charm.Client, id int, note string) tea.Cmd { } func stashDocument(cc *charm.Client, md markdown) tea.Cmd { - if cc == nil { - return func() tea.Msg { - err := errors.New("can't stash; no charm client") - if debug { - log.Println("error stash document:", err) - } - return stashErrMsg{err} - } - } - - // Turn local markdown into a stashed markdown - md.markdownType = stashedMarkdown - md.CreatedAt = time.Now() - - // Set the note as the filename without the extension - p := md.localPath - md.Note = strings.Replace(path.Base(p), path.Ext(p), "", 1) - md.localPath = "" - return func() tea.Msg { + if cc == nil { + return func() tea.Msg { + err := errors.New("can't stash; no charm client") + if debug { + log.Println("error stash document:", err) + } + return stashErrMsg{err} + } + } + + // Is the document missing a body? If so, it likely means it needs to + // be loaded. If the document body is really empty then we'll still + // stash it. + if len(md.Body) == 0 { + data, err := ioutil.ReadFile(md.localPath) + if err != nil { + return stashErrMsg{err} + } + md.Body = string(data) + } + + // Turn local markdown into a stashed markdown + md.markdownType = stashedMarkdown + md.CreatedAt = time.Now() + + // Set the note as the filename without the extension + p := md.localPath + md.Note = strings.Replace(path.Base(p), path.Ext(p), "", 1) + md.localPath = "" + newMd, err := cc.StashMarkdown(md.Note, md.Body) if err != nil { if debug { log.Println("error stashing document:", err) } - return errMsg{err} + return stashErrMsg{err} } // We really just need to know the ID so we can operate on this newly From e01dc95d7d128471fa8921d405bdb1a4b6cbd9e5 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 16:41:06 -0400 Subject: [PATCH 425/911] Shorten status messages to 2 seconds --- ui/pager.go | 2 +- ui/stash.go | 2 +- ui/ui.go | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index f138254..1f618fe 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -269,7 +269,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { if m.statusMessageTimer != nil { m.statusMessageTimer.Stop() } - m.statusMessageTimer = time.NewTimer(time.Second * 3) + m.statusMessageTimer = time.NewTimer(statusMessageTimeout) cmds = append(cmds, waitForStatusMessageTimeout(pagerContext, m.statusMessageTimer)) case stashErrMsg: diff --git a/ui/stash.go b/ui/stash.go index 7d441cc..e36e27a 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -311,7 +311,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { if m.statusMessageTimer != nil { m.statusMessageTimer.Stop() } - m.statusMessageTimer = time.NewTimer(time.Second * 3) + m.statusMessageTimer = time.NewTimer(statusMessageTimeout) cmds = append(cmds, waitForStatusMessageTimeout(stashContext, m.statusMessageTimer)) case statusMessageTimeoutMsg: diff --git a/ui/ui.go b/ui/ui.go index 75706b7..c20a362 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -17,7 +17,10 @@ import ( te "github.com/muesli/termenv" ) -const noteCharacterLimit = 256 // should match server +const ( + noteCharacterLimit = 256 // should match server + statusMessageTimeout = time.Second * 2 // how long to show status messages like "stashed!" +) var ( config Config From 2907abd3516c5e799b71680ad236e93a0c57bbff Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 16:46:14 -0400 Subject: [PATCH 426/911] Don't show status message in file listing when stashing in pager --- ui/ui.go | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index c20a362..19a6eb5 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -335,15 +335,12 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { return m, cmd case stashSuccessMsg: - // Something was stashed. Update the stash listing. We're caching this - // here, rather than in the stash update function, because stashing - // may have occurred in the pager. + // Something was stashed. Update the stash listing but don't run an + // actual update on the stash since we don't want to trigger the status + // message and generally don't want any other effects. if m.state == stateShowDocument { - newStashModel, cmd := stashUpdate(msg, m.stash) - m.stash = newStashModel - if cmd != nil { - cmds = append(cmds, cmd) - } + md := markdown(msg) + m.stash.addMarkdowns(&md) } } From 6e36891857c31283bd866aebab920826d6709b33 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 17:21:48 -0400 Subject: [PATCH 427/911] If a file is currently mid-stash don't let the user stash it again --- ui/pager.go | 2 +- ui/stash.go | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 1f618fe..ab5330c 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -261,6 +261,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { // that of a stashed document, but don't re-render since the body is // identical to what's already rendered. m.currentDocument = markdown(msg) + m.currentDocument.localPath = "" // Show a success message to the user. m.state = pagerStateStatusMessage @@ -485,7 +486,6 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { // Set the note as the filename without the extension p := md.localPath md.Note = strings.Replace(path.Base(p), path.Ext(p), "", 1) - md.localPath = "" newMd, err := cc.StashMarkdown(md.Note, md.Body) if err != nil { diff --git a/ui/stash.go b/ui/stash.go index e36e27a..70c22d6 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -128,6 +128,9 @@ type stashModel struct { loadingFromNetwork bool // are we currently loading something from the network? loaded loadedState // what's loaded? we find out with bitmasking + // Paths to files being stashed. We treat this like a set. + filesStashing map[string]struct{} + // This is just the index of the current page in view. To get the index // of the selected item as it relates to the full set of documents we've // fetched use the mardownIndex() method of this struct. @@ -231,6 +234,7 @@ func newStashModel() stashModel { page: 1, paginator: p, loadingFromNetwork: true, + filesStashing: make(map[string]struct{}), } return m @@ -304,6 +308,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Something was stashed. Add it to the stash listing. case stashSuccessMsg: md := markdown(msg) + delete(m.filesStashing, md.localPath) // remove from the things-we're-stashing list + md.localPath = "" m.addMarkdowns(&md) m.showStatusMessage = true @@ -392,10 +398,20 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Stash case "s": md := m.selectedMarkdown() - if md != nil && md.markdownType == localMarkdown { - cmds = append(cmds, stashDocument(m.cc, *md)) + if md == nil { + break } + // if we're busy stashing this don't do it again + _, exists := m.filesStashing[md.localPath] + + if exists || md.markdownType != localMarkdown || md.localPath == "" { + break + } + + m.filesStashing[md.localPath] = struct{}{} + cmds = append(cmds, stashDocument(m.cc, *md)) + // Prompt for deletion case "x": m.hideStatusMessage() From 66dae71253d26352f1190c76ac6f7fad8aca2993 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 17:30:33 -0400 Subject: [PATCH 428/911] Show spinner in stash view while stashing --- ui/stash.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 70c22d6..4424edd 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -290,7 +290,12 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } case spinner.TickMsg: - if !m.loaded.done() || m.loadingFromNetwork || m.state == stashStateLoadingDocument { + condition := !m.loaded.done() || + m.loadingFromNetwork || + m.state == stashStateLoadingDocument || + len(m.filesStashing) > 0 + + if condition { newSpinnerModel, cmd := spinner.Update(msg, m.spinner) m.spinner = newSpinnerModel cmds = append(cmds, cmd) @@ -410,7 +415,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } m.filesStashing[md.localPath] = struct{}{} - cmds = append(cmds, stashDocument(m.cc, *md)) + cmds = append(cmds, stashDocument(m.cc, *md), spinner.Tick(m.spinner)) // Prompt for deletion case "x": @@ -547,7 +552,7 @@ func stashView(m stashModel) string { case stashStateReady, stashStateSettingNote, stashStatePromptDelete: loadingIndicator := "" - if !m.loaded.done() || m.loadingFromNetwork { + if !m.loaded.done() || m.loadingFromNetwork || len(m.filesStashing) > 0 { loadingIndicator = spinner.View(m.spinner) } From 1d434d64ad0c3a93049070b87e42f02c78337aba Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 18:06:17 -0400 Subject: [PATCH 429/911] Stashed items get a green indicator in the pager --- ui/pager.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index ab5330c..f1e327f 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -328,6 +328,15 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { // "Help" note helpNote := statusBarHelpStyle(" ? Help ") + // Status indicator; spinner or stash dot + var statusIndicator string + if m.currentDocument.markdownType == stashedMarkdown { + statusIndicator = te.String(" •"). + Foreground(common.Green.Color()). + Background(statusBarBg.Color()). + String() + } + // Note noteText := m.currentDocument.Note if len(noteText) == 0 { @@ -336,6 +345,7 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { noteText = truncate(" "+noteText+" ", max(0, m.width- ansi.PrintableRuneWidth(logo)- + ansi.PrintableRuneWidth(statusIndicator)- ansi.PrintableRuneWidth(percentText)- ansi.PrintableRuneWidth(helpNote), )) @@ -345,14 +355,16 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { padding := max(0, m.width- ansi.PrintableRuneWidth(logo)- + ansi.PrintableRuneWidth(statusIndicator)- ansi.PrintableRuneWidth(noteText)- ansi.PrintableRuneWidth(percentText)- ansi.PrintableRuneWidth(helpNote), ) emptySpace := strings.Repeat(emptyCell, padding) - fmt.Fprintf(b, "%s%s%s%s%s", + fmt.Fprintf(b, "%s%s%s%s%s%s", logo, + statusIndicator, statusBarNoteStyle(noteText), emptySpace, statusBarScrollPosStyle(percentText), From 7d67711cdf4106a8e8c5bdf77ac41da74365df03 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 21 Aug 2020 18:49:45 -0400 Subject: [PATCH 430/911] Show spinner while stashing in the pager --- ui/pager.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index f1e327f..be21b39 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -10,6 +10,7 @@ import ( "strings" "time" + "github.com/charmbracelet/bubbles/spinner" "github.com/charmbracelet/bubbles/textinput" "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" @@ -95,6 +96,7 @@ type pagerModel struct { height int textInput textinput.Model showHelp bool + spinner spinner.Model statusMessageHeader string statusMessageBody string @@ -124,11 +126,16 @@ func newPagerModel(glamourStyle string) pagerModel { ti.CharLimit = noteCharacterLimit ti.Focus() + sp := spinner.NewModel() + sp.ForegroundColor = statusBarNoteFg.String() + sp.BackgroundColor = statusBarBg.String() + return pagerModel{ state: pagerStateBrowse, glamourStyle: glamourStyle, textInput: ti, viewport: vp, + spinner: sp, } } @@ -228,7 +235,11 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { // Stash a local document if m.state != pagerStateStashing && m.currentDocument.markdownType == localMarkdown { m.state = pagerStateStashing - return m, stashDocument(m.cc, m.currentDocument) + cmds = append( + cmds, + stashDocument(m.cc, m.currentDocument), + spinner.Tick(m.spinner), + ) } case "?": m.toggleHelp() @@ -238,6 +249,13 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { } } + case spinner.TickMsg: + if m.state == pagerStateStashing { + newSpinnerModel, cmd := spinner.Update(msg, m.spinner) + m.spinner = newSpinnerModel + cmds = append(cmds, cmd) + } + // Glow has rendered the content case contentRenderedMsg: m.setContent(string(msg)) @@ -330,7 +348,9 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { // Status indicator; spinner or stash dot var statusIndicator string - if m.currentDocument.markdownType == stashedMarkdown { + if m.state == pagerStateStashing { + statusIndicator = statusBarNoteStyle(" ") + spinner.View(m.spinner) + } else if m.currentDocument.markdownType == stashedMarkdown { statusIndicator = te.String(" •"). Foreground(common.Green.Color()). Background(statusBarBg.Color()). From a10e7862cac7b89b1d3c3e1fa02be6b4b192056d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 22 Aug 2020 11:13:22 -0400 Subject: [PATCH 431/911] Update error message to match new error type --- ui/ui.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/ui.go b/ui/ui.go index 19a6eb5..89b0d74 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -416,7 +416,7 @@ func findLocalFiles() tea.Msg { if debug { log.Println("error finding local files:", err) } - return errMsg(err) + return errMsg{err} } return initLocalFileSearchMsg{ch: ch, cwd: cwd} From 4b732ada502c70229fe931d3cb2a7018332f7195 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 22 Aug 2020 11:17:05 -0400 Subject: [PATCH 432/911] Bump Termenv to 0.7.2 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 668bb86..4f44113 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/microcosm-cc/bluemonday v1.0.4 // indirect github.com/muesli/gitcha v0.0.0-20200822081321-a2a5e01d2e54 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d - github.com/muesli/termenv v0.7.0 + github.com/muesli/termenv v0.7.2 github.com/spf13/cobra v1.0.0 github.com/yuin/goldmark v1.2.1 // indirect golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a diff --git a/go.sum b/go.sum index 47c5b66..66fd132 100644 --- a/go.sum +++ b/go.sum @@ -119,6 +119,8 @@ github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5 github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.7.0 h1:KcLfgg/KICGxOxNr+P9gmkrJ5azxOm3WzkfXMePGTq4= github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= +github.com/muesli/termenv v0.7.2 h1:r1raklL3uKE7rOvWgSenmEm2px+dnc33OTisZ8YR1fw= +github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= From 5d267e900a3a9e8a3c4689e87cdf7a99883d6567 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 29 Jul 2020 13:21:56 -0400 Subject: [PATCH 433/911] Update UI image + minor copy edits --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2fa4433..fe2346a 100644 --- a/README.md +++ b/README.md @@ -10,12 +10,14 @@ Render markdown on the CLI, with _pizzazz_! Go ReportCard

-![Glow example output](https://github.com/charmbracelet/glow/raw/master/example.png) +

+ Glow UI Demo +

## What is it? Glow is a terminal based markdown reader designed from the ground up to bring -out the beauty of the CLI. +out the beauty—and power—of the CLI. Use it to quickly discover markdown files in a folder (it will automatically search subdirectories for you), read documentation directly on the command line @@ -88,7 +90,7 @@ You'll add that markdown file to your stash. Running `glow` without arguments will let you browse through all your stashed documents. This is a great way to keep track of documentation that you need to reference. -Stashing is private and your stash will not be exposed publicly. +Stashing is private and your stash and its contents will not be exposed publicly. ### Word Wrapping From 7166f99358050dff8c47f9a527ea8258cc959b71 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 29 Jul 2020 13:50:11 -0400 Subject: [PATCH 434/911] Update Charm badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fe2346a..e1307fd 100644 --- a/README.md +++ b/README.md @@ -140,6 +140,6 @@ glow --help Part of [Charm](https://charm.sh). -the Charm logo +the Charm logo Charm热爱开源! From b29f172c80d479fc548938047635ee211a1a3536 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 24 Aug 2020 17:57:08 +0200 Subject: [PATCH 435/911] Bump gitcha dep --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4f44113..6212daf 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.3.0 github.com/microcosm-cc/bluemonday v1.0.4 // indirect - github.com/muesli/gitcha v0.0.0-20200822081321-a2a5e01d2e54 + github.com/muesli/gitcha v0.1.1-0.20200824155329-3a36d51c187f github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d github.com/muesli/termenv v0.7.2 github.com/spf13/cobra v1.0.0 diff --git a/go.sum b/go.sum index 66fd132..395a3b6 100644 --- a/go.sum +++ b/go.sum @@ -107,8 +107,8 @@ github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2S github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/muesli/gitcha v0.0.0-20200822081321-a2a5e01d2e54 h1:4SwuTPgw/ctzxFNLFk/Hs397Po4QU5tlDn8EKa7T0ks= -github.com/muesli/gitcha v0.0.0-20200822081321-a2a5e01d2e54/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= +github.com/muesli/gitcha v0.1.1-0.20200824155329-3a36d51c187f h1:ok9C9DzuP6bbc2eRlaCv/fHxhplYwv+E28qt/M9epQ0= +github.com/muesli/gitcha v0.1.1-0.20200824155329-3a36d51c187f/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= From 575017eb12d5999809ef3384387922a2d10e1cbb Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 12:55:38 -0400 Subject: [PATCH 436/911] More integrated-looking stash confirmation message in pager --- ui/pager.go | 113 ++++++++++++++++++++++++++++------------------------ 1 file changed, 60 insertions(+), 53 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index be21b39..902c03d 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -42,17 +42,21 @@ var ( Background(common.Green.Color()). String() - statusBarBg = common.NewColorPair("#242424", "#E6E6E6") - statusBarNoteFg = common.NewColorPair("#7D7D7D", "#656565") - statusBarScrollPosFg = common.NewColorPair("#5A5A5A", "#949494") + statusBarBg = common.NewColorPair("#242424", "#E6E6E6") + statusBarNoteFg = common.NewColorPair("#7D7D7D", "#656565") // Styling functions - statusBarScrollPosStyle = newStyle(statusBarScrollPosFg.String(), statusBarBg.String()) - statusBarNoteStyle = newStyle(statusBarNoteFg.String(), statusBarBg.String()) - statusBarHelpStyle = newStyle(statusBarNoteFg.String(), common.NewColorPair("#323232", "#DCDCDC").String()) - statusBarMessageHeaderStyle = newStyle(common.Cream.String(), common.Green.String()) - statusBarMessageBodyStyle = newStyle(mintGreen, darkGreen) - helpViewStyle = newStyle(statusBarNoteFg.String(), common.NewColorPair("#1B1B1B", "#f2f2f2").String()) + statusBarScrollPosStyle = newStyle(common.NewColorPair("#5A5A5A", "#949494").String(), statusBarBg.String()) + statusBarNoteStyle = newStyle(statusBarNoteFg.String(), statusBarBg.String()) + statusBarHelpStyle = newStyle(statusBarNoteFg.String(), common.NewColorPair("#323232", "#DCDCDC").String()) + statusBarStashDotStyle = newStyle(common.Green.String(), statusBarBg.String()) + statusBarMessageHeaderStyle = newStyle(common.Cream.String(), common.Green.String()) + statusBarMessageBodyStyle = newStyle(mintGreen, darkGreen) + statusBarMessageStashDotStyle = newStyle(mintGreen, darkGreen) + statusBarMessageScrollPosStyle = newStyle(mintGreen, darkGreen) + statusBarMessageHelpStyle = newStyle("#B6FFE4", common.Green.String()) + + helpViewStyle = newStyle(statusBarNoteFg.String(), common.NewColorPair("#1B1B1B", "#f2f2f2").String()) ) // Create a new termenv styling function @@ -322,8 +326,6 @@ func pagerView(m pagerModel) string { switch m.state { case pagerStateSetNote: pagerSetNoteView(&b, m) - case pagerStateStatusMessage: - pagerStatusMessageView(&b, m) default: pagerStatusBarView(&b, m) } @@ -336,58 +338,86 @@ func pagerView(m pagerModel) string { } func pagerStatusBarView(b *strings.Builder, m pagerModel) { + var ( + isStashed bool = m.currentDocument.markdownType == stashedMarkdown + showStatusMessage bool = m.state == pagerStateStatusMessage + ) + // Logo logo := glowLogoView(" Glow ") // Scroll percent - scrollPercent := math.Max(0.0, math.Min(1.0, m.viewport.ScrollPercent())) - percentText := fmt.Sprintf(" %3.f%% ", scrollPercent*100) + percent := math.Max(0.0, math.Min(1.0, m.viewport.ScrollPercent())) + scrollPercent := fmt.Sprintf(" %3.f%% ", percent*100) + if showStatusMessage { + scrollPercent = statusBarMessageScrollPosStyle(scrollPercent) + } else { + scrollPercent = statusBarScrollPosStyle(scrollPercent) + } // "Help" note - helpNote := statusBarHelpStyle(" ? Help ") + var helpNote string + if showStatusMessage { + helpNote = statusBarMessageHelpStyle(" ? Help ") + } else { + helpNote = statusBarHelpStyle(" ? Help ") + } // Status indicator; spinner or stash dot var statusIndicator string if m.state == pagerStateStashing { statusIndicator = statusBarNoteStyle(" ") + spinner.View(m.spinner) - } else if m.currentDocument.markdownType == stashedMarkdown { - statusIndicator = te.String(" •"). - Foreground(common.Green.Color()). - Background(statusBarBg.Color()). - String() + } else if isStashed && showStatusMessage { + statusIndicator = statusBarMessageStashDotStyle(" •") + } else if isStashed { + statusIndicator = statusBarStashDotStyle(" •") } // Note - noteText := m.currentDocument.Note - if len(noteText) == 0 { - noteText = "(No title)" + var note string + if showStatusMessage { + note = "Stashed!" + } else { + note = m.currentDocument.Note + if len(note) == 0 { + note = "(No memo)" + } } - noteText = truncate(" "+noteText+" ", max(0, + note = truncate(" "+note+" ", max(0, m.width- ansi.PrintableRuneWidth(logo)- ansi.PrintableRuneWidth(statusIndicator)- - ansi.PrintableRuneWidth(percentText)- + ansi.PrintableRuneWidth(scrollPercent)- ansi.PrintableRuneWidth(helpNote), )) + if showStatusMessage { + note = statusBarMessageBodyStyle(note) + } else { + note = statusBarNoteStyle(note) + } // Empty space - emptyCell := te.String(" ").Background(statusBarBg.Color()).String() padding := max(0, m.width- ansi.PrintableRuneWidth(logo)- ansi.PrintableRuneWidth(statusIndicator)- - ansi.PrintableRuneWidth(noteText)- - ansi.PrintableRuneWidth(percentText)- + ansi.PrintableRuneWidth(note)- + ansi.PrintableRuneWidth(scrollPercent)- ansi.PrintableRuneWidth(helpNote), ) - emptySpace := strings.Repeat(emptyCell, padding) + emptySpace := strings.Repeat(" ", padding) + if showStatusMessage { + emptySpace = statusBarMessageBodyStyle(emptySpace) + } else { + emptySpace = statusBarNoteStyle(emptySpace) + } fmt.Fprintf(b, "%s%s%s%s%s%s", logo, statusIndicator, - statusBarNoteStyle(noteText), + note, emptySpace, - statusBarScrollPosStyle(percentText), + scrollPercent, helpNote, ) } @@ -397,29 +427,6 @@ func pagerSetNoteView(b *strings.Builder, m pagerModel) { fmt.Fprint(b, textinput.View(m.textInput)) } -func pagerStatusMessageView(b *strings.Builder, m pagerModel) { - const bodyGapWidth = 2 // extra spaces we're adding before/after the body - - header := m.statusMessageHeader - if len(header) > 0 { - header = " " + header + " " - } - body := m.statusMessageBody - bodyWidth := runewidth.StringWidth(body) - availBodySpace := m.width - runewidth.StringWidth(header) - bodyGapWidth - - if availBodySpace < runewidth.StringWidth(body) { - body = runewidth.Truncate(body, availBodySpace, "…") - } else if availBodySpace > bodyWidth { - body = " " + body + " " + strings.Repeat(" ", availBodySpace-bodyWidth) - } - - if len(header) > 0 { - fmt.Fprintf(b, statusBarMessageHeaderStyle(header)) - } - fmt.Fprintf(b, statusBarMessageBodyStyle(body)) -} - func pagerHelpView(m pagerModel, width int) (s string) { col1 := [...]string{ "m set memo", From d7974f035cbc32318648feb063686a291cd79998 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 14:56:23 -0400 Subject: [PATCH 437/911] When stashing, replace local file with stashed file in the file listing --- ui/pager.go | 8 ++++--- ui/stash.go | 60 ++++++++++++++++++++++++++++++++++++++++--------- ui/stashitem.go | 2 +- ui/ui.go | 1 + 4 files changed, 56 insertions(+), 15 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 902c03d..e28d2eb 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -283,7 +283,6 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { // that of a stashed document, but don't re-render since the body is // identical to what's already rendered. m.currentDocument = markdown(msg) - m.currentDocument.localPath = "" // Show a success message to the user. m.state = pagerStateStatusMessage @@ -513,13 +512,16 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { if len(md.Body) == 0 { data, err := ioutil.ReadFile(md.localPath) if err != nil { + if debug { + log.Println("error loading doucument body for stashing:", err) + } return stashErrMsg{err} } md.Body = string(data) } - // Turn local markdown into a stashed markdown - md.markdownType = stashedMarkdown + // Turn local markdown into a newly stashed (converted) markdown + md.markdownType = convertedMarkdown md.CreatedAt = time.Now() // Set the note as the filename without the extension diff --git a/ui/stash.go b/ui/stash.go index 4424edd..ef7651a 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -51,36 +51,41 @@ const ( stashedMarkdown markdownType = iota newsMarkdown localMarkdown + convertedMarkdown // used to be local, now its stashed ) // markdown wraps charm.Markdown so we can differentiate between stashed items // and news. type markdown struct { markdownType markdownType - localPath string // only relevent to local files + localPath string // only relevent to local files and converted files that are newly stashed charm.Markdown } +func (m markdown) sortAsLocal() bool { + return m.markdownType == localMarkdown || m.markdownType == convertedMarkdown +} + // Sort documents with local files first, then by date type markdownsByLocalFirst []*markdown func (m markdownsByLocalFirst) Len() int { return len(m) } func (m markdownsByLocalFirst) Swap(i, j int) { m[i], m[j] = m[j], m[i] } func (m markdownsByLocalFirst) Less(i, j int) bool { - iType := m[i].markdownType - jType := m[j].markdownType + iIsLocal := m[i].sortAsLocal() + jIsLocal := m[j].sortAsLocal() - // Local files come first - if iType == localMarkdown && jType != localMarkdown { + // Local files (and files that used to be local) come first + if iIsLocal && !jIsLocal { return true } - if iType != localMarkdown && jType == localMarkdown { + if !iIsLocal && jIsLocal { return false } // If both are local files, sort by filename. Note that we should never // hit equality here since two files can't have the same path. - if iType == localMarkdown && jType == localMarkdown { + if iIsLocal && jIsLocal { return strings.Compare(m[i].localPath, m[j].localPath) == -1 } @@ -191,6 +196,34 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) { } } +// find a local markdown by its path and remove it +func (m *stashModel) removeLocalMarkdown(localPath string) error { + i := -1 + + // Look for local markdown + for j, doc := range m.markdowns { + if doc.localPath == localPath { + i = j + break + } + } + + // Did we find it? + if i == -1 { + err := fmt.Errorf("could't find local markdown %s; not removing from stash", localPath) + if debug { + log.Println(err) + } + return err + } + + // Slice out markdown + if i >= 0 { + m.markdowns = append(m.markdowns[:i], m.markdowns[i+1:]...) + } + return nil +} + // return the number of markdown documents of a given type func (m stashModel) countMarkdowns(t markdownType) (found int) { if len(m.markdowns) == 0 { @@ -314,7 +347,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case stashSuccessMsg: md := markdown(msg) delete(m.filesStashing, md.localPath) // remove from the things-we're-stashing list - md.localPath = "" + + _ = m.removeLocalMarkdown(md.localPath) m.addMarkdowns(&md) m.showStatusMessage = true @@ -410,7 +444,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // if we're busy stashing this don't do it again _, exists := m.filesStashing[md.localPath] - if exists || md.markdownType != localMarkdown || md.localPath == "" { + if exists || (md.markdownType != localMarkdown) || md.localPath == "" { + if md.localPath == "" { + log.Printf("refusing to load markdown; local path is empty: %#v", md) + } break } @@ -421,7 +458,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case "x": m.hideStatusMessage() - isUserMarkdown := m.selectedMarkdown().markdownType == stashedMarkdown + t := m.selectedMarkdown().markdownType + isUserMarkdown := t == stashedMarkdown || t == convertedMarkdown isValidState := m.state != stashStateSettingNote if isUserMarkdown && isValidState { @@ -775,7 +813,7 @@ func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { err error ) - if t == stashedMarkdown { + if t == stashedMarkdown || t == convertedMarkdown { md, err = cc.GetStashMarkdown(id) } else { md, err = cc.GetNewsMarkdown(id) diff --git a/ui/stashitem.go b/ui/stashitem.go index a488392..8d32b6b 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -46,7 +46,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { } else { title = newsPrefix + truncate(title, truncateTo-rw.StringWidth(newsPrefix)) } - case stashedMarkdown: + case stashedMarkdown, convertedMarkdown: icon = stashIcon icon = stashIcon if title == "" { diff --git a/ui/ui.go b/ui/ui.go index 89b0d74..d5914f9 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -340,6 +340,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // message and generally don't want any other effects. if m.state == stateShowDocument { md := markdown(msg) + _ = m.stash.removeLocalMarkdown(md.localPath) m.stash.addMarkdowns(&md) } } From 2e7b0ec60fae168c9bac3da11167785864f3e4ed Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 15:14:47 -0400 Subject: [PATCH 438/911] Fix regression where items stashed in the pager were treated as local --- ui/pager.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index e28d2eb..797f0dc 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -215,8 +215,11 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { return m, nil } case "m": + isStashed := m.currentDocument.markdownType == stashedMarkdown || + m.currentDocument.markdownType == convertedMarkdown + // Users can only set the note on user-stashed markdown - if m.currentDocument.markdownType != stashedMarkdown { + if !isStashed { break } @@ -338,7 +341,7 @@ func pagerView(m pagerModel) string { func pagerStatusBarView(b *strings.Builder, m pagerModel) { var ( - isStashed bool = m.currentDocument.markdownType == stashedMarkdown + isStashed bool = m.currentDocument.markdownType == stashedMarkdown || m.currentDocument.markdownType == convertedMarkdown showStatusMessage bool = m.state == pagerStateStatusMessage ) From 089b66f622b835c830316c0d2118d82bb0ae5811 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 15:43:08 -0400 Subject: [PATCH 439/911] Fix extreme edge case error logging where local file has no path --- ui/stash.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index ef7651a..3b4c80d 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -445,7 +445,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { _, exists := m.filesStashing[md.localPath] if exists || (md.markdownType != localMarkdown) || md.localPath == "" { - if md.localPath == "" { + if md.markdownType == localMarkdown && md.localPath == "" { log.Printf("refusing to load markdown; local path is empty: %#v", md) } break From e9c47a185fa28a960fb637b37569753d522d6662 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 15:49:26 -0400 Subject: [PATCH 440/911] Be specific that we're deleting only from the stash --- ui/stash.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 3b4c80d..c5f3557 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -608,7 +608,7 @@ func stashView(m stashModel) string { } else { switch m.state { case stashStatePromptDelete: - header = redFg("Delete this item? ") + faintRedFg("(y/N)") + header = redFg("Delete this item from your stash? ") + faintRedFg("(y/N)") case stashStateSettingNote: header = yellowFg("Set the memo for this item?") } From cdf11136f460c8ec3f6b1497f81cba643632f4da Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 15:59:28 -0400 Subject: [PATCH 441/911] Log when stash item deletions fail --- ui/stash.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ui/stash.go b/ui/stash.go index c5f3557..35a6cc0 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -858,6 +858,9 @@ func deleteStashedItem(cc *charm.Client, id int) tea.Cmd { return func() tea.Msg { err := cc.DeleteMarkdown(id) if err != nil { + if err == nil { + log.Println("could not delete stashed item:", err) + } return errMsg{err} } return deletedStashedItemMsg(id) From 2fdef6447895d49114d323dc9aaa725169a75b23 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 15:59:42 -0400 Subject: [PATCH 442/911] Stashed docs become local upon delete if they were stashed in-session --- ui/stash.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 35a6cc0..d2ccfe6 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -522,9 +522,15 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { i := m.markdownIndex() id := m.markdowns[i].ID - // Delete optimistically and remove the stashed item - // before we've received a success response. - m.markdowns = append(m.markdowns[:i], m.markdowns[i+1:]...) + if m.markdowns[i].markdownType == convertedMarkdown { + // If document was stashed during this session, convert it + // back to a local file. + m.markdowns[i].markdownType = localMarkdown + } else { + // Delete optimistically and remove the stashed item + // before we've received a success response. + m.markdowns = append(m.markdowns[:i], m.markdowns[i+1:]...) + } // Update pagination m.paginator.SetTotalPages(len(m.markdowns)) From c0daa74358d187127a317db7be5e2f4736b94cf2 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 16:07:43 -0400 Subject: [PATCH 443/911] Add periods to comments to make the linter happy --- ui/pager.go | 6 +++--- ui/stash.go | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 797f0dc..9a12390 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -45,7 +45,7 @@ var ( statusBarBg = common.NewColorPair("#242424", "#E6E6E6") statusBarNoteFg = common.NewColorPair("#7D7D7D", "#656565") - // Styling functions + // Styling functions. statusBarScrollPosStyle = newStyle(common.NewColorPair("#5A5A5A", "#949494").String(), statusBarBg.String()) statusBarNoteStyle = newStyle(statusBarNoteFg.String(), statusBarBg.String()) statusBarHelpStyle = newStyle(statusBarNoteFg.String(), common.NewColorPair("#323232", "#DCDCDC").String()) @@ -59,7 +59,7 @@ var ( helpViewStyle = newStyle(statusBarNoteFg.String(), common.NewColorPair("#1B1B1B", "#f2f2f2").String()) ) -// Create a new termenv styling function +// Create a new termenv styling function. func newStyle(fg, bg string) func(string) string { return te.Style{}. Foreground(te.ColorProfile().Color(fg)). @@ -546,7 +546,7 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { } } -// This is where the magic happens +// This is where the magic happens. func glamourRender(m pagerModel, markdown string) (string, error) { if !config.GlamourEnabled { diff --git a/ui/stash.go b/ui/stash.go index d2ccfe6..81080a4 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -58,7 +58,7 @@ const ( // and news. type markdown struct { markdownType markdownType - localPath string // only relevent to local files and converted files that are newly stashed + localPath string // only relevant to local files and converted files that are newly stashed charm.Markdown } @@ -66,7 +66,7 @@ func (m markdown) sortAsLocal() bool { return m.markdownType == localMarkdown || m.markdownType == convertedMarkdown } -// Sort documents with local files first, then by date +// Sort documents with local files first, then by date. type markdownsByLocalFirst []*markdown func (m markdownsByLocalFirst) Len() int { return len(m) } @@ -173,12 +173,12 @@ func (m *stashModel) setSize(width, height int) { } } -// markdownIndex returns the index of the currently selected markdown item. +// MarkdownIndex returns the index of the currently selected markdown item. func (m stashModel) markdownIndex() int { return m.paginator.Page*m.paginator.PerPage + m.index } -// return the current selected markdown in the stash +// Return the current selected markdown in the stash. func (m stashModel) selectedMarkdown() *markdown { i := m.markdownIndex() if i < 0 || len(m.markdowns) == 0 || len(m.markdowns) <= i { @@ -187,7 +187,7 @@ func (m stashModel) selectedMarkdown() *markdown { return m.markdowns[i] } -// adds markdown documents to the model +// Adds markdown documents to the model. func (m *stashModel) addMarkdowns(mds ...*markdown) { if len(mds) > 0 { m.markdowns = append(m.markdowns, mds...) @@ -196,7 +196,7 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) { } } -// find a local markdown by its path and remove it +// Find a local markdown by its path and remove it. func (m *stashModel) removeLocalMarkdown(localPath string) error { i := -1 @@ -224,7 +224,7 @@ func (m *stashModel) removeLocalMarkdown(localPath string) error { return nil } -// return the number of markdown documents of a given type +// Return the number of markdown documents of a given type. func (m stashModel) countMarkdowns(t markdownType) (found int) { if len(m.markdowns) == 0 { return From 23817355c6d9bcbdbd37c9a6fbf41de817036c81 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 16:08:28 -0400 Subject: [PATCH 444/911] Remove unnecessary conversion --- ui/pager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index 9a12390..8b2949a 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -576,7 +576,7 @@ func glamourRender(m pagerModel, markdown string) (string, error) { } // trim lines - lines := strings.Split(string(out), "\n") + lines := strings.Split(out, "\n") var content string for i, s := range lines { From a02cc010498cf4c2c26a00f87d7679efacf4d996 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 16:10:06 -0400 Subject: [PATCH 445/911] Pull an always-nil return value --- ui/ui.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index d5914f9..eddfd63 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -272,10 +272,8 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // We found a local file case foundLocalFileMsg: - pathStr, err := localFileToMarkdown(m.cwd, gitcha.SearchResult(msg)) - if err == nil { - m.stash.addMarkdowns(pathStr) - } + newMd := localFileToMarkdown(m.cwd, gitcha.SearchResult(msg)) + m.stash.addMarkdowns(newMd) cmds = append(cmds, findNextLocalFile(m)) case sshAuthErrMsg: @@ -515,7 +513,7 @@ func waitForStatusMessageTimeout(appCtx applicationContext, t *time.Timer) tea.C // Convert local file path to Markdown. Note that we could be doing things // like checking if the file is a directory, but we trust that gitcha has // already done that. -func localFileToMarkdown(cwd string, res gitcha.SearchResult) (*markdown, error) { +func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { md := &markdown{ markdownType: localMarkdown, localPath: res.Path, @@ -529,7 +527,7 @@ func localFileToMarkdown(cwd string, res gitcha.SearchResult) (*markdown, error) t := res.Info.ModTime() md.CreatedAt = t - return md, nil + return md } func indent(s string, n int) string { From 82acc627831c6dfb1e1c3f73dbb8f8db3e1bba24 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 16:48:10 -0400 Subject: [PATCH 446/911] Move common commands to the main UI file --- ui/pager.go | 71 +---------------------------------------------------- ui/stash.go | 2 +- ui/ui.go | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 71 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 8b2949a..6eb2099 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -1,12 +1,9 @@ package ui import ( - "errors" "fmt" - "io/ioutil" "log" "math" - "path" "strings" "time" @@ -465,7 +462,7 @@ func pagerHelpView(m pagerModel, width int) (s string) { return helpViewStyle(s) } -// CMD +// COMMANDS func renderWithGlamour(m pagerModel, md string) tea.Cmd { return func() tea.Msg { @@ -480,72 +477,6 @@ func renderWithGlamour(m pagerModel, md string) tea.Cmd { } } -func saveDocumentNote(cc *charm.Client, id int, note string) tea.Cmd { - if cc == nil { - return func() tea.Msg { - return errMsg{errors.New("can't set note; no charm client")} - } - } - return func() tea.Msg { - if err := cc.SetMarkdownNote(id, note); err != nil { - if debug { - log.Println("error saving note:", err) - } - return errMsg{err} - } - return noteSavedMsg(&charm.Markdown{ID: id, Note: note}) - } -} - -func stashDocument(cc *charm.Client, md markdown) tea.Cmd { - return func() tea.Msg { - if cc == nil { - return func() tea.Msg { - err := errors.New("can't stash; no charm client") - if debug { - log.Println("error stash document:", err) - } - return stashErrMsg{err} - } - } - - // Is the document missing a body? If so, it likely means it needs to - // be loaded. If the document body is really empty then we'll still - // stash it. - if len(md.Body) == 0 { - data, err := ioutil.ReadFile(md.localPath) - if err != nil { - if debug { - log.Println("error loading doucument body for stashing:", err) - } - return stashErrMsg{err} - } - md.Body = string(data) - } - - // Turn local markdown into a newly stashed (converted) markdown - md.markdownType = convertedMarkdown - md.CreatedAt = time.Now() - - // Set the note as the filename without the extension - p := md.localPath - md.Note = strings.Replace(path.Base(p), path.Ext(p), "", 1) - - newMd, err := cc.StashMarkdown(md.Note, md.Body) - if err != nil { - if debug { - log.Println("error stashing document:", err) - } - return stashErrMsg{err} - } - - // We really just need to know the ID so we can operate on this newly - // stashed markdown. - md.ID = newMd.ID - return stashSuccessMsg(md) - } -} - // This is where the magic happens. func glamourRender(m pagerModel, markdown string) (string, error) { diff --git a/ui/stash.go b/ui/stash.go index 81080a4..1062df9 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -810,7 +810,7 @@ func stashHelpViewBuilder(windowWidth int, sections ...string) string { return s } -// CMD +// COMMANDS func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { return func() tea.Msg { diff --git a/ui/ui.go b/ui/ui.go index eddfd63..fbc6352 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -3,8 +3,10 @@ package ui import ( "errors" "fmt" + "io/ioutil" "log" "os" + "path" "strings" "time" @@ -501,6 +503,72 @@ func generateSSHKeys() tea.Msg { return keygenSuccessMsg{} } +func saveDocumentNote(cc *charm.Client, id int, note string) tea.Cmd { + if cc == nil { + return func() tea.Msg { + return errMsg{errors.New("can't set note; no charm client")} + } + } + return func() tea.Msg { + if err := cc.SetMarkdownNote(id, note); err != nil { + if debug { + log.Println("error saving note:", err) + } + return errMsg{err} + } + return noteSavedMsg(&charm.Markdown{ID: id, Note: note}) + } +} + +func stashDocument(cc *charm.Client, md markdown) tea.Cmd { + return func() tea.Msg { + if cc == nil { + return func() tea.Msg { + err := errors.New("can't stash; no charm client") + if debug { + log.Println("error stash document:", err) + } + return stashErrMsg{err} + } + } + + // Is the document missing a body? If so, it likely means it needs to + // be loaded. If the document body is really empty then we'll still + // stash it. + if len(md.Body) == 0 { + data, err := ioutil.ReadFile(md.localPath) + if err != nil { + if debug { + log.Println("error loading doucument body for stashing:", err) + } + return stashErrMsg{err} + } + md.Body = string(data) + } + + // Turn local markdown into a newly stashed (converted) markdown + md.markdownType = convertedMarkdown + md.CreatedAt = time.Now() + + // Set the note as the filename without the extension + p := md.localPath + md.Note = strings.Replace(path.Base(p), path.Ext(p), "", 1) + + newMd, err := cc.StashMarkdown(md.Note, md.Body) + if err != nil { + if debug { + log.Println("error stashing document:", err) + } + return stashErrMsg{err} + } + + // We really just need to know the ID so we can operate on this newly + // stashed markdown. + md.ID = newMd.ID + return stashSuccessMsg(md) + } +} + func waitForStatusMessageTimeout(appCtx applicationContext, t *time.Timer) tea.Cmd { return func() tea.Msg { <-t.C From 5515460f32e971a0e37fd134c139def0591d2c55 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 17:00:27 -0400 Subject: [PATCH 447/911] Fix regression where note-setting on newly stashed items couldn't be done --- ui/stash.go | 4 ++-- ui/ui.go | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 1062df9..9dba650 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -423,7 +423,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.hideStatusMessage() md := m.selectedMarkdown() - isUserMarkdown := md.markdownType == stashedMarkdown + isUserMarkdown := md.markdownType == stashedMarkdown || md.markdownType == convertedMarkdown isSettingNote := m.state == stashStateSettingNote isPromptingDelete := m.state == stashStatePromptDelete @@ -441,7 +441,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { break } - // if we're busy stashing this don't do it again + // If we're busy stashing this don't do it again _, exists := m.filesStashing[md.localPath] if exists || (md.markdownType != localMarkdown) || md.localPath == "" { diff --git a/ui/ui.go b/ui/ui.go index fbc6352..7af03bd 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -598,6 +598,7 @@ func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { return md } +// Lightweight version of reflow's indent function. func indent(s string, n int) string { if n <= 0 || s == "" { return s From 2f9babce8054604ed8bcaa7265c20f9a77fb79b4 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 17:34:15 -0400 Subject: [PATCH 448/911] Restore original displayed path when deleting a newly stashed item --- ui/stash.go | 2 ++ ui/ui.go | 9 +++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 9dba650..9ea5876 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -59,6 +59,7 @@ const ( type markdown struct { markdownType markdownType localPath string // only relevant to local files and converted files that are newly stashed + displayPath string // what we show in the note field charm.Markdown } @@ -526,6 +527,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // If document was stashed during this session, convert it // back to a local file. m.markdowns[i].markdownType = localMarkdown + m.markdowns[i].Note = m.markdowns[i].displayPath } else { // Delete optimistically and remove the stashed item // before we've received a success response. diff --git a/ui/ui.go b/ui/ui.go index 7af03bd..52251c6 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -585,15 +585,12 @@ func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { md := &markdown{ markdownType: localMarkdown, localPath: res.Path, + displayPath: strings.Replace(res.Path, cwd+"/", "", -1), // strip absolute path Markdown: charm.Markdown{}, } - // Strip absolute path - md.Markdown.Note = strings.Replace(res.Path, cwd+"/", "", -1) - - // Get last modified time - t := res.Info.ModTime() - md.CreatedAt = t + md.Markdown.Note = md.displayPath + md.CreatedAt = res.Info.ModTime() // last modified time return md } From cdc55a4b28451409d35ddc5e7ff2a119f0dd9cb5 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 20:06:26 -0400 Subject: [PATCH 449/911] Always show spinner for a minimum amount of time when stashing --- go.mod | 2 +- go.sum | 8 ++---- ui/pager.go | 70 ++++++++++++++++++++++++++++++++++++----------------- 3 files changed, 51 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index 6212daf..3a84d48 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/alecthomas/chroma v0.8.0 // indirect - github.com/charmbracelet/bubbles v0.5.2-0.20200820173131-d4a0ecd3ee70 + github.com/charmbracelet/bubbles v0.5.2-0.20200825000354-e8526ec4ef07 github.com/charmbracelet/bubbletea v0.10.3 github.com/charmbracelet/charm v0.7.1-0.20200821194648-662b3ca6fc7e github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f diff --git a/go.sum b/go.sum index 395a3b6..ecfafe3 100644 --- a/go.sum +++ b/go.sum @@ -21,8 +21,8 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.5.1/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= -github.com/charmbracelet/bubbles v0.5.2-0.20200820173131-d4a0ecd3ee70 h1:AqQiGoDkSIpg+aXxA6h/D7YJjB9n6a7C4vomj2Fvd1s= -github.com/charmbracelet/bubbles v0.5.2-0.20200820173131-d4a0ecd3ee70/go.mod h1:a5j/GSk+sC2NBXqNXHeaYBDqutH+vd5eFX7Hl5tSmFo= +github.com/charmbracelet/bubbles v0.5.2-0.20200825000354-e8526ec4ef07 h1:UDzKMYtj4Yy8/YDGCpTiZzbI0Ai0O9SGZM3R5oer4Dk= +github.com/charmbracelet/bubbles v0.5.2-0.20200825000354-e8526ec4ef07/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.3 h1:arYCVde6OHbejtz08VOtAjsw4LlMR9pQhJCkqk3bwr8= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= @@ -65,7 +65,6 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f h1:5CjVwnuUcp5adK4gmY6i72gpVFVnZDP2h5TmPScB6u4= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -117,7 +116,6 @@ github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d/go.mod h1:I9bWAt7Q github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= -github.com/muesli/termenv v0.7.0 h1:KcLfgg/KICGxOxNr+P9gmkrJ5azxOm3WzkfXMePGTq4= github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/muesli/termenv v0.7.2 h1:r1raklL3uKE7rOvWgSenmEm2px+dnc33OTisZ8YR1fw= github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= @@ -180,7 +178,6 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -210,7 +207,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200819171115-d785dc25833f h1:KJuwZVtZBVzDmEDtB2zro9CXkD9O0dpCv4o2LHbQIAw= golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200821140526-fda516888d29 h1:mNuhGagCf3lDDm5C0376C/sxh6V7fy9WbdEu/YDNA04= golang.org/x/sys v0.0.0-20200821140526-fda516888d29/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/ui/pager.go b/ui/pager.go index 6eb2099..7d7f9bf 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -85,6 +85,7 @@ const ( pagerStateBrowse pagerState = iota pagerStateSetNote pagerStateStashing + pagerStateStashSuccess pagerStateStatusMessage ) @@ -95,8 +96,8 @@ type pagerModel struct { glamourStyle string width int height int - textInput textinput.Model showHelp bool + textInput textinput.Model spinner spinner.Model statusMessageHeader string @@ -106,6 +107,10 @@ type pagerModel struct { // Current document being rendered, sans-glamour rendering. We cache // it here so we can re-render it on resize. currentDocument markdown + + // Newly stashed markdown. We store it here temporarily so we can replace + // currentDocument above after a stash. + stashedDocument *markdown } func newPagerModel(glamourStyle string) pagerModel { @@ -130,6 +135,7 @@ func newPagerModel(glamourStyle string) pagerModel { sp := spinner.NewModel() sp.ForegroundColor = statusBarNoteFg.String() sp.BackgroundColor = statusBarBg.String() + sp.MinimumLifetime = time.Millisecond * 180 return pagerModel{ state: pagerStateBrowse, @@ -164,6 +170,23 @@ func (m *pagerModel) toggleHelp() { } } +// Perform stuff that needs to happen after a successful markdown stash. Note +// that the the returned command should be sent back the through the pager +// update function. +func (m *pagerModel) showStatusMessage(statusMessage string) tea.Cmd { + + // Show a success message to the user + m.state = pagerStateStatusMessage + m.statusMessageHeader = statusMessage + m.statusMessageBody = "" + if m.statusMessageTimer != nil { + m.statusMessageTimer.Stop() + } + m.statusMessageTimer = time.NewTimer(statusMessageTimeout) + + return waitForStatusMessageTimeout(pagerContext, m.statusMessageTimer) +} + func (m *pagerModel) unload() { if m.showHelp { m.toggleHelp() @@ -239,6 +262,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { // Stash a local document if m.state != pagerStateStashing && m.currentDocument.markdownType == localMarkdown { m.state = pagerStateStashing + m.spinner.Start() cmds = append( cmds, stashDocument(m.cc, m.currentDocument), @@ -254,10 +278,16 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { } case spinner.TickMsg: - if m.state == pagerStateStashing { + if m.state == pagerStateStashing || !m.spinner.MinimumLifetimeReached() { newSpinnerModel, cmd := spinner.Update(msg, m.spinner) m.spinner = newSpinnerModel cmds = append(cmds, cmd) + } else if m.state == pagerStateStashSuccess && m.spinner.MinimumLifetimeReached() { + m.state = pagerStateBrowse + m.currentDocument = *m.stashedDocument + m.stashedDocument = nil + cmd := m.showStatusMessage("Stashed!") + cmds = append(cmds, cmd) } // Glow has rendered the content @@ -274,25 +304,19 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { case stashSuccessMsg: // Stashing was successful. Convert the loaded document to a stashed - // one. Note that we're also handling this message in the main update - // function where we're adding this stashed item to the stash listing. - - m.state = pagerStateBrowse - - // Replace the current document in the state so its metadata becomes - // that of a stashed document, but don't re-render since the body is - // identical to what's already rendered. - m.currentDocument = markdown(msg) - - // Show a success message to the user. - m.state = pagerStateStatusMessage - m.statusMessageHeader = "Stashed!" - m.statusMessageBody = "" - if m.statusMessageTimer != nil { - m.statusMessageTimer.Stop() + // one and show a status message. Note that we're also handling this + // message in the main update function where we're adding this stashed + // item to the stash listing. + m.state = pagerStateStashSuccess + if m.spinner.MinimumLifetimeReached() { + m.state = pagerStateBrowse + m.currentDocument = markdown(msg) + cmd := m.showStatusMessage("Stashed!") + cmds = append(cmds, cmd) + } else { + md := markdown(msg) + m.stashedDocument = &md } - m.statusMessageTimer = time.NewTimer(statusMessageTimeout) - cmds = append(cmds, waitForStatusMessageTimeout(pagerContext, m.statusMessageTimer)) case stashErrMsg: // TODO @@ -364,8 +388,10 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { // Status indicator; spinner or stash dot var statusIndicator string - if m.state == pagerStateStashing { - statusIndicator = statusBarNoteStyle(" ") + spinner.View(m.spinner) + if m.state == pagerStateStashing || m.state == pagerStateStashSuccess { + if !m.spinner.Hidden() { + statusIndicator = statusBarNoteStyle(" ") + spinner.View(m.spinner) + } } else if isStashed && showStatusMessage { statusIndicator = statusBarMessageStashDotStyle(" •") } else if isStashed { From 60b1d6a6df4a48e642737afe387ebedde232385f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 24 Aug 2020 23:26:37 -0400 Subject: [PATCH 450/911] Fix bug where user couldn't exit pager in various stash-related states --- ui/ui.go | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 52251c6..f61ecaf 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -216,8 +216,17 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case stateShowDocument: switch m.pager.state { - // If browsing, these keys have special cases - case pagerStateBrowse: + // If setting a note send all keys straight through + case pagerStateSetNote: + var batch []tea.Cmd + newPagerModel, cmd := pagerUpdate(msg, m.pager) + m.pager = newPagerModel + batch = append(batch, cmd) + return m, tea.Batch(batch...) + + // Otherwise let the user exit the view or application as + // normal. + default: switch msg.String() { case "q": return m, tea.Quit @@ -226,14 +235,6 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { batch = m.unloadDocument() return m, tea.Batch(batch...) } - - // If setting a note send all keys straight through - case pagerStateSetNote: - var batch []tea.Cmd - newPagerModel, cmd := pagerUpdate(msg, m.pager) - m.pager = newPagerModel - batch = append(batch, cmd) - return m, tea.Batch(batch...) } } @@ -241,7 +242,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { return m, tea.Quit case "left", "h", "delete": - if m.state == stateShowDocument && (m.pager.state == pagerStateBrowse || m.pager.state == pagerStateStatusMessage) { + if m.state == stateShowDocument && m.pager.state != pagerStateSetNote { cmds = append(cmds, m.unloadDocument()...) return m, tea.Batch(cmds...) } From 912c80651a9331954263dfd125e72abd9b6435b3 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 25 Aug 2020 09:40:53 -0400 Subject: [PATCH 451/911] Apply fine-grained spinner display rules to file listing view --- go.mod | 2 +- go.sum | 4 ++-- ui/pager.go | 9 +++++---- ui/stash.go | 36 +++++++++++++++++++++++------------- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 3a84d48..f864738 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/alecthomas/chroma v0.8.0 // indirect - github.com/charmbracelet/bubbles v0.5.2-0.20200825000354-e8526ec4ef07 + github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514 github.com/charmbracelet/bubbletea v0.10.3 github.com/charmbracelet/charm v0.7.1-0.20200821194648-662b3ca6fc7e github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f diff --git a/go.sum b/go.sum index ecfafe3..03dcdef 100644 --- a/go.sum +++ b/go.sum @@ -21,8 +21,8 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.5.1/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= -github.com/charmbracelet/bubbles v0.5.2-0.20200825000354-e8526ec4ef07 h1:UDzKMYtj4Yy8/YDGCpTiZzbI0Ai0O9SGZM3R5oer4Dk= -github.com/charmbracelet/bubbles v0.5.2-0.20200825000354-e8526ec4ef07/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= +github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514 h1:bX+1jBgHjwf6X42XOZF5LZEHHU8AuCaXIjgoEFB8pM0= +github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.3 h1:arYCVde6OHbejtz08VOtAjsw4LlMR9pQhJCkqk3bwr8= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= diff --git a/ui/pager.go b/ui/pager.go index 7d7f9bf..2d9c4e9 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -135,6 +135,7 @@ func newPagerModel(glamourStyle string) pagerModel { sp := spinner.NewModel() sp.ForegroundColor = statusBarNoteFg.String() sp.BackgroundColor = statusBarBg.String() + sp.HideFor = time.Millisecond * 50 sp.MinimumLifetime = time.Millisecond * 180 return pagerModel{ @@ -278,11 +279,11 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { } case spinner.TickMsg: - if m.state == pagerStateStashing || !m.spinner.MinimumLifetimeReached() { + if m.state == pagerStateStashing || m.spinner.Visible() { newSpinnerModel, cmd := spinner.Update(msg, m.spinner) m.spinner = newSpinnerModel cmds = append(cmds, cmd) - } else if m.state == pagerStateStashSuccess && m.spinner.MinimumLifetimeReached() { + } else if m.state == pagerStateStashSuccess && !m.spinner.Visible() { m.state = pagerStateBrowse m.currentDocument = *m.stashedDocument m.stashedDocument = nil @@ -308,7 +309,7 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { // message in the main update function where we're adding this stashed // item to the stash listing. m.state = pagerStateStashSuccess - if m.spinner.MinimumLifetimeReached() { + if !m.spinner.Visible() { m.state = pagerStateBrowse m.currentDocument = markdown(msg) cmd := m.showStatusMessage("Stashed!") @@ -389,7 +390,7 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { // Status indicator; spinner or stash dot var statusIndicator string if m.state == pagerStateStashing || m.state == pagerStateStashSuccess { - if !m.spinner.Hidden() { + if m.spinner.Visible() { statusIndicator = statusBarNoteStyle(" ") + spinner.View(m.spinner) } } else if isStashed && showStatusMessage { diff --git a/ui/stash.go b/ui/stash.go index 9ea5876..ccaa0e8 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -132,9 +132,10 @@ type stashModel struct { terminalHeight int stashFullyLoaded bool // have we loaded everything from the server? loadingFromNetwork bool // are we currently loading something from the network? - loaded loadedState // what's loaded? we find out with bitmasking + loaded loadedState // tracks news, stash and local files loading; we find out with bitmasking - // Paths to files being stashed. We treat this like a set. + // Paths to files being stashed. We treat this like a set, ignoring the + // value portion with an empty struct. filesStashing map[string]struct{} // This is just the index of the current page in view. To get the index @@ -248,9 +249,12 @@ func (m *stashModel) hideStatusMessage() { // INIT func newStashModel() stashModel { - s := spinner.NewModel() - s.Frames = spinner.Line - s.ForegroundColor = common.SpinnerColor.String() + sp := spinner.NewModel() + sp.Frames = spinner.Line + sp.ForegroundColor = common.SpinnerColor.String() + sp.HideFor = time.Millisecond * 50 + sp.MinimumLifetime = time.Millisecond * 180 + sp.Start() p := paginator.NewModel() p.Type = paginator.Dots @@ -263,7 +267,7 @@ func newStashModel() stashModel { ni.Focus() m := stashModel{ - spinner: s, + spinner: sp, noteInput: ni, page: 1, paginator: p, @@ -327,7 +331,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { condition := !m.loaded.done() || m.loadingFromNetwork || m.state == stashStateLoadingDocument || - len(m.filesStashing) > 0 + len(m.filesStashing) > 0 || + m.spinner.Visible() if condition { newSpinnerModel, cmd := spinner.Update(msg, m.spinner) @@ -442,18 +447,23 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { break } - // If we're busy stashing this don't do it again - _, exists := m.filesStashing[md.localPath] + _, exists := m.filesStashing[md.localPath] // is the file currently being stashed? if exists || (md.markdownType != localMarkdown) || md.localPath == "" { if md.markdownType == localMarkdown && md.localPath == "" { - log.Printf("refusing to load markdown; local path is empty: %#v", md) + log.Printf("refusing to stash markdown; local path is empty: %#v", md) } break } + // Checks passed; perform the stash m.filesStashing[md.localPath] = struct{}{} - cmds = append(cmds, stashDocument(m.cc, *md), spinner.Tick(m.spinner)) + cmds = append(cmds, stashDocument(m.cc, *md)) + + if m.loaded.done() && !m.spinner.Visible() { + m.spinner.Start() + cmds = append(cmds, spinner.Tick(m.spinner)) + } // Prompt for deletion case "x": @@ -598,7 +608,7 @@ func stashView(m stashModel) string { case stashStateReady, stashStateSettingNote, stashStatePromptDelete: loadingIndicator := "" - if !m.loaded.done() || m.loadingFromNetwork || len(m.filesStashing) > 0 { + if !m.loaded.done() || m.loadingFromNetwork || m.spinner.Visible() { loadingIndicator = spinner.View(m.spinner) } @@ -623,7 +633,7 @@ func stashView(m stashModel) string { } // Only draw the normal header if we're not using the header area for - // something else (like a prompt) + // something else (like a prompt or status message) if header == "" { header = stashHeaderView(m) } From b2511c54b07c3f4839cf674b5375afae95b7eadf Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 25 Aug 2020 09:46:52 -0400 Subject: [PATCH 452/911] Correct header counts for local items converted to stashed ones --- ui/stash.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index ccaa0e8..961b170 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -686,7 +686,7 @@ func stashHeaderView(m stashModel) string { } localItems := m.countMarkdowns(localMarkdown) - stashedItems := m.countMarkdowns(stashedMarkdown) + stashedItems := m.countMarkdowns(stashedMarkdown) + m.countMarkdowns(convertedMarkdown) // Loading's finished and all we have is news. if !loading && localItems == 0 && stashedItems == 0 { From 06cbbd7b6b586b9ce22d9c02c78263eecb2a0aab Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 25 Aug 2020 09:56:17 -0400 Subject: [PATCH 453/911] Use lock emoji for stashed item in pager --- ui/pager.go | 5 +++-- ui/stashitem.go | 11 +++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 2d9c4e9..e34b3bb 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -29,6 +29,7 @@ const ( darkGreen = "#1C8760" noteHeadingText = " Set Memo " notePromptText = " > " + pagerStashIcon = "🔒" ) var ( @@ -394,9 +395,9 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { statusIndicator = statusBarNoteStyle(" ") + spinner.View(m.spinner) } } else if isStashed && showStatusMessage { - statusIndicator = statusBarMessageStashDotStyle(" •") + statusIndicator = statusBarMessageStashDotStyle(" " + pagerStashIcon) } else if isStashed { - statusIndicator = statusBarStashDotStyle(" •") + statusIndicator = statusBarStashDotStyle(" " + pagerStashIcon) } // Note diff --git a/ui/stashitem.go b/ui/stashitem.go index 8d32b6b..f65722d 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -11,10 +11,10 @@ import ( ) const ( - newsPrefix = "News: " - verticalLine = "│" - noMemoTitle = "No Memo" - stashIcon = "• " + newsPrefix = "News: " + verticalLine = "│" + noMemoTitle = "No Memo" + fileListingStashIcon = "• " ) var ( @@ -47,8 +47,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { title = newsPrefix + truncate(title, truncateTo-rw.StringWidth(newsPrefix)) } case stashedMarkdown, convertedMarkdown: - icon = stashIcon - icon = stashIcon + icon = fileListingStashIcon if title == "" { title = noMemoTitle } From b296cbb78020ab0546323f90348b5945dea80e05 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 25 Aug 2020 11:00:05 -0400 Subject: [PATCH 454/911] Remove newlines the linter is complaining about --- ui/pager.go | 4 ---- ui/stash.go | 9 --------- ui/ui.go | 4 ---- 3 files changed, 17 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index e34b3bb..1489c71 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -115,7 +115,6 @@ type pagerModel struct { } func newPagerModel(glamourStyle string) pagerModel { - // Init viewport vp := viewport.Model{} vp.YPosition = 0 @@ -176,7 +175,6 @@ func (m *pagerModel) toggleHelp() { // that the the returned command should be sent back the through the pager // update function. func (m *pagerModel) showStatusMessage(statusMessage string) tea.Cmd { - // Show a success message to the user m.state = pagerStateStatusMessage m.statusMessageHeader = statusMessage @@ -211,7 +209,6 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { ) switch msg := msg.(type) { - case tea.KeyMsg: switch m.state { case pagerStateSetNote: @@ -507,7 +504,6 @@ func renderWithGlamour(m pagerModel, md string) tea.Cmd { // This is where the magic happens. func glamourRender(m pagerModel, markdown string) (string, error) { - if !config.GlamourEnabled { return markdown, nil } diff --git a/ui/stash.go b/ui/stash.go index 961b170..688b3dd 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -284,7 +284,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { var cmds []tea.Cmd switch msg := msg.(type) { - case errMsg: m.err = msg @@ -373,13 +372,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { switch m.state { case stashStateReady: - switch msg := msg.(type) { - // Handle keys case tea.KeyMsg: switch msg.String() { - case "k", "up": m.index-- if m.index < 0 && m.paginator.Page == 0 { @@ -483,7 +479,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.state = stashStateShowingError return m, nil } - } } @@ -523,7 +518,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case stashStatePromptDelete: if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { - // Confirm deletion case "y": if m.state != stashStatePromptDelete { @@ -586,7 +580,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { if _, ok := msg.(tea.KeyMsg); ok { m.state = stashStateReady } - } // If an item is being confirmed for delete, any key (other than the key @@ -598,7 +591,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // VIEW func stashView(m stashModel) string { - var s string switch m.state { case stashStateShowingError: @@ -796,7 +788,6 @@ func stashHelpViewBuilder(windowWidth int, sections ...string) string { ) for i := 0; i < len(sections); i++ { - // If we need this more often we'll formalize something rather than // use an if clause/switch here. switch sections[i] { diff --git a/ui/ui.go b/ui/ui.go index f61ecaf..d10b14e 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -215,7 +215,6 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // Special cases for the pager case stateShowDocument: switch m.pager.state { - // If setting a note send all keys straight through case pagerStateSetNote: var batch []tea.Cmd @@ -236,7 +235,6 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { return m, tea.Batch(batch...) } } - } return m, tea.Quit @@ -348,7 +346,6 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // Process children switch m.state { - case stateShowStash: newStashModel, cmd := stashUpdate(msg, m.stash) m.stash = newStashModel @@ -366,7 +363,6 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // VIEW func view(mdl tea.Model) string { - m, ok := mdl.(model) if !ok { return "could not perform assertion on model in view" From 50e8782aa836b70b4d89d91494ff18a78cefbf4a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 25 Aug 2020 11:00:29 -0400 Subject: [PATCH 455/911] Remove unnecessary comparison --- ui/ui.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/ui.go b/ui/ui.go index d10b14e..4f36f72 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -154,7 +154,7 @@ func initialize(cfg Config, style string) func() (tea.Model, tea.Cmd) { return func() (tea.Model, tea.Cmd) { if style == "auto" { dbg := te.HasDarkBackground() - if dbg == true { + if dbg { style = "dark" } else { style = "light" From c1496854a8e68d81966edab197267e5d25e4c460 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 25 Aug 2020 13:06:05 -0400 Subject: [PATCH 456/911] Remove newline --- ui/stashitem.go | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/stashitem.go b/ui/stashitem.go index f65722d..0241b11 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -32,7 +32,6 @@ var ( ) func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { - truncateTo := m.terminalWidth - stashViewHorizontalPadding*2 gutter := " " title := md.Note From 88523ee94f5b9213005ebeb0f368ada2a5a244f8 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 25 Aug 2020 13:12:31 -0400 Subject: [PATCH 457/911] Remove extraneous formatting call --- ui/pager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index 1489c71..c15bdb1 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -353,7 +353,7 @@ func pagerView(m pagerModel) string { } if m.showHelp { - fmt.Fprintf(&b, pagerHelpView(m, m.width)) + fmt.Fprint(&b, pagerHelpView(m, m.width)) } return b.String() From ae0c747a4bf6acd4ba85c606254e44dffd170a51 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 25 Aug 2020 13:32:49 -0400 Subject: [PATCH 458/911] Remove unused variables and members, fix ineffectual assignment --- ui/stashitem.go | 14 +++++++------- ui/ui.go | 1 - 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/ui/stashitem.go b/ui/stashitem.go index 0241b11..6153c39 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -19,12 +19,10 @@ const ( var ( greenFg = te.Style{}.Foreground(common.NewColorPair("#04B575", "#04B575").Color()).Styled - faintGreenFg = te.Style{}.Foreground(common.NewColorPair("#2B4A3F", "#ABE5D1").Color()).Styled fuchsiaFg = te.Style{}.Foreground(common.Fuschia.Color()).Styled dullFuchsiaFg = te.Style{}.Foreground(common.NewColorPair("#AD58B4", "#F793FF").Color()).Styled yellowFg = te.Style{}.Foreground(common.YellowGreen.Color()).Styled // renders light green on light backgrounds dullYellowFg = te.Style{}.Foreground(common.NewColorPair("#9BA92F", "#6BCB94").Color()).Styled // renders light green on light backgrounds - indigoFg = te.Style{}.Foreground(common.Indigo.Color()).Styled subtleIndigoFg = te.Style{}.Foreground(common.NewColorPair("#514DC1", "#7D79F6").Color()).Styled redFg = te.Style{}.Foreground(common.Red.Color()).Styled faintRedFg = te.Style{}.Foreground(common.FaintRed.Color()).Styled @@ -32,11 +30,13 @@ var ( ) func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { - truncateTo := m.terminalWidth - stashViewHorizontalPadding*2 - gutter := " " - title := md.Note - date := relativeTime(md.CreatedAt) - icon := "" + var ( + truncateTo = m.terminalWidth - stashViewHorizontalPadding*2 + gutter string + title = md.Note + date = relativeTime(md.CreatedAt) + icon = "" + ) switch md.markdownType { case newsMarkdown: diff --git a/ui/ui.go b/ui/ui.go index 4f36f72..210fd74 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -115,7 +115,6 @@ const ( type model struct { cfg Config cc *charm.Client - user *charm.User keygenState keygenState state state fatalErr error From 6aba7afb8b53a860464c5dc8fc0b711233a7e5da Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 25 Aug 2020 13:36:42 -0400 Subject: [PATCH 459/911] Remove some magic numbers to calm the linter down --- ui/pager.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index c15bdb1..3127640 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -360,6 +360,11 @@ func pagerView(m pagerModel) string { } func pagerStatusBarView(b *strings.Builder, m pagerModel) { + const ( + minPercent float64 = 0.0 + maxPercent float64 = 1.0 + percentToStringMagnitude float64 = 100.0 + ) var ( isStashed bool = m.currentDocument.markdownType == stashedMarkdown || m.currentDocument.markdownType == convertedMarkdown showStatusMessage bool = m.state == pagerStateStatusMessage @@ -369,8 +374,8 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { logo := glowLogoView(" Glow ") // Scroll percent - percent := math.Max(0.0, math.Min(1.0, m.viewport.ScrollPercent())) - scrollPercent := fmt.Sprintf(" %3.f%% ", percent*100) + percent := math.Max(minPercent, math.Min(maxPercent, m.viewport.ScrollPercent())) + scrollPercent := fmt.Sprintf(" %3.f%% ", percent*percentToStringMagnitude) if showStatusMessage { scrollPercent = statusBarMessageScrollPosStyle(scrollPercent) } else { From 3588f45ee9af73ae39b72eaa3e395d9dabc2192a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 25 Aug 2020 13:38:20 -0400 Subject: [PATCH 460/911] Cleanup status message vars --- ui/pager.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 3127640..adcafa1 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -48,8 +48,7 @@ var ( statusBarNoteStyle = newStyle(statusBarNoteFg.String(), statusBarBg.String()) statusBarHelpStyle = newStyle(statusBarNoteFg.String(), common.NewColorPair("#323232", "#DCDCDC").String()) statusBarStashDotStyle = newStyle(common.Green.String(), statusBarBg.String()) - statusBarMessageHeaderStyle = newStyle(common.Cream.String(), common.Green.String()) - statusBarMessageBodyStyle = newStyle(mintGreen, darkGreen) + statusBarMessageStyle = newStyle(mintGreen, darkGreen) statusBarMessageStashDotStyle = newStyle(mintGreen, darkGreen) statusBarMessageScrollPosStyle = newStyle(mintGreen, darkGreen) statusBarMessageHelpStyle = newStyle("#B6FFE4", common.Green.String()) @@ -101,9 +100,8 @@ type pagerModel struct { textInput textinput.Model spinner spinner.Model - statusMessageHeader string - statusMessageBody string - statusMessageTimer *time.Timer + statusMessage string + statusMessageTimer *time.Timer // Current document being rendered, sans-glamour rendering. We cache // it here so we can re-render it on resize. @@ -177,8 +175,7 @@ func (m *pagerModel) toggleHelp() { func (m *pagerModel) showStatusMessage(statusMessage string) tea.Cmd { // Show a success message to the user m.state = pagerStateStatusMessage - m.statusMessageHeader = statusMessage - m.statusMessageBody = "" + m.statusMessage = statusMessage if m.statusMessageTimer != nil { m.statusMessageTimer.Stop() } @@ -420,7 +417,7 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { ansi.PrintableRuneWidth(helpNote), )) if showStatusMessage { - note = statusBarMessageBodyStyle(note) + note = statusBarMessageStyle(note) } else { note = statusBarNoteStyle(note) } @@ -436,7 +433,7 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { ) emptySpace := strings.Repeat(" ", padding) if showStatusMessage { - emptySpace = statusBarMessageBodyStyle(emptySpace) + emptySpace = statusBarMessageStyle(emptySpace) } else { emptySpace = statusBarNoteStyle(emptySpace) } From a0ddc315de9a72a1291325af89f2af0dbdcc64f6 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 26 Aug 2020 00:47:04 +0200 Subject: [PATCH 461/911] Bump gitcha dep --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f864738..94ee085 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.3.0 github.com/microcosm-cc/bluemonday v1.0.4 // indirect - github.com/muesli/gitcha v0.1.1-0.20200824155329-3a36d51c187f + github.com/muesli/gitcha v0.1.1 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d github.com/muesli/termenv v0.7.2 github.com/spf13/cobra v1.0.0 diff --git a/go.sum b/go.sum index 03dcdef..2d233bf 100644 --- a/go.sum +++ b/go.sum @@ -106,8 +106,8 @@ github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2S github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/muesli/gitcha v0.1.1-0.20200824155329-3a36d51c187f h1:ok9C9DzuP6bbc2eRlaCv/fHxhplYwv+E28qt/M9epQ0= -github.com/muesli/gitcha v0.1.1-0.20200824155329-3a36d51c187f/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= +github.com/muesli/gitcha v0.1.1 h1:TzTFwvwTg0oq7DXFyVXFa6usbG9v6MyBT7W/+ic/9xg= +github.com/muesli/gitcha v0.1.1/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= From ee4ed1bad5c7bb2d75325b0dc73aa285640ea808 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 25 Aug 2020 19:01:22 -0400 Subject: [PATCH 462/911] Keybindings for jumping to the top and the bottom of the pager --- ui/pager.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index adcafa1..8a5e482 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -230,6 +230,16 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { m.state = pagerStateBrowse return m, nil } + case "home", "g": + m.viewport.GotoTop() + if m.viewport.HighPerformanceRendering { + cmds = append(cmds, viewport.Sync(m.viewport)) + } + case "end", "G": + m.viewport.GotoBottom() + if m.viewport.HighPerformanceRendering { + cmds = append(cmds, viewport.Sync(m.viewport)) + } case "m": isStashed := m.currentDocument.markdownType == stashedMarkdown || m.currentDocument.markdownType == convertedMarkdown @@ -455,21 +465,24 @@ func pagerSetNoteView(b *strings.Builder, m pagerModel) { func pagerHelpView(m pagerModel, width int) (s string) { col1 := [...]string{ + "g/home go to top", + "G/end go to bottom", + "", "m set memo", "esc back to files", "q quit", } if m.currentDocument.markdownType != stashedMarkdown { - col1[0] = "s stash this document" + col1[4] = "s stash this document" } s += "\n" s += "k/↑ up " + col1[0] + "\n" s += "j/↓ down " + col1[1] + "\n" s += "j/↓ down " + col1[2] + "\n" - s += "b/pgup page up\n" - s += "f/pgdn page down\n" - s += "u ½ page up\n" + s += "b/pgup page up " + col1[3] + "\n" + s += "f/pgdn page down " + col1[4] + "\n" + s += "u ½ page up " + col1[5] + "\n" s += "d ½ page down" s = indent(s, 2) From 676d215966d6291439a01818be93c5389ac9b987 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 25 Aug 2020 19:32:19 -0400 Subject: [PATCH 463/911] Keybindings for navigating to the start/end of file listing --- ui/stash.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ui/stash.go b/ui/stash.go index 688b3dd..867f218 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -399,6 +399,16 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.paginator.NextPage() } + // Go to the very start + case "home", "g": + m.paginator.Page = 0 + m.index = 0 + + // Go to the very end + case "end", "G": + m.paginator.Page = m.paginator.TotalPages - 1 + m.index = m.paginator.ItemsOnPage(len(m.markdowns)) - 1 + // Open document case "enter": m.hideStatusMessage() From dde57403c6136a79f663fd5825bd5e93cda00163 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 27 Aug 2020 13:32:05 -0400 Subject: [PATCH 464/911] Add info about new Glow version to README --- README.md | 50 +++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index e1307fd..997d11d 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,13 @@ Render markdown on the CLI, with _pizzazz_! Glow is a terminal based markdown reader designed from the ground up to bring out the beauty—and power—of the CLI. -Use it to quickly discover markdown files in a folder (it will automatically -search subdirectories for you), read documentation directly on the command line -and stash markdown files to your own private collection in the Charm Cloud so -you can read them anywhere. +Use it to discover markdown files, read documentation directly on the command +line and stash markdown files to your own private collection so you can read +them anywhere. Glow it will find markdown files in subdirectories for, if +you’re in a Git repo, search the repo. + +By the way, all data stashed is encrypted end-to-end: only you can decrypt it. +More on that below. ## Installation @@ -45,7 +48,7 @@ nix-env -iA nixpkgs.glow pkg install glow ``` -Or download a binary from the [releases][] page. MacOS, Linux, FreeBSD +Or download a binary from the [releases][releases] page. MacOS, Linux, FreeBSD binaries are available, as well as Debian and RPM packages. ARM builds are also available for Linux and FreeBSD. @@ -60,7 +63,9 @@ go get github.com/charmbracelet/glow ## Usage -Use a markdown source as the primary argument: +Run without arguments to start the TUI and browser local and stashed markdown. +Or, to simply format a document on the CLI, use a markdown source as the +primary argument: ```bash # Read from file @@ -76,9 +81,6 @@ glow github.com/charmbracelet/glow glow https://host.tld/file.md ``` -When `glow` is started without a markdown source, it will try to find a -`README.md` or `README` file in the current working directory. - ### Stashing Glow works with the Charm Cloud to allow you to store any markdown file in your @@ -88,9 +90,10 @@ own private collection. When you run: You'll add that markdown file to your stash. Running `glow` without arguments will let you browse through all your stashed documents. This is a great way to -keep track of documentation that you need to reference. +keep track of things that you need to reference often. -Stashing is private and your stash and its contents will not be exposed publicly. +Stashing is private, its contents will not be exposed publicly, and it's +encrypted end-to-end. More on encryption below. ### Word Wrapping @@ -121,25 +124,34 @@ Alternatively you can also supply a custom JSON stylesheet: glow -s mystyle.json ``` -Check out the [Glamour Style Section](https://github.com/charmbracelet/glamour/blob/master/styles/gallery/README.md) -to find more styles. Or [make your own](https://github.com/charmbracelet/glamour/tree/master/styles)! - -*** - For additional usage details see: ```bash glow --help ``` +Check out the [Glamour Style Section](https://github.com/charmbracelet/glamour/blob/master/styles/gallery/README.md) +to find more styles. Or [make your own](https://github.com/charmbracelet/glamour/tree/master/styles)! + +## 🔒 Encryption: how it works + +Encryption works by issuing symmetric keys (basically a generated password) and +encrypting it with the local SSH public key generated by the open-source +[charm][charmlib] library. That encrypted key is then sent up to our server. +We can’t read it since we don’t have your private key. When you want to decrypt +something or view your stash, that key is downloaded from our server and +decrypted locally using the SSH private key. When you link accounts, the +symmetric key is encrypted for each new public key. This happens on your +machine and not our server, so we never see any unencrypted data. + +[charmlib]: https://github.com/charmbracelet/charm + ## License [MIT](https://github.com/charmbracelet/glow/raw/master/LICENSE) -*** - Part of [Charm](https://charm.sh). the Charm logo -Charm热爱开源! +Charm loves open source! / Charm热爱开源! From f203f845b73b17b283f41420733273b62d244668 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 27 Aug 2020 13:36:08 -0400 Subject: [PATCH 465/911] Fix README typos --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 997d11d..56cecd8 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ out the beauty—and power—of the CLI. Use it to discover markdown files, read documentation directly on the command line and stash markdown files to your own private collection so you can read -them anywhere. Glow it will find markdown files in subdirectories for, if -you’re in a Git repo, search the repo. +them anywhere. Glow will find local markdown files in subdirectories or a local +Git repository. By the way, all data stashed is encrypted end-to-end: only you can decrypt it. More on that below. @@ -63,7 +63,7 @@ go get github.com/charmbracelet/glow ## Usage -Run without arguments to start the TUI and browser local and stashed markdown. +Run without arguments to start the TUI and browse local and stashed markdown. Or, to simply format a document on the CLI, use a markdown source as the primary argument: From 1443d3e5f3519223c524023aba7a8cc0b9f0aec0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 27 Aug 2020 13:50:46 -0400 Subject: [PATCH 466/911] Improve README wording around stashing --- README.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 56cecd8..1213717 100644 --- a/README.md +++ b/README.md @@ -84,13 +84,16 @@ glow https://host.tld/file.md ### Stashing Glow works with the Charm Cloud to allow you to store any markdown file in your -own private collection. When you run: +own private collection. You can stash a local document from the Glow TUI by +pressing `s`. You can also stash from the CLI: -`glow stash README.md` +```bash +glow stash README.md +``` -You'll add that markdown file to your stash. Running `glow` without arguments -will let you browse through all your stashed documents. This is a great way to -keep track of things that you need to reference often. +Then, when you run `glow` without arguments will you can browse through your +stashed documents. This is a great way to keep track of things that you need to +reference often. Stashing is private, its contents will not be exposed publicly, and it's encrypted end-to-end. More on encryption below. @@ -105,8 +108,8 @@ glow -w 60 ### Paging -The output can be displayed in the user's preferred pager with the `-p` flag. -This defaults to the ANSI-aware `less -r` if `$PAGER` is not explicitly set. +CLI output can be displayed in your preferred pager with the `-p` flag. This defaults +to the ANSI-aware `less -r` if `$PAGER` is not explicitly set. ### Styles @@ -154,4 +157,4 @@ Part of [Charm](https://charm.sh). the Charm logo -Charm loves open source! / Charm热爱开源! +Charm热爱开源! / Charm loves open source! From a5b67ba721431ba00c6df1be11ead15b1ecac33f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 27 Aug 2020 14:21:45 -0400 Subject: [PATCH 467/911] Separate out the TUI and CLI sections of the README --- README.md | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 1213717..f27a2c8 100644 --- a/README.md +++ b/README.md @@ -61,11 +61,40 @@ go get github.com/charmbracelet/glow [releases]: https://github.com/charmbracelet/glow/releases -## Usage +## The TUI -Run without arguments to start the TUI and browse local and stashed markdown. -Or, to simply format a document on the CLI, use a markdown source as the -primary argument: +Simply run `glow` without arguments to start the textual user iterface and +browse local and stashed markdown. Glow will find local markdown files it the +current directory or below or, if you’re in a Git repository, Glow will search +the repo. + +Markdown files can be read with Glow's high-performance pager. Most of the +keystokes you know from `less` are the same, but you can press `?` to list +the hotkeys. + +### Stashing + +Glow works with the Charm Cloud to allow you to store any markdown files in +your own private collection. You can stash a local document from the Glow TUI by +pressing `s`. + +You can also stash from the CLI: + +```bash +glow stash README.md +``` + +Then, when you run `glow` without arguments will you can browse through your +stashed documents. This is a great way to keep track of things that you need to +reference often. + +Stashing is private, its contents will not be exposed publicly, and it's +encrypted end-to-end. More on encryption below. + +## The CLI + +In addition to a TUI, Glow has a CLI for working with Markdown. To format a +document use a markdown source as the primary argument: ```bash # Read from file @@ -83,9 +112,7 @@ glow https://host.tld/file.md ### Stashing -Glow works with the Charm Cloud to allow you to store any markdown file in your -own private collection. You can stash a local document from the Glow TUI by -pressing `s`. You can also stash from the CLI: +You can also stash documents from the CLI: ```bash glow stash README.md @@ -95,9 +122,6 @@ Then, when you run `glow` without arguments will you can browse through your stashed documents. This is a great way to keep track of things that you need to reference often. -Stashing is private, its contents will not be exposed publicly, and it's -encrypted end-to-end. More on encryption below. - ### Word Wrapping The `-w` flag lets you set a maximum width at which the output will be wrapped: @@ -136,7 +160,7 @@ glow --help Check out the [Glamour Style Section](https://github.com/charmbracelet/glamour/blob/master/styles/gallery/README.md) to find more styles. Or [make your own](https://github.com/charmbracelet/glamour/tree/master/styles)! -## 🔒 Encryption: how it works +## 🔒 Encryption: How It Works Encryption works by issuing symmetric keys (basically a generated password) and encrypting it with the local SSH public key generated by the open-source From b3909354aad62d14f592f4994177d53a9c5bcb00 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 27 Aug 2020 14:26:38 -0400 Subject: [PATCH 468/911] Use base name when stashing from the CLI if no memo is set --- stash.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/stash.go b/stash.go index f68f6bc..addf5cb 100644 --- a/stash.go +++ b/stash.go @@ -5,6 +5,8 @@ import ( "io/ioutil" "log" "os" + "path" + "strings" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" @@ -18,7 +20,8 @@ var ( forceKey bool */ - memo string + memo string + stashCmd = &cobra.Command{ Use: "stash SOURCE", Hidden: false, @@ -26,20 +29,29 @@ var ( Long: "", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + filePath := args[0] + + if memo == "" { + memo = strings.Replace(path.Base(filePath), path.Ext(filePath), "", 1) + } + cc := initCharmClient() - f, err := os.Open(args[0]) + f, err := os.Open(filePath) if err != nil { return fmt.Errorf("bad filename") } + defer f.Close() b, err := ioutil.ReadAll(f) if err != nil { return fmt.Errorf("error reading file") } + _, err = cc.StashMarkdown(memo, string(b)) if err != nil { return fmt.Errorf("error stashing markdown") } + dot := termenv.String("•").Foreground(common.Green.Color()).String() fmt.Println(dot + " Stashed!") return nil From 2c411a3f289039b702ea2b5e7ee73f1d56476df0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 27 Aug 2020 14:41:58 -0400 Subject: [PATCH 469/911] Rename stash.go to stash_cmd.go for clarity --- stash.go => stash_cmd.go | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename stash.go => stash_cmd.go (100%) diff --git a/stash.go b/stash_cmd.go similarity index 100% rename from stash.go rename to stash_cmd.go From 805a26090f6a2eba7c70209adbb4166370bc67fe Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 27 Aug 2020 18:07:22 -0400 Subject: [PATCH 470/911] Format help and add examples to stash command --- formatting.go | 15 +++++++++++++++ main.go | 2 ++ stash_cmd.go | 14 ++++++++------ 3 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 formatting.go diff --git a/formatting.go b/formatting.go new file mode 100644 index 0000000..6e3dffa --- /dev/null +++ b/formatting.go @@ -0,0 +1,15 @@ +package main + +import ( + "github.com/muesli/reflow/indent" + "github.com/muesli/reflow/wordwrap" +) + +const ( + wrapAt = 78 + indentAmount = 2 +) + +func formatBlock(s string) string { + return indent.String(wordwrap.String(s, wrapAt-indentAmount), indentAmount) +} diff --git a/main.go b/main.go index b0bf5e5..8774a71 100644 --- a/main.go +++ b/main.go @@ -17,6 +17,7 @@ import ( "golang.org/x/crypto/ssh/terminal" tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glamour" "github.com/charmbracelet/glow/ui" ) @@ -33,6 +34,7 @@ var ( rootCmd = &cobra.Command{ Use: "glow SOURCE", Short: "Render markdown on the CLI, with pizzazz!", + Long: formatBlock(fmt.Sprintf("\nRender markdown on the CLI, %s!", common.Keyword("with pizzazz"))), SilenceErrors: false, SilenceUsage: false, TraverseChildren: true, diff --git a/stash_cmd.go b/stash_cmd.go index addf5cb..43ab6c2 100644 --- a/stash_cmd.go +++ b/stash_cmd.go @@ -23,11 +23,12 @@ var ( memo string stashCmd = &cobra.Command{ - Use: "stash SOURCE", - Hidden: false, - Short: "stash a markdown", - Long: "", - Args: cobra.ExactArgs(1), + Use: "stash SOURCE", + Hidden: false, + Short: "stash a markdown", + Long: formatBlock(fmt.Sprintf("\nSave a mardkdown file to your %s.", common.Keyword("stash"))), + Example: formatBlock("glow stash README.md\nglow stash -m \"secret notes\" path/to/notes.md"), + Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { filePath := args[0] @@ -82,7 +83,8 @@ func initCharmClient() *charm.Client { cfg := getCharmConfig() cc, err := charm.NewClient(cfg) if err == charm.ErrMissingSSHAuth { - log.Fatal("Missing ssh key. Run `ssh-keygen` to make one or set the `CHARM_SSH_KEY_PATH` env var to your private key path.") + fmt.Println(formatBlock("We had some trouble authenticating via SSH. If this continues to happen the Charm tool may be able to help you. More info at https://github.com/charmbracelet/charm.")) + os.Exit(1) } else if err != nil { fmt.Println(err) os.Exit(1) From b20a06d92b87987231feb716ae2575cbecccae8f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 27 Aug 2020 18:08:39 -0400 Subject: [PATCH 471/911] Fix stash capitalization in help --- stash_cmd.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stash_cmd.go b/stash_cmd.go index 43ab6c2..c81aa9e 100644 --- a/stash_cmd.go +++ b/stash_cmd.go @@ -25,7 +25,7 @@ var ( stashCmd = &cobra.Command{ Use: "stash SOURCE", Hidden: false, - Short: "stash a markdown", + Short: "Stash a markdown", Long: formatBlock(fmt.Sprintf("\nSave a mardkdown file to your %s.", common.Keyword("stash"))), Example: formatBlock("glow stash README.md\nglow stash -m \"secret notes\" path/to/notes.md"), Args: cobra.ExactArgs(1), From 45cde43dd448299f5496b4193bfc0309c9d3d89b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 9 Sep 2020 17:00:25 -0400 Subject: [PATCH 472/911] Add more checks for nil Charm clients --- ui/ui.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 210fd74..05151de 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -464,6 +464,13 @@ func newCharmClient(identityFile *string) tea.Cmd { func loadStash(m stashModel) tea.Cmd { return func() tea.Msg { + if m.cc == nil { + err := errors.New("no charm client") + if debug { + log.Println("error loading stash:", err) + } + return stashLoadErrMsg{err} + } stash, err := m.cc.GetStash(m.page) if err != nil { if debug { @@ -477,6 +484,13 @@ func loadStash(m stashModel) tea.Cmd { func loadNews(m stashModel) tea.Cmd { return func() tea.Msg { + if m.cc == nil { + err := errors.New("no charm client") + if debug { + log.Println("error loading news:", err) + } + return newsLoadErrMsg{err} + } news, err := m.cc.GetNews(1) // just fetch the first page if err != nil { if debug { @@ -502,7 +516,11 @@ func generateSSHKeys() tea.Msg { func saveDocumentNote(cc *charm.Client, id int, note string) tea.Cmd { if cc == nil { return func() tea.Msg { - return errMsg{errors.New("can't set note; no charm client")} + err := errors.New("can't set note; no charm client") + if debug { + log.Println("error saving note:", err) + } + return errMsg{err} } } return func() tea.Msg { @@ -522,7 +540,7 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { return func() tea.Msg { err := errors.New("can't stash; no charm client") if debug { - log.Println("error stash document:", err) + log.Println("error stashing document:", err) } return stashErrMsg{err} } From f8c4ddc388be78876e4eda26b76aaed5f2cfcac7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 7 Sep 2020 11:59:41 -0400 Subject: [PATCH 473/911] Remove disabled force key/identity file stuff for now --- main.go | 9 --------- ui/ui.go | 50 +++++++++++++++++++++----------------------------- 2 files changed, 21 insertions(+), 38 deletions(-) diff --git a/main.go b/main.go index 8774a71..e2da65c 100644 --- a/main.go +++ b/main.go @@ -177,9 +177,6 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { return fmt.Errorf("error parsing config: %v", err) } - // Config from flags - // cfg.IdentityFile = identityFile - // Log to file, if set if cfg.Logfile != "" { f, err := tea.LogToFile(cfg.Logfile, "glow") @@ -295,12 +292,6 @@ func init() { rootCmd.Flags().StringVarP(&style, "style", "s", "auto", "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") - // For network-related operations, namely stashing and the TUI - /* - rootCmd.PersistentFlags().StringVarP(&identityFile, "identity", "i", "", "path to identity file (that is, an ssh private key)") - rootCmd.PersistentFlags().BoolVarP(&forceKey, "force-key", "f", false, "force the use of the SSH key on disk (that is, ignore ssh-agent)") - */ - // Stash stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") rootCmd.AddCommand(stashCmd) diff --git a/ui/ui.go b/ui/ui.go index 05151de..b17a9b6 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -32,8 +32,6 @@ var ( // Config contains configuration specified to the TUI. type Config struct { - IdentityFile string - // For debugging the UI Logfile string `env:"GLOW_UI_LOGFILE"` HighPerformancePager bool `env:"GLOW_UI_HIGH_PERFORMANCE_PAGER" default:"true"` @@ -170,7 +168,7 @@ func initialize(cfg Config, style string) func() (tea.Model, tea.Cmd) { return m, tea.Batch( findLocalFiles, - newCharmClient(&cfg.IdentityFile), + newCharmClient, spinner.Tick(m.stash.spinner), ) } @@ -302,7 +300,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case keygenSuccessMsg: // The keygen's done, so let's try initializing the charm client again m.keygenState = keygenFinished - cmds = append(cmds, newCharmClient(nil)) + cmds = append(cmds, newCharmClient) case newCharmClientMsg: m.cc = msg @@ -434,32 +432,26 @@ func findNextLocalFile(m model) tea.Cmd { } } -func newCharmClient(identityFile *string) tea.Cmd { - return func() tea.Msg { - cfg, err := charm.ConfigFromEnv() - if err != nil { - return errMsg{err} - } - - if identityFile != nil { - cfg.SSHKeyPath = *identityFile - } - - cc, err := charm.NewClient(cfg) - if err == charm.ErrMissingSSHAuth { - if debug { - log.Println("missing SSH auth:", err) - } - return sshAuthErrMsg{} - } else if err != nil { - if debug { - log.Println("error creating new charm client:", err) - } - return errMsg{err} - } - - return newCharmClientMsg(cc) +func newCharmClient() tea.Msg { + cfg, err := charm.ConfigFromEnv() + if err != nil { + return errMsg{err} } + + cc, err := charm.NewClient(cfg) + if err == charm.ErrMissingSSHAuth { + if debug { + log.Println("missing SSH auth:", err) + } + return sshAuthErrMsg{} + } else if err != nil { + if debug { + log.Println("error creating new charm client:", err) + } + return errMsg{err} + } + + return newCharmClientMsg(cc) } func loadStash(m stashModel) tea.Cmd { From 05a77ff655bd1a18662bfbf5e13b5fe261339ebb Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 7 Sep 2020 12:09:34 -0400 Subject: [PATCH 474/911] Fix make target for logging to the local directory --- Makefile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index bb5106f..35d75a4 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,8 @@ .PHONY: default clean glow run log +LOGFILE := debug.log + default: glow clean: @@ -11,9 +13,8 @@ glow: go build run: clean glow - export GLOW_UI_LOGFILE=debug.log - ./glow + GLOW_UI_LOGFILE=$(LOGFILE) ./glow log: - > debug.log - tail -f debug.log + > $(LOGFILE) + tail -f $(LOGFILE) From 5b20e3edae102025b54e918e2dfbd9576d82773c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 7 Sep 2020 12:37:00 -0400 Subject: [PATCH 475/911] Hide files and dirs starting with a dot by default --- main.go | 12 ++++++++---- ui/ui.go | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/main.go b/main.go index e2da65c..9ba0222 100644 --- a/main.go +++ b/main.go @@ -26,10 +26,11 @@ var ( Version = "" CommitSHA = "" - readmeNames = []string{"README.md", "README"} - pager bool - style string - width uint + readmeNames = []string{"README.md", "README"} + pager bool + style string + width uint + showAllFiles bool rootCmd = &cobra.Command{ Use: "glow SOURCE", @@ -186,6 +187,8 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { defer f.Close() } + cfg.ShowAllFiles = showAllFiles + // Run Bubble Tea program p := ui.NewProgram(style, cfg) p.EnterAltScreen() @@ -291,6 +294,7 @@ func init() { rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") rootCmd.Flags().StringVarP(&style, "style", "s", "auto", "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") + rootCmd.Flags().BoolVarP(&showAllFiles, "all", "a", false, "show files and directories starting with a dot (TUI-mode only)") // Stash stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") diff --git a/ui/ui.go b/ui/ui.go index b17a9b6..5bf4bf9 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -32,6 +32,8 @@ var ( // Config contains configuration specified to the TUI. type Config struct { + ShowAllFiles bool + // For debugging the UI Logfile string `env:"GLOW_UI_LOGFILE"` HighPerformancePager bool `env:"GLOW_UI_HIGH_PERFORMANCE_PAGER" default:"true"` @@ -63,6 +65,7 @@ type initLocalFileSearchMsg struct { ch chan gitcha.SearchResult } type foundLocalFileMsg gitcha.SearchResult +type skipLocalFileMsg gitcha.SearchResult type localFileSearchFinished struct{} type gotStashMsg []*charm.Markdown type stashLoadErrMsg struct{ err error } @@ -274,6 +277,10 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { m.stash.addMarkdowns(newMd) cmds = append(cmds, findNextLocalFile(m)) + // We found a file that we want to ignore + case skipLocalFileMsg: + cmds = append(cmds, findNextLocalFile(m)) + case sshAuthErrMsg: // If we haven't run the keygen yet, do that if m.keygenState != keygenFinished { @@ -419,14 +426,22 @@ func findLocalFiles() tea.Msg { func findNextLocalFile(m model) tea.Cmd { return func() tea.Msg { - pathStr, ok := <-m.localFileFinder + res, ok := <-m.localFileFinder + + if !m.cfg.ShowAllFiles && isDotFileOrDir(m.cwd, res.Path) { + if debug { + log.Println("ignoring file:", res.Path) + } + return skipLocalFileMsg(res) + } + if ok { // Okay now find the next one - return foundLocalFileMsg(pathStr) + return foundLocalFileMsg(res) } // We're done if debug { - log.Println("Local file search finished") + log.Println("local file search finished") } return localFileSearchFinished{} } @@ -601,6 +616,20 @@ func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { return md } +// Returns whether or not the given path contains a file or directory starting +// with a dot. This is relative to the current working directory, so if you're +// in a dot directory and browsing files beneath this function won't return +// true every time. +func isDotFileOrDir(cwd, path string) bool { + p := strings.Replace(path, cwd, "", 1) + for _, v := range strings.Split(p, string(os.PathSeparator)) { + if len(v) > 0 && v[0] == '.' { + return true + } + } + return false +} + // Lightweight version of reflow's indent function. func indent(s string, n int) string { if n <= 0 || s == "" { From 9903ea8dcfae6e93e425f387e010bddb129397e7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 7 Sep 2020 14:26:02 -0400 Subject: [PATCH 476/911] Ignore $GOPATH everywhere and ~/Library on macOS --- ui/ignore.go | 39 +++++++++++++++++++++++++++++++++++++++ ui/ignore_darwin.go | 18 ++++++++++++++++++ ui/ignore_general.go | 11 +++++++++++ ui/ui.go | 18 +++--------------- 4 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 ui/ignore.go create mode 100644 ui/ignore_darwin.go create mode 100644 ui/ignore_general.go diff --git a/ui/ignore.go b/ui/ignore.go new file mode 100644 index 0000000..348b020 --- /dev/null +++ b/ui/ignore.go @@ -0,0 +1,39 @@ +package ui + +import ( + "os" + "strings" +) + +// Returns whether or not the given path contains a file or directory starting +// with a dot. This is relative to the current working directory, so if you're +// in a dot directory and browsing files beneath this function won't return +// true every time. +func isDotFileOrDir(cwd, path string) bool { + p := strings.Replace(path, cwd, "", 1) + for _, v := range strings.Split(p, string(os.PathSeparator)) { + if len(v) > 0 && v[0] == '.' { + return true + } + } + return false +} + +// Returns whether or not a path is a child of a given path. For example: +// +// parent := "/usr/local/bin" +// child := "/usr/local/bin/glow" +// pathIsChild(parent, child) // true +// +func pathIsChild(parent, child string) bool { + if len(parent) == 0 || len(child) == 0 { + return false + } + if len(parent) > len(child) { + return false + } + if strings.Compare(parent, child[:len(parent)]) == 0 { + return true + } + return false +} diff --git a/ui/ignore_darwin.go b/ui/ignore_darwin.go new file mode 100644 index 0000000..43ceb08 --- /dev/null +++ b/ui/ignore_darwin.go @@ -0,0 +1,18 @@ +// +build darwin + +package ui + +import "os" + +func ignorePath(m model, p string) bool { + if isDotFileOrDir(m.cwd, p) { + return true + } + if pathIsChild(m.cfg.Gopath, p) { + return true + } + + // Look for ~/Library on macOS + macOSLibraryPath := m.cfg.HomeDir + string(os.PathSeparator) + "Library" + return pathIsChild(macOSLibraryPath, p) +} diff --git a/ui/ignore_general.go b/ui/ignore_general.go new file mode 100644 index 0000000..487fc85 --- /dev/null +++ b/ui/ignore_general.go @@ -0,0 +1,11 @@ +// +build !darwin + +package ui + +// Whether or not we should ignore the given path +func ignorePath(m model, p string) bool { + if isDotFileOrDir(m.cwd, p) { + return true + } + return pathIsChild(m.cfg.Gopath, p) +} diff --git a/ui/ui.go b/ui/ui.go index 5bf4bf9..a2eb258 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -33,6 +33,8 @@ var ( // Config contains configuration specified to the TUI. type Config struct { ShowAllFiles bool + Gopath string `env:"GOPATH"` + HomeDir string `env:"HOME"` // For debugging the UI Logfile string `env:"GLOW_UI_LOGFILE"` @@ -428,7 +430,7 @@ func findNextLocalFile(m model) tea.Cmd { return func() tea.Msg { res, ok := <-m.localFileFinder - if !m.cfg.ShowAllFiles && isDotFileOrDir(m.cwd, res.Path) { + if !m.cfg.ShowAllFiles && ignorePath(m, res.Path) { if debug { log.Println("ignoring file:", res.Path) } @@ -616,20 +618,6 @@ func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { return md } -// Returns whether or not the given path contains a file or directory starting -// with a dot. This is relative to the current working directory, so if you're -// in a dot directory and browsing files beneath this function won't return -// true every time. -func isDotFileOrDir(cwd, path string) bool { - p := strings.Replace(path, cwd, "", 1) - for _, v := range strings.Split(p, string(os.PathSeparator)) { - if len(v) > 0 && v[0] == '.' { - return true - } - } - return false -} - // Lightweight version of reflow's indent function. func indent(s string, n int) string { if n <= 0 || s == "" { From f8fa5a04dc942d57df4c007b06c33fed2af8ba99 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 7 Sep 2020 15:01:34 -0400 Subject: [PATCH 477/911] use strings.TrimPrefix instead of Replace when checking paths --- ui/ignore.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/ignore.go b/ui/ignore.go index 348b020..8202783 100644 --- a/ui/ignore.go +++ b/ui/ignore.go @@ -10,7 +10,7 @@ import ( // in a dot directory and browsing files beneath this function won't return // true every time. func isDotFileOrDir(cwd, path string) bool { - p := strings.Replace(path, cwd, "", 1) + p := strings.TrimPrefix(path, cwd) for _, v := range strings.Split(p, string(os.PathSeparator)) { if len(v) > 0 && v[0] == '.' { return true From a3a05fde9c515be8ba000f505c26f77d1fce6822 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 7 Sep 2020 18:25:04 -0400 Subject: [PATCH 478/911] Move ignore stuff to gitcha (and temporarily use the meowgorithm fork) --- go.mod | 2 ++ go.sum | 4 ++-- ui/ignore.go | 39 ----------------------------------- ui/ignore_darwin.go | 16 ++++++--------- ui/ignore_general.go | 10 ++++----- ui/ui.go | 49 ++++++++++++++++++++------------------------ 6 files changed, 37 insertions(+), 83 deletions(-) delete mode 100644 ui/ignore.go diff --git a/go.mod b/go.mod index 94ee085..4b61432 100644 --- a/go.mod +++ b/go.mod @@ -21,3 +21,5 @@ require ( golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect golang.org/x/sys v0.0.0-20200821140526-fda516888d29 ) + +replace github.com/muesli/gitcha => github.com/meowgorithm/gitcha v0.1.2-0.20200907220241-87b69df49486 diff --git a/go.sum b/go.sum index 2d233bf..be8156b 100644 --- a/go.sum +++ b/go.sum @@ -98,6 +98,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 github.com/meowgorithm/babyenv v1.2.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/meowgorithm/babyenv v1.3.0 h1:klb7ugoZt0/Xlqkd5kLxM7eLZX8waiwxHZWW5nfEZ0Q= github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= +github.com/meowgorithm/gitcha v0.1.2-0.20200907220241-87b69df49486 h1:Q59vhaeBGofDFPzw9dc05t/xF5w7qlgpXLsUi3Bt5kw= +github.com/meowgorithm/gitcha v0.1.2-0.20200907220241-87b69df49486/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg= github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= @@ -106,8 +108,6 @@ github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2S github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/muesli/gitcha v0.1.1 h1:TzTFwvwTg0oq7DXFyVXFa6usbG9v6MyBT7W/+ic/9xg= -github.com/muesli/gitcha v0.1.1/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= diff --git a/ui/ignore.go b/ui/ignore.go deleted file mode 100644 index 8202783..0000000 --- a/ui/ignore.go +++ /dev/null @@ -1,39 +0,0 @@ -package ui - -import ( - "os" - "strings" -) - -// Returns whether or not the given path contains a file or directory starting -// with a dot. This is relative to the current working directory, so if you're -// in a dot directory and browsing files beneath this function won't return -// true every time. -func isDotFileOrDir(cwd, path string) bool { - p := strings.TrimPrefix(path, cwd) - for _, v := range strings.Split(p, string(os.PathSeparator)) { - if len(v) > 0 && v[0] == '.' { - return true - } - } - return false -} - -// Returns whether or not a path is a child of a given path. For example: -// -// parent := "/usr/local/bin" -// child := "/usr/local/bin/glow" -// pathIsChild(parent, child) // true -// -func pathIsChild(parent, child string) bool { - if len(parent) == 0 || len(child) == 0 { - return false - } - if len(parent) > len(child) { - return false - } - if strings.Compare(parent, child[:len(parent)]) == 0 { - return true - } - return false -} diff --git a/ui/ignore_darwin.go b/ui/ignore_darwin.go index 43ceb08..848fb5a 100644 --- a/ui/ignore_darwin.go +++ b/ui/ignore_darwin.go @@ -4,15 +4,11 @@ package ui import "os" -func ignorePath(m model, p string) bool { - if isDotFileOrDir(m.cwd, p) { - return true +func ignorePatterns(m model) []string { + return []string{ + m.cfg.HomeDir + string(os.PathSeparator) + "Library", + m.cfg.Gopath, + "node_modules", + ".*", } - if pathIsChild(m.cfg.Gopath, p) { - return true - } - - // Look for ~/Library on macOS - macOSLibraryPath := m.cfg.HomeDir + string(os.PathSeparator) + "Library" - return pathIsChild(macOSLibraryPath, p) } diff --git a/ui/ignore_general.go b/ui/ignore_general.go index 487fc85..652d3c5 100644 --- a/ui/ignore_general.go +++ b/ui/ignore_general.go @@ -2,10 +2,10 @@ package ui -// Whether or not we should ignore the given path -func ignorePath(m model, p string) bool { - if isDotFileOrDir(m.cwd, p) { - return true +func ignorePatterns(m model) []string { + return []string{ + m.cfg.Gopath, + "node_modules" + ".*", } - return pathIsChild(m.cfg.Gopath, p) } diff --git a/ui/ui.go b/ui/ui.go index a2eb258..7b657e6 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -67,7 +67,6 @@ type initLocalFileSearchMsg struct { ch chan gitcha.SearchResult } type foundLocalFileMsg gitcha.SearchResult -type skipLocalFileMsg gitcha.SearchResult type localFileSearchFinished struct{} type gotStashMsg []*charm.Markdown type stashLoadErrMsg struct{ err error } @@ -172,7 +171,7 @@ func initialize(cfg Config, style string) func() (tea.Model, tea.Cmd) { } return m, tea.Batch( - findLocalFiles, + findLocalFiles(m), newCharmClient, spinner.Tick(m.stash.spinner), ) @@ -279,10 +278,6 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { m.stash.addMarkdowns(newMd) cmds = append(cmds, findNextLocalFile(m)) - // We found a file that we want to ignore - case skipLocalFileMsg: - cmds = append(cmds, findNextLocalFile(m)) - case sshAuthErrMsg: // If we haven't run the keygen yet, do that if m.keygenState != keygenFinished { @@ -406,37 +401,37 @@ func errorView(err error, fatal bool) string { // COMMANDS -func findLocalFiles() tea.Msg { - cwd, err := os.Getwd() - if err != nil { - if debug { - log.Println("error finding local files:", err) +func findLocalFiles(m model) tea.Cmd { + return func() tea.Msg { + cwd, err := os.Getwd() + if err != nil { + if debug { + log.Println("error finding local files:", err) + } + return errMsg{err} } - return errMsg{err} - } - ch, err := gitcha.FindFiles(cwd, []string{"*.md"}) - if err != nil { - if debug { - log.Println("error finding local files:", err) + var ignore []string + if !m.cfg.ShowAllFiles { + ignore = ignorePatterns(m) } - return errMsg{err} - } - return initLocalFileSearchMsg{ch: ch, cwd: cwd} + ch, err := gitcha.FindFilesExcept(cwd, []string{"*.md"}, ignore) + if err != nil { + if debug { + log.Println("error finding local files:", err) + } + return errMsg{err} + } + + return initLocalFileSearchMsg{ch: ch, cwd: cwd} + } } func findNextLocalFile(m model) tea.Cmd { return func() tea.Msg { res, ok := <-m.localFileFinder - if !m.cfg.ShowAllFiles && ignorePath(m, res.Path) { - if debug { - log.Println("ignoring file:", res.Path) - } - return skipLocalFileMsg(res) - } - if ok { // Okay now find the next one return foundLocalFileMsg(res) From a705921a965b71421c146d26f6e324b547e83d93 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 7 Sep 2020 18:31:54 -0400 Subject: [PATCH 479/911] Update `-a` help language --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 9ba0222..57a4103 100644 --- a/main.go +++ b/main.go @@ -294,7 +294,7 @@ func init() { rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") rootCmd.Flags().StringVarP(&style, "style", "s", "auto", "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") - rootCmd.Flags().BoolVarP(&showAllFiles, "all", "a", false, "show files and directories starting with a dot (TUI-mode only)") + rootCmd.Flags().BoolVarP(&showAllFiles, "all", "a", false, "show system files and directories (TUI-mode only)") // Stash stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") From 6e7cea7e52bdfe1387335bd5388de1ad5dd9f0dd Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 7 Sep 2020 18:40:21 -0400 Subject: [PATCH 480/911] Remove more old code for specifying SSH paths --- stash_cmd.go | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/stash_cmd.go b/stash_cmd.go index c81aa9e..8760f27 100644 --- a/stash_cmd.go +++ b/stash_cmd.go @@ -15,11 +15,6 @@ import ( ) var ( - /* - identityFile string - forceKey bool - */ - memo string stashCmd = &cobra.Command{ @@ -66,16 +61,6 @@ func getCharmConfig() *charm.Config { log.Fatal(err) } - /* - if identityFile != "" { - cfg.SSHKeyPath = identityFile - cfg.ForceKey = true - } - if forceKey { - cfg.ForceKey = true - } - */ - return cfg } From eb6fa55ec39040b383f5c40142e01734cf72cc43 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 7 Sep 2020 19:14:59 -0400 Subject: [PATCH 481/911] Run `glow stash` to browse stashed files only --- main.go | 66 ++++++++++++++++++++++++++++------------------------ stash_cmd.go | 12 ++++++---- ui/stash.go | 22 ++++++++++++------ ui/ui.go | 18 ++++++++++---- 4 files changed, 72 insertions(+), 46 deletions(-) diff --git a/main.go b/main.go index 57a4103..a7a0ab4 100644 --- a/main.go +++ b/main.go @@ -171,36 +171,7 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { // Only run TUI if there are no arguments (excluding flags) if arg == "" { - - // Read environment to get debugging stuff - var cfg ui.Config - if err := babyenv.Parse(&cfg); err != nil { - return fmt.Errorf("error parsing config: %v", err) - } - - // Log to file, if set - if cfg.Logfile != "" { - f, err := tea.LogToFile(cfg.Logfile, "glow") - if err != nil { - return err - } - defer f.Close() - } - - cfg.ShowAllFiles = showAllFiles - - // Run Bubble Tea program - p := ui.NewProgram(style, cfg) - p.EnterAltScreen() - if err := p.Start(); err != nil { - return err - } - p.ExitAltScreen() - p.DisableMouseCellMotion() - - // Exit message - fmt.Printf("\n Thanks for using Glow!\n\n") - return nil + return runTUI(false) } // create an io.Reader from the markdown source in cli-args @@ -274,6 +245,41 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { return nil } +func runTUI(stashedOnly bool) error { + // Read environment to get debugging stuff + var cfg ui.Config + if err := babyenv.Parse(&cfg); err != nil { + return fmt.Errorf("error parsing config: %v", err) + } + + // Log to file, if set + if cfg.Logfile != "" { + f, err := tea.LogToFile(cfg.Logfile, "glow") + if err != nil { + return err + } + defer f.Close() + } + + cfg.ShowAllFiles = showAllFiles + if stashedOnly { + cfg.StashedOnly = true + } + + // Run Bubble Tea program + p := ui.NewProgram(style, cfg) + p.EnterAltScreen() + if err := p.Start(); err != nil { + return err + } + p.ExitAltScreen() + p.DisableMouseCellMotion() + + // Exit message + fmt.Printf("\n Thanks for using Glow!\n\n") + return nil +} + func main() { if err := rootCmd.Execute(); err != nil { os.Exit(-1) diff --git a/stash_cmd.go b/stash_cmd.go index 8760f27..d897a49 100644 --- a/stash_cmd.go +++ b/stash_cmd.go @@ -18,13 +18,17 @@ var ( memo string stashCmd = &cobra.Command{ - Use: "stash SOURCE", + Use: "stash [SOURCE]", Hidden: false, Short: "Stash a markdown", - Long: formatBlock(fmt.Sprintf("\nSave a mardkdown file to your %s.", common.Keyword("stash"))), - Example: formatBlock("glow stash README.md\nglow stash -m \"secret notes\" path/to/notes.md"), - Args: cobra.ExactArgs(1), + Long: formatBlock(fmt.Sprintf("\nDo %s stuff. Run with no arguments to browse your stash or pass a path to a markdown file to stash it.", common.Keyword("stash"))), + Example: formatBlock("glow stash\nglow stash README.md\nglow stash -m \"secret notes\" path/to/notes.md"), + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + if len(args) == 0 { + return runTUI(true) + } + filePath := args[0] if memo == "" { diff --git a/ui/stash.go b/ui/stash.go index 867f218..c8c764d 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -107,8 +107,12 @@ const ( loadedLocalFiles ) -func (s loadedState) done() bool { - return s&loadedStash != 0 && s&loadedNews != 0 && s&loadedLocalFiles != 0 +func (s loadedState) done(stashedOnly bool) bool { + state := s&loadedStash != 0 && s&loadedNews != 0 + if stashedOnly { + return state + } + return state && s&loadedLocalFiles != 0 } type stashState int @@ -327,7 +331,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } case spinner.TickMsg: - condition := !m.loaded.done() || + condition := !m.loaded.done(stashedOnly) || m.loadingFromNetwork || m.state == stashStateLoadingDocument || len(m.filesStashing) > 0 || @@ -466,7 +470,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.filesStashing[md.localPath] = struct{}{} cmds = append(cmds, stashDocument(m.cc, *md)) - if m.loaded.done() && !m.spinner.Visible() { + if m.loaded.done(stashedOnly) && !m.spinner.Visible() { m.spinner.Start() cmds = append(cmds, spinner.Tick(m.spinner)) } @@ -610,7 +614,7 @@ func stashView(m stashModel) string { case stashStateReady, stashStateSettingNote, stashStatePromptDelete: loadingIndicator := "" - if !m.loaded.done() || m.loadingFromNetwork || m.spinner.Visible() { + if !m.loaded.done(stashedOnly) || m.loadingFromNetwork || m.spinner.Visible() { loadingIndicator = spinner.View(m.spinner) } @@ -679,7 +683,7 @@ func glowLogoView(text string) string { } func stashHeaderView(m stashModel) string { - loading := !m.loaded.done() + loading := !m.loaded.done(stashedOnly) noMarkdowns := len(m.markdowns) == 0 // Still loading. We haven't found files, stashed items, or news yet. @@ -692,7 +696,11 @@ func stashHeaderView(m stashModel) string { // Loading's finished and all we have is news. if !loading && localItems == 0 && stashedItems == 0 { - return common.Subtle("No local or stashed markdown files found.") + if stashedOnly { + return common.Subtle("No stashed markdown files found.") + } else { + return common.Subtle("No local or stashed markdown files found.") + } } // There are local and/or stashed files, so display counts. diff --git a/ui/ui.go b/ui/ui.go index 7b657e6..03c74c5 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -28,13 +28,15 @@ var ( config Config glowLogoTextColor = common.Color("#ECFD65") debug = false // true if we're logging to a file, in which case we'll log more stuff + stashedOnly = false ) -// Config contains configuration specified to the TUI. +// Config contains TUI-specific configuration. type Config struct { ShowAllFiles bool Gopath string `env:"GOPATH"` HomeDir string `env:"HOME"` + StashedOnly bool // For debugging the UI Logfile string `env:"GLOW_UI_LOGFILE"` @@ -143,7 +145,7 @@ func (m *model) unloadDocument() []tea.Cmd { if m.pager.viewport.HighPerformanceRendering { batch = append(batch, tea.ClearScrollArea) } - if !m.stash.loaded.done() || m.stash.loadingFromNetwork { + if !m.stash.loaded.done(stashedOnly) || m.stash.loadingFromNetwork { batch = append(batch, spinner.Tick(m.stash.spinner)) } return batch @@ -162,6 +164,8 @@ func initialize(cfg Config, style string) func() (tea.Model, tea.Cmd) { } } + stashedOnly = cfg.StashedOnly + m := model{ cfg: cfg, stash: newStashModel(), @@ -170,11 +174,15 @@ func initialize(cfg Config, style string) func() (tea.Model, tea.Cmd) { keygenState: keygenUnstarted, } - return m, tea.Batch( - findLocalFiles(m), + cmds := []tea.Cmd{ newCharmClient, spinner.Tick(m.stash.spinner), - ) + } + if !cfg.StashedOnly { + cmds = append(cmds, findLocalFiles(m)) + } + + return m, tea.Batch(cmds...) } } From dc74e17cb877bf76ef86ac0307a3098af5b5988f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 7 Sep 2020 19:28:30 -0400 Subject: [PATCH 482/911] Add missing comma --- ui/ignore_general.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/ignore_general.go b/ui/ignore_general.go index 652d3c5..7f1da74 100644 --- a/ui/ignore_general.go +++ b/ui/ignore_general.go @@ -5,7 +5,7 @@ package ui func ignorePatterns(m model) []string { return []string{ m.cfg.Gopath, - "node_modules" + "node_modules", ".*", } } From f2537b1811bea090ca5add6688120bbd916eba8c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 7 Sep 2020 19:32:19 -0400 Subject: [PATCH 483/911] Update loading message if you're just loading your stash --- ui/stash.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index c8c764d..a69ea69 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -688,7 +688,11 @@ func stashHeaderView(m stashModel) string { // Still loading. We haven't found files, stashed items, or news yet. if loading && noMarkdowns { - return common.Subtle("Looking for stuff...") + if stashedOnly { + return common.Subtle("Loading your stash...") + } else { + return common.Subtle("Looking for stuff...") + } } localItems := m.countMarkdowns(localMarkdown) From 5c8da55a5b240ca5a8f862b2de3ad2698af1e0fd Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 8 Sep 2020 11:03:32 -0400 Subject: [PATCH 484/911] Simplify environment vars --- Makefile | 2 +- ui/ui.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 35d75a4..6d80864 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ glow: go build run: clean glow - GLOW_UI_LOGFILE=$(LOGFILE) ./glow + GLOW_LOGFILE=$(LOGFILE) ./glow log: > $(LOGFILE) diff --git a/ui/ui.go b/ui/ui.go index 03c74c5..4529675 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -39,9 +39,9 @@ type Config struct { StashedOnly bool // For debugging the UI - Logfile string `env:"GLOW_UI_LOGFILE"` - HighPerformancePager bool `env:"GLOW_UI_HIGH_PERFORMANCE_PAGER" default:"true"` - GlamourEnabled bool `env:"GLOW_UI_ENABLE_GLAMOUR" default:"true"` + Logfile string `env:"GLOW_LOGFILE"` + HighPerformancePager bool `env:"GLOW_HIGH_PERFORMANCE_PAGER" default:"true"` + GlamourEnabled bool `env:"GLOW_ENABLE_GLAMOUR" default:"true"` } // NewProgram returns a new Tea program. From 485774d0f91d0fd0bfe6e45aaa8ff026f6ac69b6 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 9 Sep 2020 18:02:00 -0400 Subject: [PATCH 485/911] Bump charm lib to fix crash if user data dir doesn't exist --- go.mod | 5 +++-- go.sum | 8 ++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 4b61432..0a15ba1 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,10 @@ require ( github.com/alecthomas/chroma v0.8.0 // indirect github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514 github.com/charmbracelet/bubbletea v0.10.3 - github.com/charmbracelet/charm v0.7.1-0.20200821194648-662b3ca6fc7e + github.com/charmbracelet/charm v0.8.0 github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac + github.com/google/uuid v1.1.2 // indirect github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.3.0 github.com/microcosm-cc/bluemonday v1.0.4 // indirect @@ -19,7 +20,7 @@ require ( github.com/yuin/goldmark v1.2.1 // indirect golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect - golang.org/x/sys v0.0.0-20200821140526-fda516888d29 + golang.org/x/sys v0.0.0-20200909081042-eff7692f9009 ) replace github.com/muesli/gitcha => github.com/meowgorithm/gitcha v0.1.2-0.20200907220241-87b69df49486 diff --git a/go.sum b/go.sum index be8156b..0734656 100644 --- a/go.sum +++ b/go.sum @@ -26,8 +26,8 @@ github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514/go.mod h1: github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.3 h1:arYCVde6OHbejtz08VOtAjsw4LlMR9pQhJCkqk3bwr8= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= -github.com/charmbracelet/charm v0.7.1-0.20200821194648-662b3ca6fc7e h1:3XtR0wWJVWCKiwt4acKh375nRmkuPYae6y8RsweS3AE= -github.com/charmbracelet/charm v0.7.1-0.20200821194648-662b3ca6fc7e/go.mod h1:kBWrZbEyxepjFthay19UTRNslbk8LkycGIFwR822Kvg= +github.com/charmbracelet/charm v0.8.0 h1:6h7tVxKHW3lJUzhOZlvlgQI3DjAbPe7PhjUJlxwJMc0= +github.com/charmbracelet/charm v0.8.0/go.mod h1:yjf8flsA3BC+oJz67FXnSZWDOpKb2LZaQ1Cn1hPz5Y0= github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f h1:VXwz/CsPDsrqUzQhp0eOB7VviujsiWKX/3H9cJOiHqc= github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f/go.mod h1:DxzK1feHER8JTrWJ4uhme1kTGs4/ozEoQhIyYzwnew0= github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= @@ -68,6 +68,8 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -210,6 +212,8 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200821140526-fda516888d29 h1:mNuhGagCf3lDDm5C0376C/sxh6V7fy9WbdEu/YDNA04= golang.org/x/sys v0.0.0-20200821140526-fda516888d29/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009 h1:W0lCpv29Hv0UaM1LXb9QlBHLNP8UFfcKjblhVCWftOM= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 2b064546b90355a5ce5d09d0e10c6323ef3dd492 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 9 Sep 2020 19:19:47 -0400 Subject: [PATCH 486/911] Move markdown types into a separate file --- ui/markdown.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ ui/stash.go | 56 ------------------------------------------- 2 files changed, 64 insertions(+), 56 deletions(-) create mode 100644 ui/markdown.go diff --git a/ui/markdown.go b/ui/markdown.go new file mode 100644 index 0000000..f8ca91c --- /dev/null +++ b/ui/markdown.go @@ -0,0 +1,64 @@ +package ui + +import ( + "strings" + + "github.com/charmbracelet/charm" +) + +// markdownType allows us to differentiate between the types of markdown +// documents we're dealing with. +type markdownType int + +const ( + stashedMarkdown markdownType = iota + newsMarkdown + localMarkdown + convertedMarkdown // used to be local, now its stashed +) + +// markdown wraps charm.Markdown. +type markdown struct { + markdownType markdownType + localPath string // only relevant to local files and converted files that are newly stashed + displayPath string // what we show in the note field + charm.Markdown +} + +// sortAsLocal returns whether or not this markdown should be sorted as though +// it's a local markdown document. +func (m markdown) sortAsLocal() bool { + return m.markdownType == localMarkdown || m.markdownType == convertedMarkdown +} + +// Sort documents with local files first, then by date. +type markdownsByLocalFirst []*markdown + +func (m markdownsByLocalFirst) Len() int { return len(m) } +func (m markdownsByLocalFirst) Swap(i, j int) { m[i], m[j] = m[j], m[i] } +func (m markdownsByLocalFirst) Less(i, j int) bool { + iIsLocal := m[i].sortAsLocal() + jIsLocal := m[j].sortAsLocal() + + // Local files (and files that used to be local) come first + if iIsLocal && !jIsLocal { + return true + } + if !iIsLocal && jIsLocal { + return false + } + + // If both are local files, sort by filename. Note that we should never + // hit equality here since two files can't have the same path. + if iIsLocal && jIsLocal { + return strings.Compare(m[i].localPath, m[j].localPath) == -1 + } + + // Neither are local files so sort by date descending + if !m[i].CreatedAt.Equal(m[j].CreatedAt) { + return m[i].CreatedAt.After(m[j].CreatedAt) + } + + // If the timestamps also match, sort by ID. + return m[i].ID > m[j].ID +} diff --git a/ui/stash.go b/ui/stash.go index a69ea69..6e379bd 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -43,62 +43,6 @@ type deletedStashedItemMsg int // MODEL -// markdownType allows us to differentiate between the types of markdown -// documents we're dealing with, namely stuff the user stashed versus news. -type markdownType int - -const ( - stashedMarkdown markdownType = iota - newsMarkdown - localMarkdown - convertedMarkdown // used to be local, now its stashed -) - -// markdown wraps charm.Markdown so we can differentiate between stashed items -// and news. -type markdown struct { - markdownType markdownType - localPath string // only relevant to local files and converted files that are newly stashed - displayPath string // what we show in the note field - charm.Markdown -} - -func (m markdown) sortAsLocal() bool { - return m.markdownType == localMarkdown || m.markdownType == convertedMarkdown -} - -// Sort documents with local files first, then by date. -type markdownsByLocalFirst []*markdown - -func (m markdownsByLocalFirst) Len() int { return len(m) } -func (m markdownsByLocalFirst) Swap(i, j int) { m[i], m[j] = m[j], m[i] } -func (m markdownsByLocalFirst) Less(i, j int) bool { - iIsLocal := m[i].sortAsLocal() - jIsLocal := m[j].sortAsLocal() - - // Local files (and files that used to be local) come first - if iIsLocal && !jIsLocal { - return true - } - if !iIsLocal && jIsLocal { - return false - } - - // If both are local files, sort by filename. Note that we should never - // hit equality here since two files can't have the same path. - if iIsLocal && jIsLocal { - return strings.Compare(m[i].localPath, m[j].localPath) == -1 - } - - // Neither are local files so sort by date descending - if !m[i].CreatedAt.Equal(m[j].CreatedAt) { - return m[i].CreatedAt.After(m[j].CreatedAt) - } - - // If the timestamps also match, sort by ID. - return m[i].ID > m[j].ID -} - type loadedState byte const ( From b94615f5ac172d4db46a3a9a157612bccca6e8eb Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 9 Sep 2020 19:43:03 -0400 Subject: [PATCH 487/911] Fix debug log in stash deletion command --- ui/stash.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 6e379bd..8cbc5ca 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -833,7 +833,7 @@ func deleteStashedItem(cc *charm.Client, id int) tea.Cmd { return func() tea.Msg { err := cc.DeleteMarkdown(id) if err != nil { - if err == nil { + if debug { log.Println("could not delete stashed item:", err) } return errMsg{err} From 555462462f76e5dd79ac12a47dc4c1976296346d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 9 Sep 2020 19:46:10 -0400 Subject: [PATCH 488/911] More logging around keygen --- ui/ui.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ui/ui.go b/ui/ui.go index 4529675..153b2d1 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -294,6 +294,9 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { } else { // The keygen ran but things still didn't work and we can't auth m.stash.err = errors.New("SSH authentication failed; we tried ssh-agent, loading keys from disk, and generating SSH keys") + if debug { + log.Println(m.stash.err) + } // Even though it failed, news/stash loading is finished m.stash.loaded |= loadedStash | loadedNews @@ -303,6 +306,9 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case keygenFailedMsg: // Keygen failed. That sucks. m.stash.err = errors.New("could not authenticate; could not generate SSH keys") + if debug { + log.Println(m.stash.err) + } m.keygenState = keygenFinished // Even though it failed, news/stash loading is finished @@ -515,6 +521,9 @@ func loadNews(m stashModel) tea.Cmd { } func generateSSHKeys() tea.Msg { + if debug { + log.Println("running keygen...") + } _, err := keygen.NewSSHKeyPair(nil) if err != nil { if debug { @@ -522,6 +531,9 @@ func generateSSHKeys() tea.Msg { } return keygenFailedMsg{err} } + if debug { + log.Println("keys generated succcessfully") + } return keygenSuccessMsg{} } From 17ea86e3ed261490e079ddf1059659b338a22e0d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 9 Sep 2020 19:53:07 -0400 Subject: [PATCH 489/911] Bump charm lib for stash-on-first-run fix --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 0a15ba1..6db4275 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/alecthomas/chroma v0.8.0 // indirect github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514 github.com/charmbracelet/bubbletea v0.10.3 - github.com/charmbracelet/charm v0.8.0 + github.com/charmbracelet/charm v0.8.1-0.20200909235124-49a4d7b584d4 github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/google/uuid v1.1.2 // indirect diff --git a/go.sum b/go.sum index 0734656..fb44de4 100644 --- a/go.sum +++ b/go.sum @@ -28,6 +28,8 @@ github.com/charmbracelet/bubbletea v0.10.3 h1:arYCVde6OHbejtz08VOtAjsw4LlMR9pQhJ github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= github.com/charmbracelet/charm v0.8.0 h1:6h7tVxKHW3lJUzhOZlvlgQI3DjAbPe7PhjUJlxwJMc0= github.com/charmbracelet/charm v0.8.0/go.mod h1:yjf8flsA3BC+oJz67FXnSZWDOpKb2LZaQ1Cn1hPz5Y0= +github.com/charmbracelet/charm v0.8.1-0.20200909235124-49a4d7b584d4 h1:cvYO9eSknLYYwf1LrGGtduQodMW9UMM+QqxANPyl63A= +github.com/charmbracelet/charm v0.8.1-0.20200909235124-49a4d7b584d4/go.mod h1:yjf8flsA3BC+oJz67FXnSZWDOpKb2LZaQ1Cn1hPz5Y0= github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f h1:VXwz/CsPDsrqUzQhp0eOB7VviujsiWKX/3H9cJOiHqc= github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f/go.mod h1:DxzK1feHER8JTrWJ4uhme1kTGs4/ozEoQhIyYzwnew0= github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= From 26b3292f57b93cada8e29d52b087a90081f2abf9 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 10 Sep 2020 13:32:57 -0400 Subject: [PATCH 490/911] Don't allow stashing until authed + introduce "offline mode" in UI --- go.mod | 2 +- go.sum | 6 ++---- ui/pager.go | 10 ++++++++-- ui/stash.go | 52 ++++++++++++++++++++++++++++++++++++---------------- ui/ui.go | 53 +++++++++++++++++++++++++++++++++++++++++++++-------- 5 files changed, 92 insertions(+), 31 deletions(-) diff --git a/go.mod b/go.mod index 6db4275..5d544d0 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/alecthomas/chroma v0.8.0 // indirect github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514 github.com/charmbracelet/bubbletea v0.10.3 - github.com/charmbracelet/charm v0.8.1-0.20200909235124-49a4d7b584d4 + github.com/charmbracelet/charm v0.8.1-0.20200910161254-bdf0d7dde0cf github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/google/uuid v1.1.2 // indirect diff --git a/go.sum b/go.sum index fb44de4..5f994c3 100644 --- a/go.sum +++ b/go.sum @@ -26,10 +26,8 @@ github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514/go.mod h1: github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= github.com/charmbracelet/bubbletea v0.10.3 h1:arYCVde6OHbejtz08VOtAjsw4LlMR9pQhJCkqk3bwr8= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= -github.com/charmbracelet/charm v0.8.0 h1:6h7tVxKHW3lJUzhOZlvlgQI3DjAbPe7PhjUJlxwJMc0= -github.com/charmbracelet/charm v0.8.0/go.mod h1:yjf8flsA3BC+oJz67FXnSZWDOpKb2LZaQ1Cn1hPz5Y0= -github.com/charmbracelet/charm v0.8.1-0.20200909235124-49a4d7b584d4 h1:cvYO9eSknLYYwf1LrGGtduQodMW9UMM+QqxANPyl63A= -github.com/charmbracelet/charm v0.8.1-0.20200909235124-49a4d7b584d4/go.mod h1:yjf8flsA3BC+oJz67FXnSZWDOpKb2LZaQ1Cn1hPz5Y0= +github.com/charmbracelet/charm v0.8.1-0.20200910161254-bdf0d7dde0cf h1:kGWvgr3g++1xKEdOkybAvDJiOQR67RJfNi+4JK76Cgs= +github.com/charmbracelet/charm v0.8.1-0.20200910161254-bdf0d7dde0cf/go.mod h1:yjf8flsA3BC+oJz67FXnSZWDOpKb2LZaQ1Cn1hPz5Y0= github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f h1:VXwz/CsPDsrqUzQhp0eOB7VviujsiWKX/3H9cJOiHqc= github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f/go.mod h1:DxzK1feHER8JTrWJ4uhme1kTGs4/ozEoQhIyYzwnew0= github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= diff --git a/ui/pager.go b/ui/pager.go index 8a5e482..327e693 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -91,6 +91,7 @@ const ( type pagerModel struct { cc *charm.Client + authStatus authStatus viewport viewport.Model state pagerState glamourStyle string @@ -112,7 +113,7 @@ type pagerModel struct { stashedDocument *markdown } -func newPagerModel(glamourStyle string) pagerModel { +func newPagerModel(as authStatus, glamourStyle string) pagerModel { // Init viewport vp := viewport.Model{} vp.YPosition = 0 @@ -138,6 +139,7 @@ func newPagerModel(glamourStyle string) pagerModel { return pagerModel{ state: pagerStateBrowse, + authStatus: as, glamourStyle: glamourStyle, textInput: ti, viewport: vp, @@ -265,6 +267,10 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { return m, textinput.Blink(m.textInput) case "s": + if m.authStatus != authOK { + break + } + // Stash a local document if m.state != pagerStateStashing && m.currentDocument.markdownType == localMarkdown { m.state = pagerStateStashing @@ -472,7 +478,7 @@ func pagerHelpView(m pagerModel, width int) (s string) { "esc back to files", "q quit", } - if m.currentDocument.markdownType != stashedMarkdown { + if m.authStatus == authOK && m.currentDocument.markdownType != stashedMarkdown { col1[4] = "s stash this document" } diff --git a/ui/stash.go b/ui/stash.go index 8cbc5ca..b95b921 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -33,7 +33,8 @@ const ( var ( stashHelpItemStyle func(string) string = te.Style{}.Foreground(common.NewColorPair("#5C5C5C", "#9B9B9B").Color()).Styled - stashHelpDivider string = te.String(" • ").Foreground(common.NewColorPair("#3C3C3C", "#DDDADA").Color()).String() + dividerDot string = te.String(" • ").Foreground(common.NewColorPair("#3C3C3C", "#DDDADA").Color()).String() + offlineHeaderNote string = te.String("(Offline)").Foreground(common.NewColorPair("#3C3C3C", "#DDDADA").Color()).String() ) // MSG @@ -71,6 +72,7 @@ const ( type stashModel struct { cc *charm.Client + authStatus authStatus state stashState err error markdowns []*markdown @@ -196,7 +198,7 @@ func (m *stashModel) hideStatusMessage() { // INIT -func newStashModel() stashModel { +func newStashModel(as authStatus) stashModel { sp := spinner.NewModel() sp.Frames = spinner.Line sp.ForegroundColor = common.SpinnerColor.String() @@ -215,6 +217,7 @@ func newStashModel() stashModel { ni.Focus() m := stashModel{ + authStatus: as, spinner: sp, noteInput: ni, page: 1, @@ -396,15 +399,22 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Stash case "s": - md := m.selectedMarkdown() - if md == nil { + if m.authStatus != authOK || m.selectedMarkdown() == nil { break } - _, exists := m.filesStashing[md.localPath] // is the file currently being stashed? + md := m.selectedMarkdown() - if exists || (md.markdownType != localMarkdown) || md.localPath == "" { - if md.markdownType == localMarkdown && md.localPath == "" { + // is the file in the process of being stashed? + _, isBeingStashed := m.filesStashing[md.localPath] + + isLocalMarkdown := md.markdownType == localMarkdown + markdownPathMissing := md.localPath == "" + + if isBeingStashed || !isLocalMarkdown || markdownPathMissing { + if debug && isBeingStashed { + log.Printf("refusing to stash markdown; we're already stashing %s", md.localPath) + } else if debug && isLocalMarkdown && markdownPathMissing { log.Printf("refusing to stash markdown; local path is empty: %#v", md) } break @@ -630,12 +640,21 @@ func stashHeaderView(m stashModel) string { loading := !m.loaded.done(stashedOnly) noMarkdowns := len(m.markdowns) == 0 + if m.authStatus == authFailed && stashedOnly { + return common.Subtle("Can’t load stash. Are you offline?") + } + + var maybeOffline string + if m.authStatus == authFailed { + maybeOffline = " " + offlineHeaderNote + } + // Still loading. We haven't found files, stashed items, or news yet. if loading && noMarkdowns { if stashedOnly { return common.Subtle("Loading your stash...") } else { - return common.Subtle("Looking for stuff...") + return common.Subtle("Looking for stuff...") + maybeOffline } } @@ -645,25 +664,26 @@ func stashHeaderView(m stashModel) string { // Loading's finished and all we have is news. if !loading && localItems == 0 && stashedItems == 0 { if stashedOnly { - return common.Subtle("No stashed markdown files found.") + return common.Subtle("No stashed markdown files found.") + maybeOffline } else { - return common.Subtle("No local or stashed markdown files found.") + return common.Subtle("No local or stashed markdown files found.") + maybeOffline } } // There are local and/or stashed files, so display counts. var s string if localItems > 0 { - s += fmt.Sprintf("%d Local", localItems) + s += common.Subtle(fmt.Sprintf("%d Local", localItems)) } if stashedItems > 0 { var divider string if localItems > 0 { - divider = " • " + divider = dividerDot } - s += fmt.Sprintf("%s%d Stashed", divider, stashedItems) + si := common.Subtle(fmt.Sprintf("%d Stashed", stashedItems)) + s += fmt.Sprintf("%s%s", divider, si) } - return common.Subtle(s) + return common.Subtle(s) + maybeOffline } func stashPopulatedView(m stashModel) string { @@ -727,7 +747,7 @@ func stashHelpView(m stashModel) string { } if isStashed { h = append(h, []string{"x: delete", "m: set memo"}...) - } else if isLocal { + } else if isLocal && m.authStatus == authOK { h = append(h, "s: stash") } if m.err != nil { @@ -764,7 +784,7 @@ func stashHelpViewBuilder(windowWidth int, sections ...string) string { } if i < len(sections)-1 { - next += stashHelpDivider + next += dividerDot } // Only this (and the following) help text items if we have the diff --git a/ui/ui.go b/ui/ui.go index 153b2d1..e7b9e49 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -77,14 +77,18 @@ type statusMessageTimeoutMsg applicationContext type newsLoadErrMsg struct{ err error } func (e errMsg) Error() string { return e.err.Error() } +func (e errMsg) Unwrap() error { return e.err } func (k keygenFailedMsg) Error() string { return k.err.Error() } +func (k keygenFailedMsg) Unwrap() error { return k.err } func (s stashLoadErrMsg) Error() string { return s.err.Error() } +func (s stashLoadErrMsg) Unwrap() error { return s.err } func (s newsLoadErrMsg) Error() string { return s.err.Error() } +func (s newsLoadErrMsg) Unwrap() error { return s.err } // MODEL // Which part of the application something appies to. Occasionally used as an -// arguments to command and messages. +// argument to commands and messages. type applicationContext int const ( @@ -99,8 +103,6 @@ const ( stateShowDocument ) -// String translates the staus to a human-readable string. This is just for -// debugging. func (s state) String() string { return [...]string{ "showing stash", @@ -108,6 +110,22 @@ func (s state) String() string { }[s] } +type authStatus int + +const ( + authConnecting authStatus = iota + authOK + authFailed +) + +func (s authStatus) String() string { + return map[authStatus]string{ + authConnecting: "connecting", + authOK: "ok", + authFailed: "failed", + }[s] +} + type keygenState int const ( @@ -119,6 +137,7 @@ const ( type model struct { cfg Config cc *charm.Client + authStatus authStatus keygenState keygenState state state fatalErr error @@ -151,6 +170,12 @@ func (m *model) unloadDocument() []tea.Cmd { return batch } +func (m *model) setAuthStatus(as authStatus) { + m.authStatus = as + m.stash.authStatus = as + m.pager.authStatus = as +} + // INIT func initialize(cfg Config, style string) func() (tea.Model, tea.Cmd) { @@ -168,11 +193,12 @@ func initialize(cfg Config, style string) func() (tea.Model, tea.Cmd) { m := model{ cfg: cfg, - stash: newStashModel(), - pager: newPagerModel(style), state: stateShowStash, + authStatus: authConnecting, keygenState: keygenUnstarted, } + m.pager = newPagerModel(m.authStatus, style) + m.stash = newStashModel(m.authStatus) cmds := []tea.Cmd{ newCharmClient, @@ -293,9 +319,10 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { cmds = append(cmds, generateSSHKeys) } else { // The keygen ran but things still didn't work and we can't auth + m.setAuthStatus(authFailed) m.stash.err = errors.New("SSH authentication failed; we tried ssh-agent, loading keys from disk, and generating SSH keys") if debug { - log.Println(m.stash.err) + log.Println("entering offline mode;", m.stash.err) } // Even though it failed, news/stash loading is finished @@ -305,10 +332,12 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case keygenFailedMsg: // Keygen failed. That sucks. + m.setAuthStatus(authFailed) m.stash.err = errors.New("could not authenticate; could not generate SSH keys") if debug { - log.Println(m.stash.err) + log.Println("entering offline mode;", m.stash.err) } + m.keygenState = keygenFinished // Even though it failed, news/stash loading is finished @@ -322,10 +351,14 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case newCharmClientMsg: m.cc = msg + m.setAuthStatus(authOK) m.stash.cc = msg m.pager.cc = msg cmds = append(cmds, loadStash(m.stash), loadNews(m.stash)) + case stashLoadErrMsg: + m.setAuthStatus(authFailed) + case fetchedMarkdownMsg: m.pager.currentDocument = *msg cmds = append(cmds, renderWithGlamour(m.pager, msg.Body)) @@ -492,7 +525,11 @@ func loadStash(m stashModel) tea.Cmd { stash, err := m.cc.GetStash(m.page) if err != nil { if debug { - log.Println("error loading stash:", err) + if _, ok := err.(charm.ErrAuthFailed); ok { + log.Println("auth failure while loading stash:", err) + } else { + log.Println("error loading stash:", err) + } } return stashLoadErrMsg{err} } From 21eccfd2c3e2f598ae8b1f8ee9bb3fc66eaa982d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 21 Sep 2020 12:34:24 -0400 Subject: [PATCH 491/911] Hop back to Muesli's gitcha repo at master --- go.mod | 4 +--- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 5d544d0..63397ff 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.3.0 github.com/microcosm-cc/bluemonday v1.0.4 // indirect - github.com/muesli/gitcha v0.1.1 + github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d github.com/muesli/termenv v0.7.2 github.com/spf13/cobra v1.0.0 @@ -22,5 +22,3 @@ require ( golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect golang.org/x/sys v0.0.0-20200909081042-eff7692f9009 ) - -replace github.com/muesli/gitcha => github.com/meowgorithm/gitcha v0.1.2-0.20200907220241-87b69df49486 diff --git a/go.sum b/go.sum index 5f994c3..cf3bd61 100644 --- a/go.sum +++ b/go.sum @@ -66,7 +66,6 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -100,8 +99,6 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 github.com/meowgorithm/babyenv v1.2.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/meowgorithm/babyenv v1.3.0 h1:klb7ugoZt0/Xlqkd5kLxM7eLZX8waiwxHZWW5nfEZ0Q= github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= -github.com/meowgorithm/gitcha v0.1.2-0.20200907220241-87b69df49486 h1:Q59vhaeBGofDFPzw9dc05t/xF5w7qlgpXLsUi3Bt5kw= -github.com/meowgorithm/gitcha v0.1.2-0.20200907220241-87b69df49486/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg= github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= @@ -110,6 +107,8 @@ github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2S github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6 h1:CUOAyrZoFRlGHfl6vljna20J++p8sPRlw9KF7fySgpA= +github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= @@ -210,7 +209,6 @@ golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200821140526-fda516888d29 h1:mNuhGagCf3lDDm5C0376C/sxh6V7fy9WbdEu/YDNA04= golang.org/x/sys v0.0.0-20200821140526-fda516888d29/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009 h1:W0lCpv29Hv0UaM1LXb9QlBHLNP8UFfcKjblhVCWftOM= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From 18e591bafecb1e9a19445cbb6ef6530552fd5db1 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 21 Sep 2020 12:38:03 -0400 Subject: [PATCH 492/911] Use filepath.Join rather than string concatenation --- ui/ignore_darwin.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/ignore_darwin.go b/ui/ignore_darwin.go index 848fb5a..51cdac3 100644 --- a/ui/ignore_darwin.go +++ b/ui/ignore_darwin.go @@ -2,11 +2,11 @@ package ui -import "os" +import "path/filepath" func ignorePatterns(m model) []string { return []string{ - m.cfg.HomeDir + string(os.PathSeparator) + "Library", + filepath.Join(m.cfg.HomeDir, "Library"), m.cfg.Gopath, "node_modules", ".*", From b30bf4cf6f722f6069d0de68db93caed837aa4de Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 21 Sep 2020 13:25:49 -0400 Subject: [PATCH 493/911] Bump bubbletea for post-panic terminal restoration --- go.mod | 6 +++--- go.sum | 13 ++++++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 63397ff..c13be67 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.13 require ( github.com/alecthomas/chroma v0.8.0 // indirect github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514 - github.com/charmbracelet/bubbletea v0.10.3 - github.com/charmbracelet/charm v0.8.1-0.20200910161254-bdf0d7dde0cf + github.com/charmbracelet/bubbletea v0.10.4 + github.com/charmbracelet/charm v0.8.1-0.20200921172418-db88c362fef4 github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/google/uuid v1.1.2 // indirect @@ -20,5 +20,5 @@ require ( github.com/yuin/goldmark v1.2.1 // indirect golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect - golang.org/x/sys v0.0.0-20200909081042-eff7692f9009 + golang.org/x/sys v0.0.0-20200918174421-af09f7315aff ) diff --git a/go.sum b/go.sum index cf3bd61..61710a5 100644 --- a/go.sum +++ b/go.sum @@ -24,10 +24,11 @@ github.com/charmbracelet/bubbles v0.5.1/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taF github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514 h1:bX+1jBgHjwf6X42XOZF5LZEHHU8AuCaXIjgoEFB8pM0= github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= -github.com/charmbracelet/bubbletea v0.10.3 h1:arYCVde6OHbejtz08VOtAjsw4LlMR9pQhJCkqk3bwr8= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= -github.com/charmbracelet/charm v0.8.1-0.20200910161254-bdf0d7dde0cf h1:kGWvgr3g++1xKEdOkybAvDJiOQR67RJfNi+4JK76Cgs= -github.com/charmbracelet/charm v0.8.1-0.20200910161254-bdf0d7dde0cf/go.mod h1:yjf8flsA3BC+oJz67FXnSZWDOpKb2LZaQ1Cn1hPz5Y0= +github.com/charmbracelet/bubbletea v0.10.4 h1:d0tOQ/z1DXifSN8YW/EdEXPRlSqI/H5XnsYA4MLcvDw= +github.com/charmbracelet/bubbletea v0.10.4/go.mod h1:/GyAaNPd3i1nH03g2lh1ENeBMoBn8YHNY9vh7h4gHX0= +github.com/charmbracelet/charm v0.8.1-0.20200921172418-db88c362fef4 h1:gR/TV7VJqHzxVoRrMc/jO0Cguc81vQHLABaLrv57Y+o= +github.com/charmbracelet/charm v0.8.1-0.20200921172418-db88c362fef4/go.mod h1:Qq0DMz/Iue/KmjNvfUg0LRME32bvHfnfdzAeI/JorUU= github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f h1:VXwz/CsPDsrqUzQhp0eOB7VviujsiWKX/3H9cJOiHqc= github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f/go.mod h1:DxzK1feHER8JTrWJ4uhme1kTGs4/ozEoQhIyYzwnew0= github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= @@ -128,8 +129,9 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03 h1:pd4YKIqCB0U7O2I4gWHgEUA2mCEOENmco0l/bM957bU= github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03/go.mod h1:Z9+Ul5bCbBKnbCvdOWbLqTHhJiYV414CURZJba6L8qA= +github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= +github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -210,8 +212,9 @@ golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200821140526-fda516888d29/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009 h1:W0lCpv29Hv0UaM1LXb9QlBHLNP8UFfcKjblhVCWftOM= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200918174421-af09f7315aff h1:1CPUrky56AcgSpxz/KfgzQWzfG09u5YOL8MvPYBlrL8= +golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 66caa28d64656e22f24a45b58e9c6501ee410be2 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 6 Oct 2020 18:34:39 +0200 Subject: [PATCH 494/911] Bump bubbletea, bubbles, charm & glamour dependencies --- go.mod | 13 ++++++------- go.sum | 46 ++++++++++++++++++++++++++-------------------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index c13be67..88e5cf8 100644 --- a/go.mod +++ b/go.mod @@ -4,10 +4,10 @@ go 1.13 require ( github.com/alecthomas/chroma v0.8.0 // indirect - github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514 - github.com/charmbracelet/bubbletea v0.10.4 - github.com/charmbracelet/charm v0.8.1-0.20200921172418-db88c362fef4 - github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f + github.com/charmbracelet/bubbles v0.6.1 + github.com/charmbracelet/bubbletea v0.10.5 + github.com/charmbracelet/charm v0.8.2 + github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/google/uuid v1.1.2 // indirect github.com/mattn/go-runewidth v0.0.9 @@ -17,8 +17,7 @@ require ( github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d github.com/muesli/termenv v0.7.2 github.com/spf13/cobra v1.0.0 - github.com/yuin/goldmark v1.2.1 // indirect - golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a + golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect - golang.org/x/sys v0.0.0-20200918174421-af09f7315aff + golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f ) diff --git a/go.sum b/go.sum index 61710a5..390ac6d 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,15 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= github.com/alecthomas/chroma v0.7.3/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= github.com/alecthomas/chroma v0.8.0 h1:HS+HE97sgcqjQGu5uVr8jIE55Mmh5UeQ7kckAhHg2pY= github.com/alecthomas/chroma v0.8.0/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= +github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= +github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -20,17 +23,17 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/bubbles v0.5.1/go.mod h1:xmZpdK4/Sn3bGgBKK40YPmM9Hf4taFGgKkLqSdAb0FA= -github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514 h1:bX+1jBgHjwf6X42XOZF5LZEHHU8AuCaXIjgoEFB8pM0= -github.com/charmbracelet/bubbles v0.5.2-0.20200825133643-5f7c8b537514/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= -github.com/charmbracelet/bubbletea v0.9.1-0.20200713153904-2f53eeb54b90/go.mod h1:wjGGC5pyYvpuls0so+w4Zv+aZQW7RoPvsi9UBcDlSl8= +github.com/charmbracelet/bubbles v0.6.0 h1:i884UciNkSDSOQKgYrMFCLcVN8r0tX5K4pthOwBkZ7Q= +github.com/charmbracelet/bubbles v0.6.0/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= +github.com/charmbracelet/bubbles v0.6.1 h1:SnyRY9vJMXW1sjECGUVdbec4O6V425ImAkIdwX3HkK8= +github.com/charmbracelet/bubbles v0.6.1/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= -github.com/charmbracelet/bubbletea v0.10.4 h1:d0tOQ/z1DXifSN8YW/EdEXPRlSqI/H5XnsYA4MLcvDw= -github.com/charmbracelet/bubbletea v0.10.4/go.mod h1:/GyAaNPd3i1nH03g2lh1ENeBMoBn8YHNY9vh7h4gHX0= -github.com/charmbracelet/charm v0.8.1-0.20200921172418-db88c362fef4 h1:gR/TV7VJqHzxVoRrMc/jO0Cguc81vQHLABaLrv57Y+o= -github.com/charmbracelet/charm v0.8.1-0.20200921172418-db88c362fef4/go.mod h1:Qq0DMz/Iue/KmjNvfUg0LRME32bvHfnfdzAeI/JorUU= -github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f h1:VXwz/CsPDsrqUzQhp0eOB7VviujsiWKX/3H9cJOiHqc= -github.com/charmbracelet/glamour v0.2.1-0.20200820173154-593dda41c59f/go.mod h1:DxzK1feHER8JTrWJ4uhme1kTGs4/ozEoQhIyYzwnew0= +github.com/charmbracelet/bubbletea v0.10.5 h1:HH5Yo0llnjjX07KCZCFrUdf9JXg5Q9LJaLMyXGuZsO0= +github.com/charmbracelet/bubbletea v0.10.5/go.mod h1:Nay5oWkkSZvc6E/be+W3nDFXAsVytNUNKV9jbXcuae0= +github.com/charmbracelet/charm v0.8.2 h1:sYJhP7YopJUvjWE8VKlNrcAHAaRZsEgKn8z2FoIhHOI= +github.com/charmbracelet/charm v0.8.2/go.mod h1:xi3evUxj8hw+dMApaXRczb2SiEzrn8a3NYobj0off+c= +github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 h1:XgXVfMdJTNTq/ajMvwiB1OW3Tg/TXHtM3tYr/vYF76w= +github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5/go.mod h1:CGH6KT1ovzvGpaQFxkm9ulKx6BlfV4dThCDaOMi54qI= github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -43,6 +46,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -77,6 +81,7 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmg github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= @@ -84,8 +89,10 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= @@ -117,7 +124,6 @@ github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d h1:ok5jhmKQze1yERN github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= -github.com/muesli/termenv v0.5.3-0.20200625163851-04b5c30e4c04/go.mod h1:O1/I6sw+6KcrgAmcs6uiUVr7Lui+DNVbHTzt9Lm/PlI= github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/muesli/termenv v0.7.2 h1:r1raklL3uKE7rOvWgSenmEm2px+dnc33OTisZ8YR1fw= github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= @@ -132,6 +138,7 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03/go.mod h1:Z9+Ul5bCbBKnbCvdOWbLqTHhJiYV414CURZJba6L8qA= github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -146,6 +153,7 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -164,12 +172,12 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.2.0/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -178,12 +186,11 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -208,13 +215,10 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200821140526-fda516888d29/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200918174421-af09f7315aff h1:1CPUrky56AcgSpxz/KfgzQWzfG09u5YOL8MvPYBlrL8= -golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -226,10 +230,12 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 281426270c86c1d8d2e04522895e4d6535752041 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 6 Oct 2020 18:46:52 +0200 Subject: [PATCH 495/911] Enable brew Linux builds in the charmbracelet/tap --- .goreleaser.yml | 39 ++++++++++++--------------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 47eb66a..a8cec2e 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -2,16 +2,16 @@ env: - GO111MODULE=on before: hooks: - - go mod download + - go mod download builds: - - - id: "glow" + - id: "glow" binary: glow ldflags: -s -w -X main.Version={{ .Version }} -X main.CommitSHA={{ .Commit }} goos: - linux - #- freebsd - #- windows + # - freebsd + - darwin + # - windows goarch: - amd64 - arm64 @@ -20,14 +20,6 @@ builds: goarm: - 6 - 7 - - - id: "darwin" - binary: "glow" - ldflags: -s -w -X main.Version={{ .Version }} -X main.CommitSHA={{ .Commit }} - goos: - - darwin - goarch: - - amd64 archives: - id: default @@ -38,19 +30,13 @@ archives: format: zip replacements: windows: Windows - 386: i386 - amd64: x86_64 - - id: darwin - builds: - - darwin - replacements: darwin: Darwin + 386: i386 amd64: x86_64 nfpms: - - - builds: - - glow + - builds: + - glow vendor: charmbracelet homepage: "https://charm.sh/" @@ -63,8 +49,7 @@ nfpms: bindir: /usr/bin brews: - - ids: - - darwin + - goarm: 6 tap: owner: charmbracelet name: homebrew-tap @@ -79,12 +64,12 @@ signs: - artifacts: checksum checksum: - name_template: 'checksums.txt' + name_template: "checksums.txt" snapshot: name_template: "{{ .Tag }}-next" changelog: sort: asc filters: exclude: - - '^docs:' - - '^test:' + - "^docs:" + - "^test:" From 6a1c227231211255f74ee2166553e488fccf4c60 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 7 Oct 2020 19:02:12 +0200 Subject: [PATCH 496/911] Disable CGO for goreleaser builds --- .goreleaser.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.goreleaser.yml b/.goreleaser.yml index a8cec2e..c8e24d3 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -1,5 +1,6 @@ env: - GO111MODULE=on + - CGO_ENABLED=0 before: hooks: - go mod download From 66a8ac10bcdfc591cbf806642d6996b757794cf2 Mon Sep 17 00:00:00 2001 From: bubersson Date: Thu, 8 Oct 2020 21:22:54 -0700 Subject: [PATCH 497/911] Remove duplicate "down/j" from the "?" help --- ui/pager.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 327e693..b040906 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -484,12 +484,11 @@ func pagerHelpView(m pagerModel, width int) (s string) { s += "\n" s += "k/↑ up " + col1[0] + "\n" - s += "j/↓ down " + col1[1] + "\n" - s += "j/↓ down " + col1[2] + "\n" - s += "b/pgup page up " + col1[3] + "\n" - s += "f/pgdn page down " + col1[4] + "\n" - s += "u ½ page up " + col1[5] + "\n" - s += "d ½ page down" + s += "j/↓ down " + col1[1] + "\n" + s += "b/pgup page up " + col1[2] + "\n" + s += "f/pgdn page down " + col1[3] + "\n" + s += "u ½ page up " + col1[4] + "\n" + s += "d ½ page down " + col1[5] + "\n" s = indent(s, 2) From 11d585870c121c539eb68621e1898b97a444c84a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 9 Oct 2020 14:27:19 -0400 Subject: [PATCH 498/911] Don't show add memo help in pager for local items --- ui/pager.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index b040906..3becb6a 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -479,12 +479,12 @@ func pagerHelpView(m pagerModel, width int) (s string) { "q quit", } if m.authStatus == authOK && m.currentDocument.markdownType != stashedMarkdown { - col1[4] = "s stash this document" + col1[5] = "s stash this document" } s += "\n" s += "k/↑ up " + col1[0] + "\n" - s += "j/↓ down " + col1[1] + "\n" + s += "j/↓ down " + col1[1] + "\n" s += "b/pgup page up " + col1[2] + "\n" s += "f/pgdn page down " + col1[3] + "\n" s += "u ½ page up " + col1[4] + "\n" From 5a6544d71ed16aef5275344c9d9daa13b6971d1b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 12 Oct 2020 08:02:32 -0400 Subject: [PATCH 499/911] Fix typo in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f27a2c8..a0e66ce 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ go get github.com/charmbracelet/glow Simply run `glow` without arguments to start the textual user iterface and browse local and stashed markdown. Glow will find local markdown files it the -current directory or below or, if you’re in a Git repository, Glow will search +current directory and below or, if you’re in a Git repository, Glow will search the repo. Markdown files can be read with Glow's high-performance pager. Most of the From 5f9c5b708df7771acc7a6c341562c4fdad4416e4 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 12 Oct 2020 23:23:38 -0400 Subject: [PATCH 500/911] Windows support + bump termenv dependency --- console_windows.go | 23 ----------------------- go.mod | 7 +++---- go.sum | 8 ++++++++ 3 files changed, 11 insertions(+), 27 deletions(-) delete mode 100644 console_windows.go diff --git a/console_windows.go b/console_windows.go deleted file mode 100644 index 2516b16..0000000 --- a/console_windows.go +++ /dev/null @@ -1,23 +0,0 @@ -// +build windows - -package main - -import ( - "os" - - "golang.org/x/sys/windows" -) - -// enableAnsiColors enables support for ANSI color sequences in Windows -// default console. Note that this only works with Windows 10. -func enableAnsiColors() { - stdout := windows.Handle(os.Stdout.Fd()) - var originalMode uint32 - - windows.GetConsoleMode(stdout, &originalMode) - windows.SetConsoleMode(stdout, originalMode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING) -} - -func init() { - enableAnsiColors() -} diff --git a/go.mod b/go.mod index 88e5cf8..10e7155 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/alecthomas/chroma v0.8.0 // indirect github.com/charmbracelet/bubbles v0.6.1 - github.com/charmbracelet/bubbletea v0.10.5 + github.com/charmbracelet/bubbletea v0.10.6-0.20201013031455-9c9a92c34975 github.com/charmbracelet/charm v0.8.2 github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac @@ -15,9 +15,8 @@ require ( github.com/microcosm-cc/bluemonday v1.0.4 // indirect github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6 github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d - github.com/muesli/termenv v0.7.2 + github.com/muesli/termenv v0.7.4 github.com/spf13/cobra v1.0.0 - golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 + golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect - golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f ) diff --git a/go.sum b/go.sum index 390ac6d..fe02435 100644 --- a/go.sum +++ b/go.sum @@ -30,6 +30,8 @@ github.com/charmbracelet/bubbles v0.6.1/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW6 github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= github.com/charmbracelet/bubbletea v0.10.5 h1:HH5Yo0llnjjX07KCZCFrUdf9JXg5Q9LJaLMyXGuZsO0= github.com/charmbracelet/bubbletea v0.10.5/go.mod h1:Nay5oWkkSZvc6E/be+W3nDFXAsVytNUNKV9jbXcuae0= +github.com/charmbracelet/bubbletea v0.10.6-0.20201013031455-9c9a92c34975 h1:0dmhgcKztDXm4Kx7qqOL75BQnZsBnjHcwDmT+cAQAV8= +github.com/charmbracelet/bubbletea v0.10.6-0.20201013031455-9c9a92c34975/go.mod h1:3qvITnDl64qjE8Ttw98v/gvNk7kwNUY0v85+6jJi7pU= github.com/charmbracelet/charm v0.8.2 h1:sYJhP7YopJUvjWE8VKlNrcAHAaRZsEgKn8z2FoIhHOI= github.com/charmbracelet/charm v0.8.2/go.mod h1:xi3evUxj8hw+dMApaXRczb2SiEzrn8a3NYobj0off+c= github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 h1:XgXVfMdJTNTq/ajMvwiB1OW3Tg/TXHtM3tYr/vYF76w= @@ -127,6 +129,8 @@ github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5 github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/muesli/termenv v0.7.2 h1:r1raklL3uKE7rOvWgSenmEm2px+dnc33OTisZ8YR1fw= github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= +github.com/muesli/termenv v0.7.4 h1:/pBqvU5CpkY53tU0vVn+xgs2ZTX63aH5nY+SSps5Xa8= +github.com/muesli/termenv v0.7.4/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= @@ -191,6 +195,8 @@ golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee h1:4yd7jl+vXjalO5ztz6Vc1VADv+S/80LGJmyl1ROJ2AI= +golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -219,6 +225,8 @@ golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM= +golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From 8ed7bb7717eae5ea39233aa18d4c1cc70249ff13 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 12 Oct 2020 23:57:08 -0400 Subject: [PATCH 501/911] Restore ANSI support to non-TUI Glow on Windows --- console_windows.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 console_windows.go diff --git a/console_windows.go b/console_windows.go new file mode 100644 index 0000000..2516b16 --- /dev/null +++ b/console_windows.go @@ -0,0 +1,23 @@ +// +build windows + +package main + +import ( + "os" + + "golang.org/x/sys/windows" +) + +// enableAnsiColors enables support for ANSI color sequences in Windows +// default console. Note that this only works with Windows 10. +func enableAnsiColors() { + stdout := windows.Handle(os.Stdout.Fd()) + var originalMode uint32 + + windows.GetConsoleMode(stdout, &originalMode) + windows.SetConsoleMode(stdout, originalMode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING) +} + +func init() { + enableAnsiColors() +} From d4adf0d8569b00a09e3e2dea14f8c61293d23fec Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 13 Oct 2020 11:27:41 -0400 Subject: [PATCH 502/911] Don't use emojis on Windows --- ui/consts_unix.go | 7 +++++++ ui/consts_windows.go | 7 +++++++ ui/pager.go | 5 ++--- 3 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 ui/consts_unix.go create mode 100644 ui/consts_windows.go diff --git a/ui/consts_unix.go b/ui/consts_unix.go new file mode 100644 index 0000000..fd13ad3 --- /dev/null +++ b/ui/consts_unix.go @@ -0,0 +1,7 @@ +// +build !windows + +package ui + +const ( + pagerStashIcon = "🔒" +) diff --git a/ui/consts_windows.go b/ui/consts_windows.go new file mode 100644 index 0000000..25f9851 --- /dev/null +++ b/ui/consts_windows.go @@ -0,0 +1,7 @@ +// +build windows + +package ui + +const ( + pagerStashIcon = "•" +) diff --git a/ui/pager.go b/ui/pager.go index 3becb6a..d61bde5 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -29,7 +29,6 @@ const ( darkGreen = "#1C8760" noteHeadingText = " Set Memo " notePromptText = " > " - pagerStashIcon = "🔒" ) var ( @@ -49,7 +48,7 @@ var ( statusBarHelpStyle = newStyle(statusBarNoteFg.String(), common.NewColorPair("#323232", "#DCDCDC").String()) statusBarStashDotStyle = newStyle(common.Green.String(), statusBarBg.String()) statusBarMessageStyle = newStyle(mintGreen, darkGreen) - statusBarMessageStashDotStyle = newStyle(mintGreen, darkGreen) + statusBarMessageStashIconStyle = newStyle(mintGreen, darkGreen) statusBarMessageScrollPosStyle = newStyle(mintGreen, darkGreen) statusBarMessageHelpStyle = newStyle("#B6FFE4", common.Green.String()) @@ -410,7 +409,7 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { statusIndicator = statusBarNoteStyle(" ") + spinner.View(m.spinner) } } else if isStashed && showStatusMessage { - statusIndicator = statusBarMessageStashDotStyle(" " + pagerStashIcon) + statusIndicator = statusBarMessageStashIconStyle(" " + pagerStashIcon) } else if isStashed { statusIndicator = statusBarStashDotStyle(" " + pagerStashIcon) } From 90499914a8ffb5d1371aa8f7da8581ecd2291986 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 13 Oct 2020 15:50:43 -0400 Subject: [PATCH 503/911] Bump bubbletea dependency for arrow key support on Windows --- go.mod | 3 ++- go.sum | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 10e7155..f35dddd 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/alecthomas/chroma v0.8.0 // indirect github.com/charmbracelet/bubbles v0.6.1 - github.com/charmbracelet/bubbletea v0.10.6-0.20201013031455-9c9a92c34975 + github.com/charmbracelet/bubbletea v0.11.1 github.com/charmbracelet/charm v0.8.2 github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac @@ -19,4 +19,5 @@ require ( github.com/spf13/cobra v1.0.0 golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect + golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb ) diff --git a/go.sum b/go.sum index fe02435..6409c4f 100644 --- a/go.sum +++ b/go.sum @@ -28,10 +28,9 @@ github.com/charmbracelet/bubbles v0.6.0/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW6 github.com/charmbracelet/bubbles v0.6.1 h1:SnyRY9vJMXW1sjECGUVdbec4O6V425ImAkIdwX3HkK8= github.com/charmbracelet/bubbles v0.6.1/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= -github.com/charmbracelet/bubbletea v0.10.5 h1:HH5Yo0llnjjX07KCZCFrUdf9JXg5Q9LJaLMyXGuZsO0= github.com/charmbracelet/bubbletea v0.10.5/go.mod h1:Nay5oWkkSZvc6E/be+W3nDFXAsVytNUNKV9jbXcuae0= -github.com/charmbracelet/bubbletea v0.10.6-0.20201013031455-9c9a92c34975 h1:0dmhgcKztDXm4Kx7qqOL75BQnZsBnjHcwDmT+cAQAV8= -github.com/charmbracelet/bubbletea v0.10.6-0.20201013031455-9c9a92c34975/go.mod h1:3qvITnDl64qjE8Ttw98v/gvNk7kwNUY0v85+6jJi7pU= +github.com/charmbracelet/bubbletea v0.11.1 h1:A+1+YqYN0j/ghKfGZ27LJo+Vg80fGDP+MTudHO56t2o= +github.com/charmbracelet/bubbletea v0.11.1/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= github.com/charmbracelet/charm v0.8.2 h1:sYJhP7YopJUvjWE8VKlNrcAHAaRZsEgKn8z2FoIhHOI= github.com/charmbracelet/charm v0.8.2/go.mod h1:xi3evUxj8hw+dMApaXRczb2SiEzrn8a3NYobj0off+c= github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 h1:XgXVfMdJTNTq/ajMvwiB1OW3Tg/TXHtM3tYr/vYF76w= @@ -39,6 +38,8 @@ github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5/go.mod h1: github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/containerd/console v1.0.1 h1:u7SFAJyRqWcG6ogaMAx3KjSTy1e3hT9QxqX7Jco7dRc= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -138,6 +139,7 @@ github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FW github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03/go.mod h1:Z9+Ul5bCbBKnbCvdOWbLqTHhJiYV414CURZJba6L8qA= github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= @@ -223,10 +225,13 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb h1:HS9IzC4UFbpMBLQUDSQcU+ViVT1vdFCQVjdPVpTlZrs= +golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From b9e5d6b144b111ade70e30b7f31e1c46f79a7ec9 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 14 Oct 2020 04:38:57 +0200 Subject: [PATCH 504/911] Enable Windows, FreeBSD, OpenBSD and Alpine builds --- .goreleaser.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index c8e24d3..82f666b 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -10,9 +10,10 @@ builds: ldflags: -s -w -X main.Version={{ .Version }} -X main.CommitSHA={{ .Commit }} goos: - linux - # - freebsd + - freebsd + - openbsd - darwin - # - windows + - windows goarch: - amd64 - arm64 @@ -45,6 +46,7 @@ nfpms: description: "Render markdown on the CLI" license: MIT formats: + - apk - deb - rpm bindir: /usr/bin From f58ec4d9486909370aabb759cf09cf86c578cb13 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 13 Oct 2020 22:56:33 -0400 Subject: [PATCH 505/911] Note new Windows, OpenBSD, and Alpine support in README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a0e66ce..ccbf58e 100644 --- a/README.md +++ b/README.md @@ -48,9 +48,9 @@ nix-env -iA nixpkgs.glow pkg install glow ``` -Or download a binary from the [releases][releases] page. MacOS, Linux, FreeBSD -binaries are available, as well as Debian and RPM packages. ARM builds are also -available for Linux and FreeBSD. +Or download a binary from the [releases][releases] page. MacOS, Linux, Windows, +FreeBSD, and OpenBSD binaries are available, as well as Debian, RPM, and Alpine +packages. ARM builds are also available for Linux, FreeBSD,and OpenBSD. Or just use `go get`: From 30d37a1eebf5b194cdd07e6655bb6023d5b3c524 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 14 Oct 2020 04:57:57 +0200 Subject: [PATCH 506/911] Fix README typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ccbf58e..3858f82 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ pkg install glow Or download a binary from the [releases][releases] page. MacOS, Linux, Windows, FreeBSD, and OpenBSD binaries are available, as well as Debian, RPM, and Alpine -packages. ARM builds are also available for Linux, FreeBSD,and OpenBSD. +packages. ARM builds are also available for Linux, FreeBSD, and OpenBSD. Or just use `go get`: From 7f359969b75d5a841f37bfd5b0727396e41ac825 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Thu, 15 Oct 2020 01:58:04 +0200 Subject: [PATCH 507/911] Don't handle filenames with a colon in it as http(s) url --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index a7a0ab4..59888d8 100644 --- a/main.go +++ b/main.go @@ -73,7 +73,7 @@ func sourceFromArg(arg string) (*source, error) { } // HTTP(S) URLs: - if u, err := url.ParseRequestURI(arg); err == nil { + if u, err := url.ParseRequestURI(arg); err == nil && strings.Contains(arg, "://") { if u.Scheme != "" { if u.Scheme != "http" && u.Scheme != "https" { return nil, fmt.Errorf("%s is not a supported protocol", u.Scheme) From d1bb32331668b4bb8df9d53f787abb696b001dd9 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 15 Oct 2020 06:52:36 +0200 Subject: [PATCH 508/911] State minimum required Go version in README Fixes #164. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3858f82..c71620e 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Or download a binary from the [releases][releases] page. MacOS, Linux, Windows, FreeBSD, and OpenBSD binaries are available, as well as Debian, RPM, and Alpine packages. ARM builds are also available for Linux, FreeBSD, and OpenBSD. -Or just use `go get`: +Or just use `go get` (requires Go 1.13+): ```bash go get github.com/charmbracelet/glow From 07aa18e350bdc278cb404606c5de2633e03eab87 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 17 Oct 2020 14:30:03 +0200 Subject: [PATCH 509/911] Update build instructions Fixes #171. --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c71620e..f2c2b9d 100644 --- a/README.md +++ b/README.md @@ -52,10 +52,12 @@ Or download a binary from the [releases][releases] page. MacOS, Linux, Windows, FreeBSD, and OpenBSD binaries are available, as well as Debian, RPM, and Alpine packages. ARM builds are also available for Linux, FreeBSD, and OpenBSD. -Or just use `go get` (requires Go 1.13+): +Or just build it yourself (requires Go 1.13+): ```bash -go get github.com/charmbracelet/glow +git clone https://github.com/charmbracelet/glow.git +cd glow +go build ``` [releases]: https://github.com/charmbracelet/glow/releases From 3e6e1a17b0480fa3d5182c437d2276ad3e6ccd21 Mon Sep 17 00:00:00 2001 From: Herby Gillot Date: Sat, 17 Oct 2020 16:15:03 -0400 Subject: [PATCH 510/911] README: add MacPorts install instructions --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index f2c2b9d..4743c70 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,9 @@ Use your fave package manager: # macOS or Linux brew install glow +# macOS (with MacPorts) +sudo port install glow + # Arch Linux (btw) yay -S glow From 7f2c30065df06ff19cbd2096695ff72cb748f63d Mon Sep 17 00:00:00 2001 From: Prashanta Paudel Date: Sun, 18 Oct 2020 19:11:45 +0300 Subject: [PATCH 511/911] Fix typo in README.md (#176) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4743c70..9f49db4 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ go build ## The TUI -Simply run `glow` without arguments to start the textual user iterface and +Simply run `glow` without arguments to start the textual user interface and browse local and stashed markdown. Glow will find local markdown files it the current directory and below or, if you’re in a Git repository, Glow will search the repo. From d36b9d483824b60e337121fff292728b3d32032b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 18 Oct 2020 18:11:29 +0200 Subject: [PATCH 512/911] Clean up and re-enable Windows workflow --- .github/workflows/go.yml | 50 ++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 1cceb0b..7a5452c 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -5,39 +5,33 @@ jobs: strategy: matrix: go-version: [1.13.x, 1.14.x, 1.15.x] - platform: [ubuntu-latest, macos-latest] - runs-on: ${{ matrix.platform }} + os: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} env: GO111MODULE: "on" steps: + - name: Install Go + uses: actions/setup-go@v1 + with: + go-version: ${{ matrix.go-version }} - - name: Configure git for private modules - env: - TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} - run: git config --global url."https://meowgorithm:${TOKEN}@github.com".insteadOf "https://github.com" + - name: Checkout code + uses: actions/checkout@v1 - - name: Install Go - uses: actions/setup-go@v1 - with: - go-version: ${{ matrix.go-version }} + - name: Download Go modules + run: go mod download - - name: Checkout code - uses: actions/checkout@v1 + - name: Build + run: go build -v ./... - - name: Download Go modules - run: go mod download + - name: Test + run: go test ./... - - name: Build - run: go build -v ./... - - - name: Test - run: go test ./... - - - name: Coverage - env: - COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - go test -race -covermode atomic -coverprofile=profile.cov ./... - GO111MODULE=off go get github.com/mattn/goveralls - $(go env GOPATH)/bin/goveralls -coverprofile=profile.cov -service=github - if: matrix.go-version == '1.15.x' && matrix.platform == 'ubuntu-latest' + - name: Coverage + env: + COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + go test -race -covermode atomic -coverprofile=profile.cov ./... + GO111MODULE=off go get github.com/mattn/goveralls + $(go env GOPATH)/bin/goveralls -coverprofile=profile.cov -service=github + if: matrix.go-version == '1.15.x' && matrix.platform == 'ubuntu-latest' From dfa54ada45f61f40e4c207d444ab2d25951a67a9 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 18 Oct 2020 18:20:18 +0200 Subject: [PATCH 513/911] Add golangci linter to GitHub workflows --- .github/workflows/lint.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..e917f47 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,20 @@ +name: lint +on: [push, pull_request] + +jobs: + golangci: + name: lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: golangci-lint + uses: golangci/golangci-lint-action@v2 + with: + # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. + version: v1.30 + # Optional: golangci-lint command line arguments. + args: --issues-exit-code=0 + # Optional: working directory, useful for monorepos + # working-directory: somedir + # Optional: show only new issues if it's a pull request. The default value is `false`. + only-new-issues: true From 8b78086f5608206d05c3599287c24a8fbaf03ec2 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sun, 18 Oct 2020 18:40:49 -0400 Subject: [PATCH 514/911] Remove extra line at the bottom of pager help --- ui/pager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index d61bde5..e11866e 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -487,7 +487,7 @@ func pagerHelpView(m pagerModel, width int) (s string) { s += "b/pgup page up " + col1[2] + "\n" s += "f/pgdn page down " + col1[3] + "\n" s += "u ½ page up " + col1[4] + "\n" - s += "d ½ page down " + col1[5] + "\n" + s += "d ½ page down " + col1[5] s = indent(s, 2) From 477979bce96b1f2fa8d1d2785d96bddcd2c45d04 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sun, 18 Oct 2020 22:12:08 -0400 Subject: [PATCH 515/911] Correct placement of stash hint in pager help --- ui/pager.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index e11866e..71e1d1b 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -469,17 +469,19 @@ func pagerSetNoteView(b *strings.Builder, m pagerModel) { } func pagerHelpView(m pagerModel, width int) (s string) { + memoOrStash := "m set memo" + if m.authStatus == authOK && m.currentDocument.markdownType != stashedMarkdown { + memoOrStash = "s stash this document" + } + col1 := [...]string{ "g/home go to top", "G/end go to bottom", "", - "m set memo", + memoOrStash, "esc back to files", "q quit", } - if m.authStatus == authOK && m.currentDocument.markdownType != stashedMarkdown { - col1[5] = "s stash this document" - } s += "\n" s += "k/↑ up " + col1[0] + "\n" From e63aa950d44b464f4ce4caba2ddd1a492444ecda Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 19 Oct 2020 06:15:02 +0200 Subject: [PATCH 516/911] Fix coverage reporting from GitHub workflow --- .github/workflows/{go.yml => build.yml} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename .github/workflows/{go.yml => build.yml} (88%) diff --git a/.github/workflows/go.yml b/.github/workflows/build.yml similarity index 88% rename from .github/workflows/go.yml rename to .github/workflows/build.yml index 7a5452c..93cdb9d 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/build.yml @@ -16,7 +16,7 @@ jobs: go-version: ${{ matrix.go-version }} - name: Checkout code - uses: actions/checkout@v1 + uses: actions/checkout@v2 - name: Download Go modules run: go mod download @@ -34,4 +34,4 @@ jobs: go test -race -covermode atomic -coverprofile=profile.cov ./... GO111MODULE=off go get github.com/mattn/goveralls $(go env GOPATH)/bin/goveralls -coverprofile=profile.cov -service=github - if: matrix.go-version == '1.15.x' && matrix.platform == 'ubuntu-latest' + if: matrix.go-version == '1.15.x' && matrix.os == 'ubuntu-latest' From 5847578f42dcd73ff687e89438c2629bafc3dbfa Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sun, 18 Oct 2020 20:10:28 -0400 Subject: [PATCH 517/911] Convert pager to bubbletea 0.12.0 format --- ui/pager.go | 44 +++++++++++++++++--------------------------- ui/ui.go | 6 +++--- 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 71e1d1b..f868778 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -32,7 +32,7 @@ const ( ) var ( - pagerHelpHeight = strings.Count(pagerHelpView(pagerModel{}, 0), "\n") + pagerHelpHeight int // strings.Count(pagerHelpView(pagerModel{}, 0), "\n") noteHeading = te.String(noteHeadingText). Foreground(common.Cream.Color()). @@ -55,7 +55,7 @@ var ( helpViewStyle = newStyle(statusBarNoteFg.String(), common.NewColorPair("#1B1B1B", "#f2f2f2").String()) ) -// Create a new termenv styling function. +// Returns a termenv style. func newStyle(fg, bg string) func(string) string { return te.Style{}. Foreground(te.ColorProfile().Color(fg)). @@ -63,20 +63,12 @@ func newStyle(fg, bg string) func(string) string { Styled } -// MSG - type contentRenderedMsg string type noteSavedMsg *charm.Markdown type stashSuccessMsg markdown -type stashErrMsg struct { - err error -} +type stashErrMsg struct{ err error } -func (s stashErrMsg) Error() string { - return s.err.Error() -} - -// MODEL +func (s stashErrMsg) Error() string { return s.err.Error() } type pagerState int @@ -154,6 +146,9 @@ func (m *pagerModel) setSize(w, h int) { m.textInput.Width = w - len(noteHeadingText) - len(notePromptText) - 1 if m.showHelp { + if pagerHelpHeight == 0 { + pagerHelpHeight = strings.Count(m.helpView(), "\n") + } m.viewport.Height -= (statusBarHeight + pagerHelpHeight) } } @@ -198,9 +193,7 @@ func (m *pagerModel) unload() { m.textInput.Reset() } -// UPDATE - -func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { +func (m pagerModel) Update(msg tea.Msg) (pagerModel, tea.Cmd) { var ( cmd tea.Cmd cmds []tea.Cmd @@ -349,29 +342,26 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { return m, tea.Batch(cmds...) } -// VIEW - -func pagerView(m pagerModel) string { +func (m pagerModel) View() string { var b strings.Builder - fmt.Fprint(&b, viewport.View(m.viewport)+"\n") // Footer switch m.state { case pagerStateSetNote: - pagerSetNoteView(&b, m) + m.setNoteView(&b) default: - pagerStatusBarView(&b, m) + m.statusBarView(&b) } if m.showHelp { - fmt.Fprint(&b, pagerHelpView(m, m.width)) + fmt.Fprint(&b, m.helpView()) } return b.String() } -func pagerStatusBarView(b *strings.Builder, m pagerModel) { +func (m pagerModel) statusBarView(b *strings.Builder) { const ( minPercent float64 = 0.0 maxPercent float64 = 1.0 @@ -463,12 +453,12 @@ func pagerStatusBarView(b *strings.Builder, m pagerModel) { ) } -func pagerSetNoteView(b *strings.Builder, m pagerModel) { +func (m pagerModel) setNoteView(b *strings.Builder) { fmt.Fprint(b, noteHeading) fmt.Fprint(b, textinput.View(m.textInput)) } -func pagerHelpView(m pagerModel, width int) (s string) { +func (m pagerModel) helpView() (s string) { memoOrStash := "m set memo" if m.authStatus == authOK && m.currentDocument.markdownType != stashedMarkdown { memoOrStash = "s stash this document" @@ -494,11 +484,11 @@ func pagerHelpView(m pagerModel, width int) (s string) { s = indent(s, 2) // Fill up empty cells with spaces for background coloring - if width > 0 { + if m.width > 0 { lines := strings.Split(s, "\n") for i := 0; i < len(lines); i++ { l := runewidth.StringWidth(lines[i]) - n := max(width-l, 0) + n := max(m.width-l, 0) lines[i] += strings.Repeat(" ", n) } diff --git a/ui/ui.go b/ui/ui.go index e7b9e49..8255f32 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -253,7 +253,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // If setting a note send all keys straight through case pagerStateSetNote: var batch []tea.Cmd - newPagerModel, cmd := pagerUpdate(msg, m.pager) + newPagerModel, cmd := m.pager.Update(msg) m.pager = newPagerModel batch = append(batch, cmd) return m, tea.Batch(batch...) @@ -400,7 +400,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { cmds = append(cmds, cmd) case stateShowDocument: - newPagerModel, cmd := pagerUpdate(msg, m.pager) + newPagerModel, cmd := m.pager.Update(msg) m.pager = newPagerModel cmds = append(cmds, cmd) } @@ -422,7 +422,7 @@ func view(mdl tea.Model) string { switch m.state { case stateShowDocument: - return pagerView(m.pager) + return m.pager.View() default: return stashView(m.stash) } From e73190a2177b85bddb0c128c7aaf0f09a52443fb Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 17 Oct 2020 17:39:43 -0400 Subject: [PATCH 518/911] Move "stashed only" flag from the package-level into the model --- main.go | 4 +--- ui/stash.go | 18 ++++++++++-------- ui/ui.go | 11 ++++------- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/main.go b/main.go index 59888d8..2c26497 100644 --- a/main.go +++ b/main.go @@ -262,9 +262,7 @@ func runTUI(stashedOnly bool) error { } cfg.ShowAllFiles = showAllFiles - if stashedOnly { - cfg.StashedOnly = true - } + cfg.StashedOnly = stashedOnly // Run Bubble Tea program p := ui.NewProgram(style, cfg) diff --git a/ui/stash.go b/ui/stash.go index b95b921..5f81012 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -72,6 +72,7 @@ const ( type stashModel struct { cc *charm.Client + cfg *Config authStatus authStatus state stashState err error @@ -198,7 +199,7 @@ func (m *stashModel) hideStatusMessage() { // INIT -func newStashModel(as authStatus) stashModel { +func newStashModel(cfg *Config, as authStatus) stashModel { sp := spinner.NewModel() sp.Frames = spinner.Line sp.ForegroundColor = common.SpinnerColor.String() @@ -217,6 +218,7 @@ func newStashModel(as authStatus) stashModel { ni.Focus() m := stashModel{ + cfg: cfg, authStatus: as, spinner: sp, noteInput: ni, @@ -278,7 +280,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } case spinner.TickMsg: - condition := !m.loaded.done(stashedOnly) || + condition := !m.loaded.done(m.cfg.StashedOnly) || m.loadingFromNetwork || m.state == stashStateLoadingDocument || len(m.filesStashing) > 0 || @@ -424,7 +426,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.filesStashing[md.localPath] = struct{}{} cmds = append(cmds, stashDocument(m.cc, *md)) - if m.loaded.done(stashedOnly) && !m.spinner.Visible() { + if m.loaded.done(m.cfg.StashedOnly) && !m.spinner.Visible() { m.spinner.Start() cmds = append(cmds, spinner.Tick(m.spinner)) } @@ -568,7 +570,7 @@ func stashView(m stashModel) string { case stashStateReady, stashStateSettingNote, stashStatePromptDelete: loadingIndicator := "" - if !m.loaded.done(stashedOnly) || m.loadingFromNetwork || m.spinner.Visible() { + if !m.loaded.done(m.cfg.StashedOnly) || m.loadingFromNetwork || m.spinner.Visible() { loadingIndicator = spinner.View(m.spinner) } @@ -637,10 +639,10 @@ func glowLogoView(text string) string { } func stashHeaderView(m stashModel) string { - loading := !m.loaded.done(stashedOnly) + loading := !m.loaded.done(m.cfg.StashedOnly) noMarkdowns := len(m.markdowns) == 0 - if m.authStatus == authFailed && stashedOnly { + if m.authStatus == authFailed && m.cfg.StashedOnly { return common.Subtle("Can’t load stash. Are you offline?") } @@ -651,7 +653,7 @@ func stashHeaderView(m stashModel) string { // Still loading. We haven't found files, stashed items, or news yet. if loading && noMarkdowns { - if stashedOnly { + if m.cfg.StashedOnly { return common.Subtle("Loading your stash...") } else { return common.Subtle("Looking for stuff...") + maybeOffline @@ -663,7 +665,7 @@ func stashHeaderView(m stashModel) string { // Loading's finished and all we have is news. if !loading && localItems == 0 && stashedItems == 0 { - if stashedOnly { + if m.cfg.StashedOnly { return common.Subtle("No stashed markdown files found.") + maybeOffline } else { return common.Subtle("No local or stashed markdown files found.") + maybeOffline diff --git a/ui/ui.go b/ui/ui.go index 8255f32..92edba1 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -28,7 +28,6 @@ var ( config Config glowLogoTextColor = common.Color("#ECFD65") debug = false // true if we're logging to a file, in which case we'll log more stuff - stashedOnly = false ) // Config contains TUI-specific configuration. @@ -135,7 +134,7 @@ const ( ) type model struct { - cfg Config + cfg *Config cc *charm.Client authStatus authStatus keygenState keygenState @@ -164,7 +163,7 @@ func (m *model) unloadDocument() []tea.Cmd { if m.pager.viewport.HighPerformanceRendering { batch = append(batch, tea.ClearScrollArea) } - if !m.stash.loaded.done(stashedOnly) || m.stash.loadingFromNetwork { + if !m.stash.loaded.done(m.cfg.StashedOnly) || m.stash.loadingFromNetwork { batch = append(batch, spinner.Tick(m.stash.spinner)) } return batch @@ -189,16 +188,14 @@ func initialize(cfg Config, style string) func() (tea.Model, tea.Cmd) { } } - stashedOnly = cfg.StashedOnly - m := model{ - cfg: cfg, + cfg: &cfg, state: stateShowStash, authStatus: authConnecting, keygenState: keygenUnstarted, } m.pager = newPagerModel(m.authStatus, style) - m.stash = newStashModel(m.authStatus) + m.stash = newStashModel(&cfg, m.authStatus) cmds := []tea.Cmd{ newCharmClient, From fcf109aaff277fe8e26e9afb29609498c1a9cc64 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 17 Oct 2020 21:46:02 -0400 Subject: [PATCH 519/911] Add flag for local files only (aka disable network) in TUI --- main.go | 9 ++++++++- ui/stash.go | 30 +++++++++++++++++++++++------- ui/ui.go | 31 +++++++++++++++++++++---------- 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/main.go b/main.go index 2c26497..7f43103 100644 --- a/main.go +++ b/main.go @@ -31,6 +31,7 @@ var ( style string width uint showAllFiles bool + localOnly bool rootCmd = &cobra.Command{ Use: "glow SOURCE", @@ -262,7 +263,12 @@ func runTUI(stashedOnly bool) error { } cfg.ShowAllFiles = showAllFiles - cfg.StashedOnly = stashedOnly + + if stashedOnly { + cfg.DocumentTypes = ui.StashedDocument | ui.NewsDocument + } else if localOnly { + cfg.DocumentTypes = ui.LocalDocument + } // Run Bubble Tea program p := ui.NewProgram(style, cfg) @@ -299,6 +305,7 @@ func init() { rootCmd.Flags().StringVarP(&style, "style", "s", "auto", "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") rootCmd.Flags().BoolVarP(&showAllFiles, "all", "a", false, "show system files and directories (TUI-mode only)") + rootCmd.Flags().BoolVarP(&localOnly, "local", "l", false, "show local files only; no network (TUI-mode only)") // Stash stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") diff --git a/ui/stash.go b/ui/stash.go index 5f81012..a4520a0 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -44,6 +44,14 @@ type deletedStashedItemMsg int // MODEL +type DocumentType byte + +const ( + LocalDocument DocumentType = 1 << iota + StashedDocument + NewsDocument +) + type loadedState byte const ( @@ -109,6 +117,14 @@ type stashModel struct { statusMessageTimer *time.Timer } +func (m stashModel) localOnly() bool { + return m.cfg.DocumentTypes == LocalDocument +} + +func (m stashModel) stashedOnly() bool { + return m.cfg.DocumentTypes&LocalDocument == 0 +} + func (m *stashModel) setSize(width, height int) { m.terminalWidth = width m.terminalHeight = height @@ -280,7 +296,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } case spinner.TickMsg: - condition := !m.loaded.done(m.cfg.StashedOnly) || + condition := !m.loaded.done(m.stashedOnly()) || m.loadingFromNetwork || m.state == stashStateLoadingDocument || len(m.filesStashing) > 0 || @@ -426,7 +442,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.filesStashing[md.localPath] = struct{}{} cmds = append(cmds, stashDocument(m.cc, *md)) - if m.loaded.done(m.cfg.StashedOnly) && !m.spinner.Visible() { + if m.loaded.done(m.stashedOnly()) && !m.spinner.Visible() { m.spinner.Start() cmds = append(cmds, spinner.Tick(m.spinner)) } @@ -570,7 +586,7 @@ func stashView(m stashModel) string { case stashStateReady, stashStateSettingNote, stashStatePromptDelete: loadingIndicator := "" - if !m.loaded.done(m.cfg.StashedOnly) || m.loadingFromNetwork || m.spinner.Visible() { + if !m.localOnly() && (!m.loaded.done(m.stashedOnly()) || m.loadingFromNetwork || m.spinner.Visible()) { loadingIndicator = spinner.View(m.spinner) } @@ -639,10 +655,10 @@ func glowLogoView(text string) string { } func stashHeaderView(m stashModel) string { - loading := !m.loaded.done(m.cfg.StashedOnly) + loading := !m.loaded.done(m.stashedOnly()) noMarkdowns := len(m.markdowns) == 0 - if m.authStatus == authFailed && m.cfg.StashedOnly { + if m.authStatus == authFailed && m.stashedOnly() { return common.Subtle("Can’t load stash. Are you offline?") } @@ -653,7 +669,7 @@ func stashHeaderView(m stashModel) string { // Still loading. We haven't found files, stashed items, or news yet. if loading && noMarkdowns { - if m.cfg.StashedOnly { + if m.stashedOnly() { return common.Subtle("Loading your stash...") } else { return common.Subtle("Looking for stuff...") + maybeOffline @@ -665,7 +681,7 @@ func stashHeaderView(m stashModel) string { // Loading's finished and all we have is news. if !loading && localItems == 0 && stashedItems == 0 { - if m.cfg.StashedOnly { + if m.stashedOnly() { return common.Subtle("No stashed markdown files found.") + maybeOffline } else { return common.Subtle("No local or stashed markdown files found.") + maybeOffline diff --git a/ui/ui.go b/ui/ui.go index 92edba1..75cd87d 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -35,7 +35,9 @@ type Config struct { ShowAllFiles bool Gopath string `env:"GOPATH"` HomeDir string `env:"HOME"` - StashedOnly bool + + // Which document types shall we show? We work though this with bitmasking. + DocumentTypes DocumentType // For debugging the UI Logfile string `env:"GLOW_LOGFILE"` @@ -163,7 +165,10 @@ func (m *model) unloadDocument() []tea.Cmd { if m.pager.viewport.HighPerformanceRendering { batch = append(batch, tea.ClearScrollArea) } - if !m.stash.loaded.done(m.cfg.StashedOnly) || m.stash.loadingFromNetwork { + + stashedOnly := m.cfg.DocumentTypes&LocalDocument == 0 + + if !m.stash.loaded.done(stashedOnly) || m.stash.loadingFromNetwork { batch = append(batch, spinner.Tick(m.stash.spinner)) } return batch @@ -197,11 +202,20 @@ func initialize(cfg Config, style string) func() (tea.Model, tea.Cmd) { m.pager = newPagerModel(m.authStatus, style) m.stash = newStashModel(&cfg, m.authStatus) - cmds := []tea.Cmd{ - newCharmClient, - spinner.Tick(m.stash.spinner), + if cfg.DocumentTypes == 0 { + cfg.DocumentTypes = LocalDocument | StashedDocument | NewsDocument } - if !cfg.StashedOnly { + + var cmds []tea.Cmd + + if cfg.DocumentTypes&StashedDocument != 0 || cfg.DocumentTypes&NewsDocument != 0 { + cmds = append(cmds, + newCharmClient, + spinner.Tick(m.stash.spinner), + ) + } + + if cfg.DocumentTypes&LocalDocument != 0 { cmds = append(cmds, findLocalFiles(m)) } @@ -297,21 +311,18 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { // TODO: load more stash pages if we've resized, are on the last page, // and haven't loaded more pages yet. - // We've started looking for local files case initLocalFileSearchMsg: m.localFileFinder = msg.ch m.cwd = msg.cwd cmds = append(cmds, findNextLocalFile(m)) - // We found a local file case foundLocalFileMsg: newMd := localFileToMarkdown(m.cwd, gitcha.SearchResult(msg)) m.stash.addMarkdowns(newMd) cmds = append(cmds, findNextLocalFile(m)) case sshAuthErrMsg: - // If we haven't run the keygen yet, do that - if m.keygenState != keygenFinished { + if m.keygenState != keygenFinished { // if we haven't run the keygen yet, do that m.keygenState = keygenRunning cmds = append(cmds, generateSSHKeys) } else { From 54a73944489d9c0485a29dffe8f142e624605e6a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 17 Oct 2020 23:01:20 -0400 Subject: [PATCH 520/911] Simplify loading completion check --- ui/stash.go | 26 ++++++++++++++------------ ui/ui.go | 4 +--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index a4520a0..e484e2b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -60,14 +60,6 @@ const ( loadedLocalFiles ) -func (s loadedState) done(stashedOnly bool) bool { - state := s&loadedStash != 0 && s&loadedNews != 0 - if stashedOnly { - return state - } - return state && s&loadedLocalFiles != 0 -} - type stashState int const ( @@ -125,6 +117,16 @@ func (m stashModel) stashedOnly() bool { return m.cfg.DocumentTypes&LocalDocument == 0 } +func (m stashModel) loadingDone() bool { + state := m.loaded&loadedStash != 0 && m.loaded&loadedNews != 0 + if m.stashedOnly() { + return state + } else if m.localOnly() { + return m.loaded&loadedLocalFiles != 0 + } + return state && m.loaded&loadedLocalFiles != 0 +} + func (m *stashModel) setSize(width, height int) { m.terminalWidth = width m.terminalHeight = height @@ -296,7 +298,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } case spinner.TickMsg: - condition := !m.loaded.done(m.stashedOnly()) || + condition := !m.loadingDone() || m.loadingFromNetwork || m.state == stashStateLoadingDocument || len(m.filesStashing) > 0 || @@ -442,7 +444,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.filesStashing[md.localPath] = struct{}{} cmds = append(cmds, stashDocument(m.cc, *md)) - if m.loaded.done(m.stashedOnly()) && !m.spinner.Visible() { + if m.loadingDone() && !m.spinner.Visible() { m.spinner.Start() cmds = append(cmds, spinner.Tick(m.spinner)) } @@ -586,7 +588,7 @@ func stashView(m stashModel) string { case stashStateReady, stashStateSettingNote, stashStatePromptDelete: loadingIndicator := "" - if !m.localOnly() && (!m.loaded.done(m.stashedOnly()) || m.loadingFromNetwork || m.spinner.Visible()) { + if !m.localOnly() && (!m.loadingDone() || m.loadingFromNetwork || m.spinner.Visible()) { loadingIndicator = spinner.View(m.spinner) } @@ -655,7 +657,7 @@ func glowLogoView(text string) string { } func stashHeaderView(m stashModel) string { - loading := !m.loaded.done(m.stashedOnly()) + loading := !m.loadingDone() noMarkdowns := len(m.markdowns) == 0 if m.authStatus == authFailed && m.stashedOnly() { diff --git a/ui/ui.go b/ui/ui.go index 75cd87d..ee49b8b 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -166,9 +166,7 @@ func (m *model) unloadDocument() []tea.Cmd { batch = append(batch, tea.ClearScrollArea) } - stashedOnly := m.cfg.DocumentTypes&LocalDocument == 0 - - if !m.stash.loaded.done(stashedOnly) || m.stash.loadingFromNetwork { + if !m.stash.loadingDone() || m.stash.loadingFromNetwork { batch = append(batch, spinner.Tick(m.stash.spinner)) } return batch From 32f0be2688aca0706b59f5a69b8f3e3bc3c0eff9 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 17 Oct 2020 23:13:49 -0400 Subject: [PATCH 521/911] Use the same type to track docs to load and docs loaded --- main.go | 4 ++-- ui/stash.go | 43 +++++++++++++++---------------------------- ui/ui.go | 10 +++++----- 3 files changed, 22 insertions(+), 35 deletions(-) diff --git a/main.go b/main.go index 7f43103..ab6db4c 100644 --- a/main.go +++ b/main.go @@ -265,9 +265,9 @@ func runTUI(stashedOnly bool) error { cfg.ShowAllFiles = showAllFiles if stashedOnly { - cfg.DocumentTypes = ui.StashedDocument | ui.NewsDocument + cfg.DocumentTypes = ui.StashedDocuments | ui.NewsDocuments } else if localOnly { - cfg.DocumentTypes = ui.LocalDocument + cfg.DocumentTypes = ui.LocalDocuments } // Run Bubble Tea program diff --git a/ui/stash.go b/ui/stash.go index e484e2b..0648afb 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -47,17 +47,9 @@ type deletedStashedItemMsg int type DocumentType byte const ( - LocalDocument DocumentType = 1 << iota - StashedDocument - NewsDocument -) - -type loadedState byte - -const ( - loadedStash loadedState = 1 << iota - loadedNews - loadedLocalFiles + LocalDocuments DocumentType = 1 << iota + StashedDocuments + NewsDocuments ) type stashState int @@ -81,9 +73,9 @@ type stashModel struct { noteInput textinput.Model terminalWidth int terminalHeight int - stashFullyLoaded bool // have we loaded everything from the server? - loadingFromNetwork bool // are we currently loading something from the network? - loaded loadedState // tracks news, stash and local files loading; we find out with bitmasking + stashFullyLoaded bool // have we loaded all available stashed documents from the server? + loadingFromNetwork bool // are we currently loading something from the network? + loaded DocumentType // load status for news, stash and local files loading; we find out exactly with bitmasking // Paths to files being stashed. We treat this like a set, ignoring the // value portion with an empty struct. @@ -110,21 +102,16 @@ type stashModel struct { } func (m stashModel) localOnly() bool { - return m.cfg.DocumentTypes == LocalDocument + return m.cfg.DocumentTypes == LocalDocuments } func (m stashModel) stashedOnly() bool { - return m.cfg.DocumentTypes&LocalDocument == 0 + return m.cfg.DocumentTypes&LocalDocuments == 0 } func (m stashModel) loadingDone() bool { - state := m.loaded&loadedStash != 0 && m.loaded&loadedNews != 0 - if m.stashedOnly() { - return state - } else if m.localOnly() { - return m.loaded&loadedLocalFiles != 0 - } - return state && m.loaded&loadedLocalFiles != 0 + // Do the types loaded match the types we want to have? + return m.loaded == m.cfg.DocumentTypes } func (m *stashModel) setSize(width, height int) { @@ -260,24 +247,24 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case stashLoadErrMsg: m.err = msg.err - m.loaded |= loadedStash // still done, albeit unsuccessfully + m.loaded |= StashedDocuments // still done, albeit unsuccessfully m.stashFullyLoaded = true m.loadingFromNetwork = false case newsLoadErrMsg: m.err = msg.err - m.loaded |= loadedNews // still done, albeit unsuccessfully + m.loaded |= NewsDocuments // still done, albeit unsuccessfully // We're finished searching for local files case localFileSearchFinished: - m.loaded |= loadedLocalFiles + m.loaded |= LocalDocuments // Stash results have come in from the server case gotStashMsg: // This doesn't mean the whole stash listing is loaded, but some we've // finished checking for the stash, at least, so mark the stash as // loaded here. - m.loaded |= loadedStash + m.loaded |= StashedDocuments m.loadingFromNetwork = false @@ -291,7 +278,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // News has come in from the server case gotNewsMsg: - m.loaded |= loadedNews + m.loaded |= NewsDocuments if len(msg) > 0 { docs := wrapMarkdowns(newsMarkdown, msg) m.addMarkdowns(docs...) diff --git a/ui/ui.go b/ui/ui.go index ee49b8b..faba7d2 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -201,19 +201,19 @@ func initialize(cfg Config, style string) func() (tea.Model, tea.Cmd) { m.stash = newStashModel(&cfg, m.authStatus) if cfg.DocumentTypes == 0 { - cfg.DocumentTypes = LocalDocument | StashedDocument | NewsDocument + cfg.DocumentTypes = LocalDocuments | StashedDocuments | NewsDocuments } var cmds []tea.Cmd - if cfg.DocumentTypes&StashedDocument != 0 || cfg.DocumentTypes&NewsDocument != 0 { + if cfg.DocumentTypes&StashedDocuments != 0 || cfg.DocumentTypes&NewsDocuments != 0 { cmds = append(cmds, newCharmClient, spinner.Tick(m.stash.spinner), ) } - if cfg.DocumentTypes&LocalDocument != 0 { + if cfg.DocumentTypes&LocalDocuments != 0 { cmds = append(cmds, findLocalFiles(m)) } @@ -332,7 +332,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { } // Even though it failed, news/stash loading is finished - m.stash.loaded |= loadedStash | loadedNews + m.stash.loaded |= StashedDocuments | NewsDocuments m.stash.loadingFromNetwork = false } @@ -347,7 +347,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { m.keygenState = keygenFinished // Even though it failed, news/stash loading is finished - m.stash.loaded |= loadedStash | loadedNews + m.stash.loaded |= StashedDocuments | NewsDocuments m.stash.loadingFromNetwork = false case keygenSuccessMsg: From 0949a6656b82921bce1969132c9ce278762437bd Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sun, 18 Oct 2020 20:29:45 -0400 Subject: [PATCH 522/911] Update to bubbletea 0.12.0; minimum required changes --- go.mod | 8 ++--- go.sum | 15 +++++---- ui/ui.go | 93 ++++++++++++++++++++++---------------------------------- 3 files changed, 49 insertions(+), 67 deletions(-) diff --git a/go.mod b/go.mod index f35dddd..c54831c 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,8 @@ go 1.13 require ( github.com/alecthomas/chroma v0.8.0 // indirect - github.com/charmbracelet/bubbles v0.6.1 - github.com/charmbracelet/bubbletea v0.11.1 + github.com/charmbracelet/bubbles v0.7.0 + github.com/charmbracelet/bubbletea v0.12.0 github.com/charmbracelet/charm v0.8.2 github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac @@ -17,7 +17,7 @@ require ( github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d github.com/muesli/termenv v0.7.4 github.com/spf13/cobra v1.0.0 - golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee + golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect - golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb + golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13 ) diff --git a/go.sum b/go.sum index 6409c4f..060170d 100644 --- a/go.sum +++ b/go.sum @@ -25,12 +25,12 @@ github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.6.0 h1:i884UciNkSDSOQKgYrMFCLcVN8r0tX5K4pthOwBkZ7Q= github.com/charmbracelet/bubbles v0.6.0/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= -github.com/charmbracelet/bubbles v0.6.1 h1:SnyRY9vJMXW1sjECGUVdbec4O6V425ImAkIdwX3HkK8= -github.com/charmbracelet/bubbles v0.6.1/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= +github.com/charmbracelet/bubbles v0.7.0 h1:jOmI1Q0rtjSqzHytDvULlz3z0iuzBtc+4kN+Riqezmg= +github.com/charmbracelet/bubbles v0.7.0/go.mod h1:J/CGU2bBL7CPljsjqef5azk793t5jWgBtdlhCEiXgJs= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= github.com/charmbracelet/bubbletea v0.10.5/go.mod h1:Nay5oWkkSZvc6E/be+W3nDFXAsVytNUNKV9jbXcuae0= -github.com/charmbracelet/bubbletea v0.11.1 h1:A+1+YqYN0j/ghKfGZ27LJo+Vg80fGDP+MTudHO56t2o= -github.com/charmbracelet/bubbletea v0.11.1/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= +github.com/charmbracelet/bubbletea v0.12.0 h1:/pUHp1GWRDyK1TJAWkXrnRH1u8Xc5076oH/J0NHxH+M= +github.com/charmbracelet/bubbletea v0.12.0/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= github.com/charmbracelet/charm v0.8.2 h1:sYJhP7YopJUvjWE8VKlNrcAHAaRZsEgKn8z2FoIhHOI= github.com/charmbracelet/charm v0.8.2/go.mod h1:xi3evUxj8hw+dMApaXRczb2SiEzrn8a3NYobj0off+c= github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 h1:XgXVfMdJTNTq/ajMvwiB1OW3Tg/TXHtM3tYr/vYF76w= @@ -199,6 +199,8 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee h1:4yd7jl+vXjalO5ztz6Vc1VADv+S/80LGJmyl1ROJ2AI= golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -230,8 +232,9 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb h1:HS9IzC4UFbpMBLQUDSQcU+ViVT1vdFCQVjdPVpTlZrs= -golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13 h1:5jaG59Zhd+8ZXe8C+lgiAGqkOaZBruqrWclLkgAww34= +golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/ui/ui.go b/ui/ui.go index faba7d2..384aa69 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -55,11 +55,9 @@ func NewProgram(style string, cfg Config) *tea.Program { debug = true } config = cfg - return tea.NewProgram(initialize(cfg, style), update, view) + return tea.NewProgram(newModel(cfg, style)) } -// MESSAGES - type errMsg struct{ err error } type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} @@ -86,8 +84,6 @@ func (s stashLoadErrMsg) Unwrap() error { return s.err } func (s newsLoadErrMsg) Error() string { return s.err.Error() } func (s newsLoadErrMsg) Unwrap() error { return s.err } -// MODEL - // Which part of the application something appies to. Occasionally used as an // argument to commands and messages. type applicationContext int @@ -178,59 +174,49 @@ func (m *model) setAuthStatus(as authStatus) { m.pager.authStatus = as } -// INIT - -func initialize(cfg Config, style string) func() (tea.Model, tea.Cmd) { - return func() (tea.Model, tea.Cmd) { - if style == "auto" { - dbg := te.HasDarkBackground() - if dbg { - style = "dark" - } else { - style = "light" - } +func newModel(cfg Config, style string) tea.Model { + if style == "auto" { + dbg := te.HasDarkBackground() + if dbg { + style = "dark" + } else { + style = "light" } + } - m := model{ - cfg: &cfg, - state: stateShowStash, - authStatus: authConnecting, - keygenState: keygenUnstarted, - } - m.pager = newPagerModel(m.authStatus, style) - m.stash = newStashModel(&cfg, m.authStatus) + if cfg.DocumentTypes == 0 { + cfg.DocumentTypes = LocalDocuments | StashedDocuments | NewsDocuments + } - if cfg.DocumentTypes == 0 { - cfg.DocumentTypes = LocalDocuments | StashedDocuments | NewsDocuments - } - - var cmds []tea.Cmd - - if cfg.DocumentTypes&StashedDocuments != 0 || cfg.DocumentTypes&NewsDocuments != 0 { - cmds = append(cmds, - newCharmClient, - spinner.Tick(m.stash.spinner), - ) - } - - if cfg.DocumentTypes&LocalDocuments != 0 { - cmds = append(cmds, findLocalFiles(m)) - } - - return m, tea.Batch(cmds...) + as := authConnecting + return model{ + cfg: &cfg, + state: stateShowStash, + authStatus: as, + keygenState: keygenUnstarted, + pager: newPagerModel(as, style), + stash: newStashModel(&cfg, as), } } -// UPDATE +func (m model) Init() tea.Cmd { + var cmds []tea.Cmd -func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { - m, ok := mdl.(model) - if !ok { - return model{ - fatalErr: errors.New("could not perform assertion on model in update"), - }, tea.Quit + if m.cfg.DocumentTypes&StashedDocuments != 0 || m.cfg.DocumentTypes&NewsDocuments != 0 { + cmds = append(cmds, + newCharmClient, + spinner.Tick(m.stash.spinner), + ) } + if m.cfg.DocumentTypes&LocalDocuments != 0 { + cmds = append(cmds, findLocalFiles(m)) + } + + return tea.Batch(cmds...) +} + +func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // If there's been an error, any key exits if m.fatalErr != nil { if _, ok := msg.(tea.KeyMsg); ok { @@ -414,14 +400,7 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { return m, tea.Batch(cmds...) } -// VIEW - -func view(mdl tea.Model) string { - m, ok := mdl.(model) - if !ok { - return "could not perform assertion on model in view" - } - +func (m model) View() string { if m.fatalErr != nil { return errorView(m.fatalErr, true) } From 3b06ccbc34ad8d9ba511ce94d53e93c6395d8e00 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sun, 18 Oct 2020 23:11:47 -0400 Subject: [PATCH 523/911] Fix bug where pager help isn't updated after an in-pager stash --- ui/pager.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index f868778..db1a5bd 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -32,7 +32,7 @@ const ( ) var ( - pagerHelpHeight int // strings.Count(pagerHelpView(pagerModel{}, 0), "\n") + pagerHelpHeight int noteHeading = te.String(noteHeadingText). Foreground(common.Cream.Color()). @@ -460,7 +460,8 @@ func (m pagerModel) setNoteView(b *strings.Builder) { func (m pagerModel) helpView() (s string) { memoOrStash := "m set memo" - if m.authStatus == authOK && m.currentDocument.markdownType != stashedMarkdown { + log.Println(m.currentDocument.markdownType) + if m.authStatus == authOK && m.currentDocument.markdownType == localMarkdown { memoOrStash = "s stash this document" } From 186d07da55b715fc4ea7f8ed95ac5968f99b8406 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 19 Oct 2020 11:26:52 -0400 Subject: [PATCH 524/911] Don't show stash/memo info in pager help for news --- ui/pager.go | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index db1a5bd..89d65b1 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -460,12 +460,11 @@ func (m pagerModel) setNoteView(b *strings.Builder) { func (m pagerModel) helpView() (s string) { memoOrStash := "m set memo" - log.Println(m.currentDocument.markdownType) if m.authStatus == authOK && m.currentDocument.markdownType == localMarkdown { memoOrStash = "s stash this document" } - col1 := [...]string{ + col1 := []string{ "g/home go to top", "G/end go to bottom", "", @@ -474,13 +473,21 @@ func (m pagerModel) helpView() (s string) { "q quit", } + if m.currentDocument.markdownType == newsMarkdown { + deleteFromStringSlice(col1, 3) + } + s += "\n" s += "k/↑ up " + col1[0] + "\n" s += "j/↓ down " + col1[1] + "\n" s += "b/pgup page up " + col1[2] + "\n" s += "f/pgdn page down " + col1[3] + "\n" s += "u ½ page up " + col1[4] + "\n" - s += "d ½ page down " + col1[5] + s += "d ½ page down " + + if len(col1) > 5 { + s += col1[5] + } s = indent(s, 2) @@ -557,3 +564,12 @@ func glamourRender(m pagerModel, markdown string) (string, error) { return content, nil } + +// ETC + +// Note: this runs in linear time; O(n). +func deleteFromStringSlice(a []string, i int) []string { + copy(a[i:], a[i+1:]) + a[len(a)-1] = "" + return a[:len(a)-1] +} From 4baff6cc45a3ef09b2ac9eeb73fbcd19079b108c Mon Sep 17 00:00:00 2001 From: AristoChen Date: Tue, 20 Oct 2020 20:01:05 +0800 Subject: [PATCH 525/911] Fix typo in README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9f49db4..a80d56e 100644 --- a/README.md +++ b/README.md @@ -69,12 +69,12 @@ go build ## The TUI Simply run `glow` without arguments to start the textual user interface and -browse local and stashed markdown. Glow will find local markdown files it the +browse local and stashed markdown. Glow will find local markdown files in the current directory and below or, if you’re in a Git repository, Glow will search the repo. Markdown files can be read with Glow's high-performance pager. Most of the -keystokes you know from `less` are the same, but you can press `?` to list +keystrokes you know from `less` are the same, but you can press `?` to list the hotkeys. ### Stashing From 53aeb75c9250ab5639baade5b1c6087a06f2c527 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 20 Oct 2020 10:16:30 -0400 Subject: [PATCH 526/911] Update footer in README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a80d56e..733befb 100644 --- a/README.md +++ b/README.md @@ -184,6 +184,7 @@ machine and not our server, so we never see any unencrypted data. Part of [Charm](https://charm.sh). -the Charm logo +the Charm logo Charm热爱开源! / Charm loves open source! + From cde8999cf6eb47c4aa08bc6d3010118fdd5ff113 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 22 Oct 2020 15:59:22 -0400 Subject: [PATCH 527/911] Bump Bubble Tea and Bubbles deps for keybinding improvements --- go.mod | 6 +++--- go.sum | 13 ++++++------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index c54831c..88866ce 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,8 @@ go 1.13 require ( github.com/alecthomas/chroma v0.8.0 // indirect - github.com/charmbracelet/bubbles v0.7.0 - github.com/charmbracelet/bubbletea v0.12.0 + github.com/charmbracelet/bubbles v0.7.1 + github.com/charmbracelet/bubbletea v0.12.1 github.com/charmbracelet/charm v0.8.2 github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac @@ -19,5 +19,5 @@ require ( github.com/spf13/cobra v1.0.0 golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect - golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13 + golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a ) diff --git a/go.sum b/go.sum index 060170d..a9f83cd 100644 --- a/go.sum +++ b/go.sum @@ -25,12 +25,12 @@ github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.6.0 h1:i884UciNkSDSOQKgYrMFCLcVN8r0tX5K4pthOwBkZ7Q= github.com/charmbracelet/bubbles v0.6.0/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= -github.com/charmbracelet/bubbles v0.7.0 h1:jOmI1Q0rtjSqzHytDvULlz3z0iuzBtc+4kN+Riqezmg= -github.com/charmbracelet/bubbles v0.7.0/go.mod h1:J/CGU2bBL7CPljsjqef5azk793t5jWgBtdlhCEiXgJs= +github.com/charmbracelet/bubbles v0.7.1 h1:qvXoIh7ItTA+IA+IO2xxuI9ntp+uVprDAK+IoMzC5OI= +github.com/charmbracelet/bubbles v0.7.1/go.mod h1:UV3dot0XR45cnQX2d8gtohfUFMepquRG2WE56LPKWNc= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= github.com/charmbracelet/bubbletea v0.10.5/go.mod h1:Nay5oWkkSZvc6E/be+W3nDFXAsVytNUNKV9jbXcuae0= -github.com/charmbracelet/bubbletea v0.12.0 h1:/pUHp1GWRDyK1TJAWkXrnRH1u8Xc5076oH/J0NHxH+M= -github.com/charmbracelet/bubbletea v0.12.0/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= +github.com/charmbracelet/bubbletea v0.12.1 h1:t21pkG2IDBRduPbt2J64Dx5yt8yIidAkXwhhrc11SzY= +github.com/charmbracelet/bubbletea v0.12.1/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= github.com/charmbracelet/charm v0.8.2 h1:sYJhP7YopJUvjWE8VKlNrcAHAaRZsEgKn8z2FoIhHOI= github.com/charmbracelet/charm v0.8.2/go.mod h1:xi3evUxj8hw+dMApaXRczb2SiEzrn8a3NYobj0off+c= github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 h1:XgXVfMdJTNTq/ajMvwiB1OW3Tg/TXHtM3tYr/vYF76w= @@ -232,9 +232,8 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13 h1:5jaG59Zhd+8ZXe8C+lgiAGqkOaZBruqrWclLkgAww34= -golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a h1:e3IU37lwO4aq3uoRKINC7JikojFmE5gO7xhfxs8VC34= +golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From f586716b771712446f35a9fe2ebefd21a1930b44 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 23 Oct 2020 13:04:22 +0200 Subject: [PATCH 528/911] Split up workflows and automatically pick latest Go version --- .github/workflows/build.yml | 13 ++----------- .github/workflows/coverage.yml | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/coverage.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 93cdb9d..b0c9f68 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,14 +4,14 @@ jobs: test: strategy: matrix: - go-version: [1.13.x, 1.14.x, 1.15.x] + go-version: [~1.13, ^1] os: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.os }} env: GO111MODULE: "on" steps: - name: Install Go - uses: actions/setup-go@v1 + uses: actions/setup-go@v2 with: go-version: ${{ matrix.go-version }} @@ -26,12 +26,3 @@ jobs: - name: Test run: go test ./... - - - name: Coverage - env: - COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - go test -race -covermode atomic -coverprofile=profile.cov ./... - GO111MODULE=off go get github.com/mattn/goveralls - $(go env GOPATH)/bin/goveralls -coverprofile=profile.cov -service=github - if: matrix.go-version == '1.15.x' && matrix.os == 'ubuntu-latest' diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 0000000..01c10d2 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,28 @@ +name: coverage +on: [push, pull_request] + +jobs: + coverage: + strategy: + matrix: + go-version: [^1] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + env: + GO111MODULE: "on" + steps: + - name: Install Go + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go-version }} + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Coverage + env: + COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + go test -race -covermode atomic -coverprofile=profile.cov ./... + GO111MODULE=off go get github.com/mattn/goveralls + $(go env GOPATH)/bin/goveralls -coverprofile=profile.cov -service=github From d5446bfddd78b5d447ed9dbf29937b8959d41639 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 23 Oct 2020 06:24:03 +0200 Subject: [PATCH 529/911] Add config file support The combination of Viper & go-app-paths lets us detect a config file 'glow.yml' in various default config paths (XDG-compliant), across all platforms. Currently there are only two configuration values: local: true style: "/some/style.json" Additionally, this introduces mapping environment variables to config values: GLOW_LOCAL="true" GLOW_STYLE="/some/style.json" The values will be used in this order: CLI-arg > ENV-var > config file > default --- go.mod | 6 +- go.sum | 187 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- main.go | 48 ++++++++++++++- 3 files changed, 236 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 88866ce..0960022 100644 --- a/go.mod +++ b/go.mod @@ -14,9 +14,11 @@ require ( github.com/meowgorithm/babyenv v1.3.0 github.com/microcosm-cc/bluemonday v1.0.4 // indirect github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6 - github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d + github.com/muesli/go-app-paths v0.2.1 + github.com/muesli/reflow v0.2.0 github.com/muesli/termenv v0.7.4 - github.com/spf13/cobra v1.0.0 + github.com/spf13/cobra v1.1.1 + github.com/spf13/viper v1.7.0 golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a diff --git a/go.sum b/go.sum index a9f83cd..1697f57 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,19 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= @@ -13,13 +27,18 @@ github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkx github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY= github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -42,7 +61,9 @@ github.com/containerd/console v1.0.1 h1:u7SFAJyRqWcG6ogaMAx3KjSTy1e3hT9QxqX7Jco7 github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -58,8 +79,11 @@ github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac h1:opbrjaN/L8gg6Xh5D04Tem+8xVcz6ajZlGCs49mQgyg= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -69,24 +93,62 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -100,7 +162,11 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -113,18 +179,28 @@ github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DO github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg= github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a h1:eU8j/ClY2Ty3qdHnn0TyW3ivFoPC/0F1gQZz8yTxbbE= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6 h1:CUOAyrZoFRlGHfl6vljna20J++p8sPRlw9KF7fySgpA= github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= -github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d h1:ok5jhmKQze1yERN73u46EZhUH4vgC1z4qfeFJ8iOwvg= -github.com/muesli/reflow v0.1.1-0.20200715144030-a312cb5b2d8d/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= +github.com/muesli/reflow v0.2.0 h1:2o0UBJPHHH4fa2GCXU4Rg4DwOtWPMekCeyc5EWbAQp0= +github.com/muesli/reflow v0.2.0/go.mod h1:qT22vjVmM9MIUeLgsVYe/Ye7eZlbv9dZjL3dVhUqLX8= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= @@ -136,6 +212,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -146,6 +224,7 @@ github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -156,30 +235,46 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= @@ -187,11 +282,16 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1: github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -201,26 +301,62 @@ golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee h1:4yd7jl+vXjalO5ztz6Vc1V golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc h1:zK/HqS5bZxDptfPJNq8v7vJfXtkU7r9TLIoSr1bXaP4= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -235,22 +371,69 @@ golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a h1:e3IU37lwO4aq3uoRKINC7JikojFmE5gO7xhfxs8VC34= golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/main.go b/main.go index ab6db4c..20138e3 100644 --- a/main.go +++ b/main.go @@ -13,7 +13,9 @@ import ( "strings" "github.com/meowgorithm/babyenv" + gap "github.com/muesli/go-app-paths" "github.com/spf13/cobra" + "github.com/spf13/viper" "golang.org/x/crypto/ssh/terminal" tea "github.com/charmbracelet/bubbletea" @@ -27,6 +29,7 @@ var ( CommitSHA = "" readmeNames = []string{"README.md", "README"} + configFile string pager bool style string width uint @@ -151,6 +154,10 @@ func validateOptions(cmd *cobra.Command) { if width > 120 { width = 120 } + + // grab config values from Viper + style = viper.GetString("style") + localOnly = viper.GetBool("local") } func execute(cmd *cobra.Command, args []string) error { @@ -169,7 +176,6 @@ func execute(cmd *cobra.Command, args []string) error { } func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { - // Only run TUI if there are no arguments (excluding flags) if arg == "" { return runTUI(false) @@ -301,13 +307,53 @@ func init() { rootCmd.Version = Version // "Glow Classic" cli arguments + rootCmd.PersistentFlags().StringVar(&configFile, "config", "", "config file") rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") rootCmd.Flags().StringVarP(&style, "style", "s", "auto", "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") rootCmd.Flags().BoolVarP(&showAllFiles, "all", "a", false, "show system files and directories (TUI-mode only)") rootCmd.Flags().BoolVarP(&localOnly, "local", "l", false, "show local files only; no network (TUI-mode only)") + // Config bindings + _ = viper.BindPFlag("style", rootCmd.Flags().Lookup("style")) + _ = viper.BindPFlag("local", rootCmd.Flags().Lookup("local")) + viper.SetDefault("style", "auto") + viper.SetDefault("local", "false") + // Stash stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") rootCmd.AddCommand(stashCmd) + + cobra.OnInitialize(initConfig) +} + +func initConfig() { + if configFile != "" { + viper.SetConfigFile(configFile) + } else { + scope := gap.NewScope(gap.User, "glow") + dirs, err := scope.ConfigDirs() + if err != nil { + fmt.Println("Can't retrieve default config. Please manually pass a config file with '--config'") + os.Exit(1) + } + + for _, v := range dirs { + viper.AddConfigPath(v) + } + viper.SetConfigName("glow") + viper.SetConfigType("yaml") + } + + viper.SetEnvPrefix("glow") + viper.AutomaticEnv() + + if err := viper.ReadInConfig(); err != nil { + if _, ok := err.(viper.ConfigFileNotFoundError); !ok { + fmt.Println("Error parsing config:", err) + os.Exit(1) + } + } + + // fmt.Println("Using config file:", viper.ConfigFileUsed()) } From 61a2533d41fba021658584c15ec173c92b813d5e Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 23 Oct 2020 06:36:21 +0200 Subject: [PATCH 530/911] Display default value for config flag in --help --- main.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 20138e3..4626337 100644 --- a/main.go +++ b/main.go @@ -306,8 +306,11 @@ func init() { } rootCmd.Version = Version + scope := gap.NewScope(gap.User, "glow") + defaultConfigFile, _ := scope.ConfigPath("glow.yml") + // "Glow Classic" cli arguments - rootCmd.PersistentFlags().StringVar(&configFile, "config", "", "config file") + rootCmd.PersistentFlags().StringVar(&configFile, "config", "", fmt.Sprintf("config file (default %s)", defaultConfigFile)) rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") rootCmd.Flags().StringVarP(&style, "style", "s", "auto", "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") From c45b2fc4b009369e02e0d8af1c97d2569830a8ba Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 23 Oct 2020 08:34:32 +0200 Subject: [PATCH 531/911] Add paragraph about the config file to README --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index 733befb..269b003 100644 --- a/README.md +++ b/README.md @@ -165,6 +165,23 @@ glow --help Check out the [Glamour Style Section](https://github.com/charmbracelet/glamour/blob/master/styles/gallery/README.md) to find more styles. Or [make your own](https://github.com/charmbracelet/glamour/tree/master/styles)! +## The Config File + +If you find yourself supplying the same flags to `glow` all the time, it's +probably a good idea to create a config file. Put a file named `glow.yml` in +the default config path of you platform. If you're not sure where that is refer +to `glow --help`, which will display the path in which `glow` expects its +config. + +Here's an example config: + +```yaml +# style name or JSON path (default "auto") +style: "light" +# show local files only; no network (TUI-mode only) +local: true +``` + ## 🔒 Encryption: How It Works Encryption works by issuing symmetric keys (basically a generated password) and From 2091f03235f9b8976c71feea22c9e75ca3697c21 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 23 Oct 2020 08:46:59 +0200 Subject: [PATCH 532/911] Support width as a config setting --- README.md | 2 ++ main.go | 20 ++++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 269b003..2c17e69 100644 --- a/README.md +++ b/README.md @@ -180,6 +180,8 @@ Here's an example config: style: "light" # show local files only; no network (TUI-mode only) local: true +# word-wrap at width +width: 80 ``` ## 🔒 Encryption: How It Works diff --git a/main.go b/main.go index 4626337..fc6dd8d 100644 --- a/main.go +++ b/main.go @@ -134,6 +134,11 @@ func sourceFromArg(arg string) (*source, error) { } func validateOptions(cmd *cobra.Command) { + // grab config values from Viper + style = viper.GetString("style") + width = viper.GetUint("width") + localOnly = viper.GetBool("local") + isTerminal := terminal.IsTerminal(int(os.Stdout.Fd())) // We want to use a special no-TTY style, when stdout is not a terminal // and there was no specific style passed by arg @@ -142,22 +147,19 @@ func validateOptions(cmd *cobra.Command) { } // Detect terminal width - if isTerminal && !cmd.Flags().Changed("width") { + if isTerminal && width == 0 && !cmd.Flags().Changed("width") { w, _, err := terminal.GetSize(int(os.Stdout.Fd())) if err == nil { width = uint(w) } + + if width > 120 { + width = 120 + } } if width == 0 { width = 80 } - if width > 120 { - width = 120 - } - - // grab config values from Viper - style = viper.GetString("style") - localOnly = viper.GetBool("local") } func execute(cmd *cobra.Command, args []string) error { @@ -319,8 +321,10 @@ func init() { // Config bindings _ = viper.BindPFlag("style", rootCmd.Flags().Lookup("style")) + _ = viper.BindPFlag("width", rootCmd.Flags().Lookup("width")) _ = viper.BindPFlag("local", rootCmd.Flags().Lookup("local")) viper.SetDefault("style", "auto") + viper.SetDefault("width", 0) viper.SetDefault("local", "false") // Stash From 7ea7cc59e393b6d1d1606ad33d33ae6ddfef1080 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 23 Oct 2020 23:30:09 -0400 Subject: [PATCH 533/911] Respect width flag/config setting in the TUI; closes #168 --- main.go | 4 +++- ui/pager.go | 57 ++++++++++++++++++++++++++--------------------------- ui/ui.go | 22 +++++++++++---------- 3 files changed, 43 insertions(+), 40 deletions(-) diff --git a/main.go b/main.go index fc6dd8d..5c286df 100644 --- a/main.go +++ b/main.go @@ -271,6 +271,8 @@ func runTUI(stashedOnly bool) error { } cfg.ShowAllFiles = showAllFiles + cfg.GlamourMaxWidth = width + cfg.GlamourStyle = style if stashedOnly { cfg.DocumentTypes = ui.StashedDocuments | ui.NewsDocuments @@ -279,7 +281,7 @@ func runTUI(stashedOnly bool) error { } // Run Bubble Tea program - p := ui.NewProgram(style, cfg) + p := ui.NewProgram(cfg) p.EnterAltScreen() if err := p.Start(); err != nil { return err diff --git a/ui/pager.go b/ui/pager.go index 89d65b1..d050989 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -20,15 +20,14 @@ import ( ) const ( - maxDocumentWidth = 120 - statusBarHeight = 1 - gray = "#333333" - yellowGreen = "#ECFD65" - fuschia = "#EE6FF8" - mintGreen = "#89F0CB" - darkGreen = "#1C8760" - noteHeadingText = " Set Memo " - notePromptText = " > " + statusBarHeight = 1 + gray = "#333333" + yellowGreen = "#ECFD65" + fuschia = "#EE6FF8" + mintGreen = "#89F0CB" + darkGreen = "#1C8760" + noteHeadingText = " Set Memo " + notePromptText = " > " ) var ( @@ -81,16 +80,16 @@ const ( ) type pagerModel struct { - cc *charm.Client - authStatus authStatus - viewport viewport.Model - state pagerState - glamourStyle string - width int - height int - showHelp bool - textInput textinput.Model - spinner spinner.Model + cfg *Config + cc *charm.Client + authStatus authStatus + viewport viewport.Model + state pagerState + width int + height int + showHelp bool + textInput textinput.Model + spinner spinner.Model statusMessage string statusMessageTimer *time.Timer @@ -104,7 +103,7 @@ type pagerModel struct { stashedDocument *markdown } -func newPagerModel(as authStatus, glamourStyle string) pagerModel { +func newPagerModel(cfg *Config, as authStatus) pagerModel { // Init viewport vp := viewport.Model{} vp.YPosition = 0 @@ -129,12 +128,12 @@ func newPagerModel(as authStatus, glamourStyle string) pagerModel { sp.MinimumLifetime = time.Millisecond * 180 return pagerModel{ - state: pagerStateBrowse, - authStatus: as, - glamourStyle: glamourStyle, - textInput: ti, - viewport: vp, - spinner: sp, + cfg: cfg, + state: pagerStateBrowse, + authStatus: as, + textInput: ti, + viewport: vp, + spinner: sp, } } @@ -529,13 +528,13 @@ func glamourRender(m pagerModel, markdown string) (string, error) { // initialize glamour var gs glamour.TermRendererOption - if m.glamourStyle == "auto" { + if m.cfg.GlamourStyle == "auto" { gs = glamour.WithAutoStyle() } else { - gs = glamour.WithStylePath(m.glamourStyle) + gs = glamour.WithStylePath(m.cfg.GlamourStyle) } - width := max(0, min(maxDocumentWidth, m.viewport.Width)) + width := max(0, min(int(m.cfg.GlamourMaxWidth), m.viewport.Width)) r, err := glamour.NewTermRenderer( gs, glamour.WithWordWrap(width), diff --git a/ui/ui.go b/ui/ui.go index 384aa69..0e82980 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -32,9 +32,11 @@ var ( // Config contains TUI-specific configuration. type Config struct { - ShowAllFiles bool - Gopath string `env:"GOPATH"` - HomeDir string `env:"HOME"` + ShowAllFiles bool + Gopath string `env:"GOPATH"` + HomeDir string `env:"HOME"` + GlamourMaxWidth uint + GlamourStyle string // Which document types shall we show? We work though this with bitmasking. DocumentTypes DocumentType @@ -46,7 +48,7 @@ type Config struct { } // NewProgram returns a new Tea program. -func NewProgram(style string, cfg Config) *tea.Program { +func NewProgram(cfg Config) *tea.Program { if cfg.Logfile != "" { log.Println("-- Starting Glow ----------------") log.Printf("High performance pager: %v", cfg.HighPerformancePager) @@ -55,7 +57,7 @@ func NewProgram(style string, cfg Config) *tea.Program { debug = true } config = cfg - return tea.NewProgram(newModel(cfg, style)) + return tea.NewProgram(newModel(cfg)) } type errMsg struct{ err error } @@ -174,13 +176,13 @@ func (m *model) setAuthStatus(as authStatus) { m.pager.authStatus = as } -func newModel(cfg Config, style string) tea.Model { - if style == "auto" { +func newModel(cfg Config) tea.Model { + if cfg.GlamourStyle == "auto" { dbg := te.HasDarkBackground() if dbg { - style = "dark" + cfg.GlamourStyle = "dark" } else { - style = "light" + cfg.GlamourStyle = "light" } } @@ -194,7 +196,7 @@ func newModel(cfg Config, style string) tea.Model { state: stateShowStash, authStatus: as, keygenState: keygenUnstarted, - pager: newPagerModel(as, style), + pager: newPagerModel(&cfg, as), stash: newStashModel(&cfg, as), } } From 7a700d251161b73b1eb1768628f4cad7aa48d67a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 26 Oct 2020 12:21:23 -0400 Subject: [PATCH 534/911] Stub out config sub-command --- config_cmd.go | 25 +++++++++++++++++++++++++ main.go | 2 ++ 2 files changed, 27 insertions(+) create mode 100644 config_cmd.go diff --git a/config_cmd.go b/config_cmd.go new file mode 100644 index 0000000..917a773 --- /dev/null +++ b/config_cmd.go @@ -0,0 +1,25 @@ +package main + +import ( + "errors" + "fmt" + "os" + + "github.com/charmbracelet/charm/ui/common" + "github.com/spf13/cobra" +) + +var configCmd = &cobra.Command{ + Use: "config", + Hidden: false, + Short: "Edit the glow config file", + Long: formatBlock(fmt.Sprintf("\n%s the glow config file. We’ll use EDITOR to determine which editor to use. If the config file doesn't exist, it will be created.", common.Keyword("Edit"))), + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + if os.Getenv("EDITORS") == "" { + return errors.New("no EDITOR environment variable set") + } + + return nil + }, +} diff --git a/main.go b/main.go index 5c286df..e799ca3 100644 --- a/main.go +++ b/main.go @@ -333,6 +333,8 @@ func init() { stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") rootCmd.AddCommand(stashCmd) + rootCmd.AddCommand(configCmd) + cobra.OnInitialize(initConfig) } From 4b4fb783d207fe59f6fb644b0792b126ccffa923 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Mon, 26 Oct 2020 20:21:38 +0100 Subject: [PATCH 535/911] Open the configuration file with $EDITOR via 'glow config' --- config_cmd.go | 67 ++++++++++++++++++++++++++++++++++++++++++++++----- main.go | 3 +-- stash_cmd.go | 1 + 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/config_cmd.go b/config_cmd.go index 917a773..800524f 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -4,22 +4,77 @@ import ( "errors" "fmt" "os" + "os/exec" + "path" "github.com/charmbracelet/charm/ui/common" + gap "github.com/muesli/go-app-paths" "github.com/spf13/cobra" ) +const defaultConfig = `# style name or JSON path (default "auto") +style: "light" +# show local files only; no network (TUI-mode only) +local: true +# word-wrap at width +width: 80` + var configCmd = &cobra.Command{ - Use: "config", - Hidden: false, - Short: "Edit the glow config file", - Long: formatBlock(fmt.Sprintf("\n%s the glow config file. We’ll use EDITOR to determine which editor to use. If the config file doesn't exist, it will be created.", common.Keyword("Edit"))), - Args: cobra.NoArgs, + Use: "config", + Hidden: false, + Short: "Edit the glow config file", + Long: formatBlock(fmt.Sprintf("\n%s the glow config file. We’ll use EDITOR to determine which editor to use. If the config file doesn't exist, it will be created.", common.Keyword("Edit"))), + Example: formatBlock("glow config\nglow config --config path/to/config.yml"), + Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { - if os.Getenv("EDITORS") == "" { + if configFile == "" { + scope := gap.NewScope(gap.User, "glow") + + var err error + configFile, err = scope.ConfigPath("glow.yml") + if err != nil { + return err + } + } + + if ext := path.Ext(configFile); ext != ".yaml" && ext != ".yml" { + return fmt.Errorf("'%s' is not a supported config type: use '%s' or '%s'\n", ext, ".yaml", ".yml") + } + + if _, err := os.Stat(configFile); os.IsNotExist(err) { + // File doesn't exist yet, create all necessary directories and + // write the default config file + if err := os.MkdirAll(path.Dir(configFile), 0700); err != nil { + return err + } + + f, err := os.Create(configFile) + if err != nil { + return err + } + defer f.Close() + + if _, err := f.WriteString(defaultConfig); err != nil { + return err + } + } else if err != nil { // some other error occurred + return err + } + + editor := os.Getenv("EDITOR") + if editor == "" { return errors.New("no EDITOR environment variable set") } + c := exec.Command(editor, configFile) + c.Stdin = os.Stdin + c.Stdout = os.Stdout + c.Stderr = os.Stderr + if err := c.Run(); err != nil { + return err + } + + fmt.Println("Wrote config file to:", configFile) return nil }, } diff --git a/main.go b/main.go index e799ca3..4999ea8 100644 --- a/main.go +++ b/main.go @@ -163,6 +163,7 @@ func validateOptions(cmd *cobra.Command) { } func execute(cmd *cobra.Command, args []string) error { + initConfig() validateOptions(cmd) if len(args) == 0 { @@ -334,8 +335,6 @@ func init() { rootCmd.AddCommand(stashCmd) rootCmd.AddCommand(configCmd) - - cobra.OnInitialize(initConfig) } func initConfig() { diff --git a/stash_cmd.go b/stash_cmd.go index d897a49..e1d69a7 100644 --- a/stash_cmd.go +++ b/stash_cmd.go @@ -25,6 +25,7 @@ var ( Example: formatBlock("glow stash\nglow stash README.md\nglow stash -m \"secret notes\" path/to/notes.md"), Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { + initConfig() if len(args) == 0 { return runTUI(true) } From 858beaf143fbeb36e8b489994a3fed78141a54e1 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Mon, 26 Oct 2020 21:02:09 +0100 Subject: [PATCH 536/911] Check for $EDITOR before writing the file --- config_cmd.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config_cmd.go b/config_cmd.go index 800524f..122d982 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -27,6 +27,11 @@ var configCmd = &cobra.Command{ Example: formatBlock("glow config\nglow config --config path/to/config.yml"), Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { + editor := os.Getenv("EDITOR") + if editor == "" { + return errors.New("no EDITOR environment variable set") + } + if configFile == "" { scope := gap.NewScope(gap.User, "glow") @@ -61,11 +66,6 @@ var configCmd = &cobra.Command{ return err } - editor := os.Getenv("EDITOR") - if editor == "" { - return errors.New("no EDITOR environment variable set") - } - c := exec.Command(editor, configFile) c.Stdin = os.Stdin c.Stdout = os.Stdout From c5adc8fc2db5563b6dd6dbd7a2a68352c433d31a Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Mon, 26 Oct 2020 21:02:54 +0100 Subject: [PATCH 537/911] Saner default values in the defaultConfig --- config_cmd.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config_cmd.go b/config_cmd.go index 122d982..8d73b1f 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -13,9 +13,9 @@ import ( ) const defaultConfig = `# style name or JSON path (default "auto") -style: "light" +style: "auto" # show local files only; no network (TUI-mode only) -local: true +local: false # word-wrap at width width: 80` From 7a9452dbfff44f3b94148eb526f0efa4267f3f79 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 27 Oct 2020 15:02:53 +0100 Subject: [PATCH 538/911] Point out the 'glow config' command in README --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2c17e69..589e662 100644 --- a/README.md +++ b/README.md @@ -168,10 +168,10 @@ to find more styles. Or [make your own](https://github.com/charmbracelet/glamour ## The Config File If you find yourself supplying the same flags to `glow` all the time, it's -probably a good idea to create a config file. Put a file named `glow.yml` in -the default config path of you platform. If you're not sure where that is refer -to `glow --help`, which will display the path in which `glow` expects its -config. +probably a good idea to create a config file. Run `glow config`, which will open +it in your favorite $EDITOR. Alternatively you can manually put a file named +`glow.yml` in the default config path of you platform. If you're not sure where +that is, please refer to `glow --help`. Here's an example config: From d4239a55db2e00c6a4a8a6ec35e07096b19542cb Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 27 Oct 2020 15:12:50 +0100 Subject: [PATCH 539/911] Error codes should be in the range of 0 to 125 --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 4999ea8..9e6b402 100644 --- a/main.go +++ b/main.go @@ -297,7 +297,7 @@ func runTUI(stashedOnly bool) error { func main() { if err := rootCmd.Execute(); err != nil { - os.Exit(-1) + os.Exit(1) } } From 9ce4ec9149a18047db98b69b32801482a23ef873 Mon Sep 17 00:00:00 2001 From: batkiz Date: Tue, 20 Oct 2020 08:42:39 +0800 Subject: [PATCH 540/911] Now in Scoop! check https://github.com/ScoopInstaller/Main/pull/1510 --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 589e662..55a350d 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,9 @@ nix-env -iA nixpkgs.glow # FreeBSD pkg install glow + +# Windows (with Scoop) +scoop install glow ``` Or download a binary from the [releases][releases] page. MacOS, Linux, Windows, From 998cbf1cc44f68895f00aa98082dd8c8930ddd81 Mon Sep 17 00:00:00 2001 From: Cristian Dominguez Date: Fri, 30 Oct 2020 12:14:36 -0300 Subject: [PATCH 541/911] Ignore YAML frontmatter --- main.go | 3 +++ ui/ui.go | 2 ++ utils/utils.go | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+) create mode 100644 utils/utils.go diff --git a/main.go b/main.go index 9e6b402..f540cfc 100644 --- a/main.go +++ b/main.go @@ -22,6 +22,7 @@ import ( "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glamour" "github.com/charmbracelet/glow/ui" + "github.com/charmbracelet/glow/utils" ) var ( @@ -195,6 +196,8 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { return err } + b = utils.RemoveFrontmatter(b) + // render var baseURL string u, err := url.ParseRequestURI(src.URL) diff --git a/ui/ui.go b/ui/ui.go index 0e82980..8fd04a0 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -15,6 +15,7 @@ import ( "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/keygen" "github.com/charmbracelet/charm/ui/common" + "github.com/charmbracelet/glow/utils" "github.com/muesli/gitcha" te "github.com/muesli/termenv" ) @@ -355,6 +356,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case fetchedMarkdownMsg: m.pager.currentDocument = *msg + msg.Body = string(utils.RemoveFrontmatter([]byte(msg.Body))) cmds = append(cmds, renderWithGlamour(m.pager, msg.Body)) case contentRenderedMsg: diff --git a/utils/utils.go b/utils/utils.go new file mode 100644 index 0000000..e03298c --- /dev/null +++ b/utils/utils.go @@ -0,0 +1,19 @@ +package utils + +import "regexp" + +func RemoveFrontmatter(content []byte) []byte { + if frontmatterBoundaries := detectFrontmatter(content); frontmatterBoundaries[0] == 0 { + return content[frontmatterBoundaries[1]:] + } + return content +} + +var yamlPattern = regexp.MustCompile(`(?m)^---\r?\n(\s*\r?\n)?`) + +func detectFrontmatter(c []byte) []int { + if matches := yamlPattern.FindAllIndex(c, 2); len(matches) > 1 { + return []int{matches[0][0], matches[1][1]} + } + return []int{-1, -1} +} From 23fb61f7526c2cd3290a77a74dae7d02822fc3d6 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Sat, 24 Oct 2020 22:18:19 +0200 Subject: [PATCH 542/911] Add stash states for searching through notes - stashStateSearchNotes will be used while entering the search term - stashStateShowFiltered will only display the filtered notes in the stash view. --- ui/stash.go | 32 ++++++++++++++++++++++++++++---- ui/ui.go | 2 +- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 0648afb..5e07755 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -60,6 +60,8 @@ const ( stashStateLoadingDocument stashStateSettingNote stashStateShowingError + stashStateSearchNotes + stashStateShowFiltered ) type stashModel struct { @@ -329,7 +331,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } switch m.state { - case stashStateReady: + case stashStateReady, stashStateShowFiltered: switch msg := msg.(type) { // Handle keys case tea.KeyMsg: @@ -388,6 +390,15 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { cmds = append(cmds, spinner.Tick(m.spinner)) + // Search through your notes + case "/": + m.hideStatusMessage() + + if pages == 0 { + break + } + + m.state = stashStateSearchNotes // Set note case "m": m.hideStatusMessage() @@ -526,6 +537,14 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } } + case stashStateSearchNotes: + if msg, ok := msg.(tea.KeyMsg); ok { + switch msg.String() { + case "esc": + // Cancel search + m.state = stashStateReady + } + } case stashStateSettingNote: if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { @@ -559,7 +578,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // If an item is being confirmed for delete, any key (other than the key // used for confirmation above) cancels the deletion - return m, tea.Batch(cmds...) } @@ -572,7 +590,7 @@ func stashView(m stashModel) string { return errorView(m.err, false) case stashStateLoadingDocument: s += " " + spinner.View(m.spinner) + " Loading document..." - case stashStateReady, stashStateSettingNote, stashStatePromptDelete: + case stashStateReady, stashStateSettingNote, stashStatePromptDelete, stashStateSearchNotes, stashStateShowFiltered: loadingIndicator := "" if !m.localOnly() && (!m.loadingDone() || m.loadingFromNetwork || m.spinner.Visible()) { @@ -742,10 +760,15 @@ func stashHelpView(m stashModel) string { h = append(h, "enter: confirm", "esc: cancel") } else if m.state == stashStatePromptDelete { h = append(h, "y: delete", "n: cancel") + } else if m.state == stashStateSearchNotes { + h = append(h, "enter: confirm", "esc: cancel", "ctrl+j/ctrl+k, ↑/↓: choose") } else { if len(m.markdowns) > 0 { h = append(h, "enter: open") } + if m.state == stashStateShowFiltered { + h = append(h, "esc: clear search") + } if len(m.markdowns) > 1 { h = append(h, "j/k, ↑/↓: choose") } @@ -753,13 +776,14 @@ func stashHelpView(m stashModel) string { h = append(h, "h/l, ←/→: page") } if isStashed { - h = append(h, []string{"x: delete", "m: set memo"}...) + h = append(h, "x: delete", "m: set memo") } else if isLocal && m.authStatus == authOK { h = append(h, "s: stash") } if m.err != nil { h = append(h, "!: errors") } + h = append(h, "/: search") h = append(h, "q: quit") } return stashHelpViewBuilder(m.terminalWidth, h...) diff --git a/ui/ui.go b/ui/ui.go index 8fd04a0..cefc9f9 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -240,7 +240,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case stateShowStash: switch m.stash.state { - case stashStateSettingNote, stashStatePromptDelete, stashStateShowingError: + case stashStateSettingNote, stashStatePromptDelete, stashStateShowingError, stashStateSearchNotes, stashStateShowFiltered: m.stash, cmd = stashUpdate(msg, m.stash) return m, cmd } From 9fd3dfef5a4d655be94067a9bda157edfad9e8b3 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Sat, 24 Oct 2020 22:37:18 +0200 Subject: [PATCH 543/911] Add a searchinput box to the stashModel --- ui/stash.go | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 5e07755..bce1ea5 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -29,6 +29,7 @@ const ( stashViewBottomPadding = 4 stashViewHorizontalPadding = 6 setNotePromptText = "Memo: " + searchNotePromptText = "Search: " ) var ( @@ -73,6 +74,7 @@ type stashModel struct { markdowns []*markdown spinner spinner.Model noteInput textinput.Model + searchInput textinput.Model terminalWidth int terminalHeight int stashFullyLoaded bool // have we loaded all available stashed documents from the server? @@ -126,6 +128,7 @@ func (m *stashModel) setSize(width, height int) { m.paginator.SetTotalPages(len(m.markdowns)) m.noteInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - len(setNotePromptText) + m.searchInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - len(searchNotePromptText) // Make sure the page stays in bounds if m.paginator.Page >= m.paginator.TotalPages-1 { @@ -224,11 +227,18 @@ func newStashModel(cfg *Config, as authStatus) stashModel { ni.CharLimit = noteCharacterLimit ni.Focus() + si := textinput.NewModel() + si.Prompt = te.String(searchNotePromptText).Foreground(common.YellowGreen.Color()).String() + si.CursorColor = common.Fuschia.String() + si.CharLimit = noteCharacterLimit + si.Focus() + m := stashModel{ cfg: cfg, authStatus: as, spinner: sp, noteInput: ni, + searchInput: si, page: 1, paginator: p, loadingFromNetwork: true, @@ -399,6 +409,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } m.state = stashStateSearchNotes + m.searchInput.CursorEnd() + m.searchInput.Focus() + return m, textinput.Blink(m.searchInput) + // Set note case "m": m.hideStatusMessage() @@ -534,6 +548,9 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { default: m.state = stashStateReady + if m.searchInput.Value() != "" { + m.state = stashStateShowFiltered + } } } @@ -543,14 +560,37 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case "esc": // Cancel search m.state = stashStateReady + m.searchInput.Reset() + case "enter", "tab": + m.hideStatusMessage() + + if len(m.markdowns) == 0 { + break + } + + m.searchInput.Blur() + + m.state = stashStateShowFiltered + if m.searchInput.Value() == "" { + m.searchInput.Reset() + m.state = stashStateReady + } } } + + // Update the text input component + newSearchInputModel, cmd := textinput.Update(msg, m.searchInput) + m.searchInput = newSearchInputModel + cmds = append(cmds, cmd) case stashStateSettingNote: if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { case "esc": // Cancel note m.state = stashStateReady + if m.searchInput.Value() != "" { + m.state = stashStateShowFiltered + } m.noteInput.Reset() case "enter": // Set new note @@ -560,6 +600,9 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { md.Note = newNote m.noteInput.Reset() m.state = stashStateReady + if m.searchInput.Value() != "" { + m.state = stashStateShowFiltered + } return m, cmd } } @@ -592,7 +635,7 @@ func stashView(m stashModel) string { s += " " + spinner.View(m.spinner) + " Loading document..." case stashStateReady, stashStateSettingNote, stashStatePromptDelete, stashStateSearchNotes, stashStateShowFiltered: - loadingIndicator := "" + loadingIndicator := " " if !m.localOnly() && (!m.loadingDone() || m.loadingFromNetwork || m.spinner.Visible()) { loadingIndicator = spinner.View(m.spinner) } @@ -623,6 +666,12 @@ func stashView(m stashModel) string { header = stashHeaderView(m) } + logoOrSearch := glowLogoView(" Glow ") + // we replace the logo with the search field in + if m.state == stashStateSearchNotes || m.state == stashStateShowFiltered { + logoOrSearch = textinput.View(m.searchInput) + } + var pagination string if m.paginator.TotalPages > 1 { pagination = paginator.View(m.paginator) @@ -640,9 +689,9 @@ func stashView(m stashModel) string { } s += fmt.Sprintf( - " %s %s\n\n %s\n\n%s\n\n%s %s\n\n %s", - glowLogoView(" Glow "), + "%s %s\n\n %s\n\n%s\n\n%s %s\n\n %s", loadingIndicator, + logoOrSearch, header, stashPopulatedView(m), blankLines, From e985f96dc4563ca3bc337638252e61e902ce2005 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Sat, 24 Oct 2020 22:45:05 +0200 Subject: [PATCH 544/911] Add fuzzy filtering for stash notes --- go.mod | 1 + go.sum | 10 ++------- ui/stash.go | 65 ++++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 55 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 0960022..7746b36 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/google/uuid v1.1.2 // indirect + github.com/lithammer/fuzzysearch v1.1.1 github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.3.0 github.com/microcosm-cc/bluemonday v1.0.4 // indirect diff --git a/go.sum b/go.sum index 1697f57..932681c 100644 --- a/go.sum +++ b/go.sum @@ -42,7 +42,6 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/bubbles v0.6.0 h1:i884UciNkSDSOQKgYrMFCLcVN8r0tX5K4pthOwBkZ7Q= github.com/charmbracelet/bubbles v0.6.0/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= github.com/charmbracelet/bubbles v0.7.1 h1:qvXoIh7ItTA+IA+IO2xxuI9ntp+uVprDAK+IoMzC5OI= github.com/charmbracelet/bubbles v0.7.1/go.mod h1:UV3dot0XR45cnQX2d8gtohfUFMepquRG2WE56LPKWNc= @@ -159,6 +158,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lithammer/fuzzysearch v1.1.1 h1:8F9OAV2xPuYblToVohjanztdnPjbtA0MLgMvDKQ0Z08= +github.com/lithammer/fuzzysearch v1.1.1/go.mod h1:H2bng+w5gsR7NlfIJM8ElGZI0sX6C/9uzGqicVXGU6c= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -204,7 +205,6 @@ github.com/muesli/reflow v0.2.0/go.mod h1:qT22vjVmM9MIUeLgsVYe/Ye7eZlbv9dZjL3dVh github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= -github.com/muesli/termenv v0.7.2 h1:r1raklL3uKE7rOvWgSenmEm2px+dnc33OTisZ8YR1fw= github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= github.com/muesli/termenv v0.7.4 h1:/pBqvU5CpkY53tU0vVn+xgs2ZTX63aH5nY+SSps5Xa8= github.com/muesli/termenv v0.7.4/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= @@ -220,7 +220,6 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03/go.mod h1:Z9+Ul5bCbBKnbCvdOWbLqTHhJiYV414CURZJba6L8qA= -github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -255,7 +254,6 @@ github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= @@ -295,9 +293,7 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee h1:4yd7jl+vXjalO5ztz6Vc1VADv+S/80LGJmyl1ROJ2AI= golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -364,9 +360,7 @@ golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a h1:e3IU37lwO4aq3uoRKINC7JikojFmE5gO7xhfxs8VC34= golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/ui/stash.go b/ui/stash.go index bce1ea5..1a0c574 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -17,6 +17,7 @@ import ( "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/dustin/go-humanize" + "github.com/lithammer/fuzzysearch/fuzzy" runewidth "github.com/mattn/go-runewidth" "github.com/muesli/reflow/ansi" te "github.com/muesli/termenv" @@ -144,10 +145,13 @@ func (m stashModel) markdownIndex() int { // Return the current selected markdown in the stash. func (m stashModel) selectedMarkdown() *markdown { i := m.markdownIndex() - if i < 0 || len(m.markdowns) == 0 || len(m.markdowns) <= i { + markdowns := m.getNotes() + + if i < 0 || len(markdowns) == 0 || len(markdowns) <= i { return nil } - return m.markdowns[i] + + return markdowns[i] } // Adds markdown documents to the model. @@ -189,17 +193,49 @@ func (m *stashModel) removeLocalMarkdown(localPath string) error { // Return the number of markdown documents of a given type. func (m stashModel) countMarkdowns(t markdownType) (found int) { - if len(m.markdowns) == 0 { + if len(m.getNotes()) == 0 { return } - for i := 0; i < len(m.markdowns); i++ { - if m.markdowns[i].markdownType == t { + for i := 0; i < len(m.getNotes()); i++ { + if m.getNotes()[i].markdownType == t { found++ } } return } +// Returns the stashed markdown notes. When the model state indicates that +// filtering is desired this also filters and ranks the notes by the search term +// in the searchinput field. +func (m *stashModel) getNotes() []*markdown { + if m.searchInput.Value() == "" { + return m.markdowns + } + + if m.state != stashStateSearchNotes && + m.state != stashStateShowFiltered && + m.state != stashStatePromptDelete && + m.state != stashStateSettingNote { + return m.markdowns + } + + targets := []string{} + + for _, t := range m.markdowns { + targets = append(targets, t.Note) + } + + ranks := fuzzy.RankFindFold(m.searchInput.Value(), targets) + sort.Sort(ranks) + + filtered := []*markdown{} + for _, r := range ranks { + filtered = append(filtered, m.markdowns[r.OriginalIndex]) + } + + return filtered +} + func (m *stashModel) hideStatusMessage() { m.showStatusMessage = false if m.statusMessageTimer != nil { @@ -342,6 +378,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { switch m.state { case stashStateReady, stashStateShowFiltered: + pages := len(m.getNotes()) + switch msg := msg.(type) { // Handle keys case tea.KeyMsg: @@ -377,13 +415,13 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Go to the very end case "end", "G": m.paginator.Page = m.paginator.TotalPages - 1 - m.index = m.paginator.ItemsOnPage(len(m.markdowns)) - 1 + m.index = m.paginator.ItemsOnPage(pages) - 1 // Open document case "enter": m.hideStatusMessage() - if len(m.markdowns) == 0 { + if pages == 0 { break } @@ -502,7 +540,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } // Keep the index in bounds when paginating - itemsOnPage := m.paginator.ItemsOnPage(len(m.markdowns)) + itemsOnPage := m.paginator.ItemsOnPage(len(m.getNotes())) if m.index > itemsOnPage-1 { m.index = max(0, itemsOnPage-1) } @@ -763,9 +801,10 @@ func stashHeaderView(m stashModel) string { func stashPopulatedView(m stashModel) string { var b strings.Builder - if len(m.markdowns) > 0 { - start, end := m.paginator.GetSliceBounds(len(m.markdowns)) - docs := m.markdowns[start:end] + markdowns := m.getNotes() + if len(markdowns) > 0 { + start, end := m.paginator.GetSliceBounds(len(markdowns)) + docs := markdowns[start:end] for i, md := range docs { stashItemView(&b, m, i, md) @@ -778,10 +817,10 @@ func stashPopulatedView(m stashModel) string { // If there aren't enough items to fill up this page (always the last page) // then we need to add some newlines to fill up the space where stash items // would have been. - itemsOnPage := m.paginator.ItemsOnPage(len(m.markdowns)) + itemsOnPage := m.paginator.ItemsOnPage(len(markdowns)) if itemsOnPage < m.paginator.PerPage { n := (m.paginator.PerPage - itemsOnPage) * stashViewItemHeight - if len(m.markdowns) == 0 { + if len(markdowns) == 0 { n -= stashViewItemHeight - 1 } for i := 0; i < n; i++ { From 259f4b584b804180cd0ae6b207cfe68e182ecb4d Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Sat, 24 Oct 2020 22:47:40 +0200 Subject: [PATCH 545/911] Use setTotalPages() to set the number of items in the paginator This takes the filtered stash state in account --- ui/stash.go | 63 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 1a0c574..9ae885f 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -124,12 +124,19 @@ func (m *stashModel) setSize(width, height int) { m.terminalHeight = height // Update the paginator - perPage := max(1, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)/stashViewItemHeight) - m.paginator.PerPage = perPage - m.paginator.SetTotalPages(len(m.markdowns)) + m.setTotalPages() m.noteInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - len(setNotePromptText) m.searchInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - len(searchNotePromptText) +} + +// Sets the total paginator pages according to the amount of markdowns for the +// current state. +func (m *stashModel) setTotalPages() { + pages := len(m.getNotes()) + + m.paginator.PerPage = max(1, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)/stashViewItemHeight) + m.paginator.SetTotalPages(pages) // Make sure the page stays in bounds if m.paginator.Page >= m.paginator.TotalPages-1 { @@ -159,7 +166,7 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) { if len(mds) > 0 { m.markdowns = append(m.markdowns, mds...) sort.Sort(markdownsByLocalFirst(m.markdowns)) - m.paginator.SetTotalPages(len(m.markdowns)) + m.setTotalPages() } } @@ -417,6 +424,12 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.paginator.Page = m.paginator.TotalPages - 1 m.index = m.paginator.ItemsOnPage(pages) - 1 + // esc only passed trough in stashStateSearchNotes + case "esc": + m.state = stashStateReady + m.searchInput.SetValue("") // clear the searchinput + m.setTotalPages() + // Open document case "enter": m.hideStatusMessage() @@ -427,8 +440,13 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Load the document from the server. We'll handle the message // that comes back in the main update function. - m.state = stashStateLoadingDocument md := m.selectedMarkdown() + m.state = stashStateLoadingDocument + + // This is only relevant when "enter" was called from the + // filtered stash view + m.searchInput.SetValue("") + m.setTotalPages() if md.markdownType == localMarkdown { cmds = append(cmds, loadLocalMarkdown(md)) @@ -562,27 +580,32 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { break } - i := m.markdownIndex() - id := m.markdowns[i].ID + smd := m.selectedMarkdown() + for i, md := range m.markdowns { + if md != smd { + continue + } - if m.markdowns[i].markdownType == convertedMarkdown { - // If document was stashed during this session, convert it - // back to a local file. - m.markdowns[i].markdownType = localMarkdown - m.markdowns[i].Note = m.markdowns[i].displayPath - } else { + if md.markdownType == convertedMarkdown { + // If document was stashed during this session, convert it + // back to a local file. + md.markdownType = localMarkdown + md.Note = m.markdowns[i].displayPath + } // Delete optimistically and remove the stashed item // before we've received a success response. m.markdowns = append(m.markdowns[:i], m.markdowns[i+1:]...) } - // Update pagination - m.paginator.SetTotalPages(len(m.markdowns)) - m.paginator.Page = min(m.paginator.Page, m.paginator.TotalPages-1) - // Set state and delete m.state = stashStateReady - return m, deleteStashedItem(m.cc, id) + if m.searchInput.Value() != "" { + m.state = stashStateShowFiltered + } + + // Update pagination + m.setTotalPages() + return m, deleteStashedItem(m.cc, smd.ID) default: m.state = stashStateReady @@ -620,6 +643,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { newSearchInputModel, cmd := textinput.Update(msg, m.searchInput) m.searchInput = newSearchInputModel cmds = append(cmds, cmd) + + // Update pagination + m.setTotalPages() + case stashStateSettingNote: if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { From faeef13e5556ea2ede97f3c3a72bbce8e7d9b249 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Sat, 24 Oct 2020 22:50:34 +0200 Subject: [PATCH 546/911] Get the cursor movement going while filtering stashitems --- ui/stash.go | 73 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 9ae885f..b344f39 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -250,6 +250,47 @@ func (m *stashModel) hideStatusMessage() { } } +func (m *stashModel) moveCursorUp() { + m.index-- + if m.index < 0 && m.paginator.Page == 0 { + // Stop + m.index = 0 + return + } + + if m.index >= 0 { + return + } + // Go to previous page + m.paginator.PrevPage() + + m.index = m.paginator.ItemsOnPage(len(m.getNotes())) - 1 +} + +func (m *stashModel) moveCursorDown() { + itemsOnPage := m.paginator.ItemsOnPage(len(m.getNotes())) + + m.index++ + if m.index < itemsOnPage { + return + } + + if !m.paginator.OnLastPage() { + m.paginator.NextPage() + m.index = 0 + return + } + + // during filtering the cursor position can exceed the number of + // itemsOnPage. It's more intuitive to start the cursor at the + // topmost position when moving it down in this scenario. + if m.index > itemsOnPage { + m.index = 0 + return + } + m.index = itemsOnPage - 1 +} + // INIT func newStashModel(cfg *Config, as authStatus) stashModel { @@ -391,28 +432,11 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Handle keys case tea.KeyMsg: switch msg.String() { - case "k", "up": - m.index-- - if m.index < 0 && m.paginator.Page == 0 { - // Stop - m.index = 0 - } else if m.index < 0 { - // Go to previous page - m.paginator.PrevPage() - m.index = m.paginator.ItemsOnPage(len(m.markdowns)) - 1 - } + case "k", "ctrl+k", "up": + m.moveCursorUp() - case "j", "down": - itemsOnPage := m.paginator.ItemsOnPage(len(m.markdowns)) - m.index++ - if m.index >= itemsOnPage && m.paginator.OnLastPage() { - // Stop - m.index = itemsOnPage - 1 - } else if m.index >= itemsOnPage { - // Go to next page - m.index = 0 - m.paginator.NextPage() - } + case "j", "ctrl+j", "down": + m.moveCursorDown() // Go to the very start case "home", "g": @@ -636,6 +660,13 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.searchInput.Reset() m.state = stashStateReady } + + case "ctrl+k", "up": + m.moveCursorUp() + m.state = stashStateShowFiltered + case "ctrl+j", "down": + m.moveCursorDown() + m.state = stashStateShowFiltered } } From fbe93a90ff77c6fd1be5af39257614fd3c8a27c2 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Sun, 25 Oct 2020 04:50:18 +0100 Subject: [PATCH 547/911] Add a prefix according to the markdownType when filtering notes --- ui/stash.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index b344f39..3b5330b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -229,7 +229,15 @@ func (m *stashModel) getNotes() []*markdown { targets := []string{} for _, t := range m.markdowns { - targets = append(targets, t.Note) + prefix := "" + switch t.markdownType { + case newsMarkdown: + prefix = "News: " + case convertedMarkdown: + prefix = t.localPath + } + + targets = append(targets, prefix+t.Note) } ranks := fuzzy.RankFindFold(m.searchInput.Value(), targets) From 7fb4a43474495954ed65061bedf622e618bb6ff3 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Sun, 25 Oct 2020 04:51:23 +0100 Subject: [PATCH 548/911] Fix cursor placement when paging trough filtered notes --- ui/stash.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ui/stash.go b/ui/stash.go index 3b5330b..340b22d 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -661,6 +661,19 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { break } + // When there's only one filtered markdown left and the cursor + // is placed on it we can diretly "enter" it and change to the + // markdown view + if h := m.getNotes(); len(h) == 1 && h[0].ID == m.selectedMarkdown().ID { + m.state = stashStateReady + m.searchInput.Reset() + + var cmd tea.Cmd + m, cmd = stashUpdate(msg, m) + cmds = append(cmds, cmd) + break + } + m.searchInput.Blur() m.state = stashStateShowFiltered From 4782b991546c043588eed80998811c538f3e8b8c Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Sun, 25 Oct 2020 04:57:12 +0100 Subject: [PATCH 549/911] Display news item count in stash view --- ui/stash.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 340b22d..6ebcdbe 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -851,9 +851,10 @@ func stashHeaderView(m stashModel) string { localItems := m.countMarkdowns(localMarkdown) stashedItems := m.countMarkdowns(stashedMarkdown) + m.countMarkdowns(convertedMarkdown) + newsItems := m.countMarkdowns(newsMarkdown) // Loading's finished and all we have is news. - if !loading && localItems == 0 && stashedItems == 0 { + if !loading && localItems == 0 && stashedItems == 0 && newsItems == 0 { if m.stashedOnly() { return common.Subtle("No stashed markdown files found.") + maybeOffline } else { @@ -874,6 +875,18 @@ func stashHeaderView(m stashModel) string { si := common.Subtle(fmt.Sprintf("%d Stashed", stashedItems)) s += fmt.Sprintf("%s%s", divider, si) } + if newsItems > 0 { + var divider string + if localItems > 0 || stashedItems > 0 { + divider = dividerDot + } + si := common.Subtle(fmt.Sprintf("%d News", newsItems)) + if newsItems == 1 { + si = common.Subtle(fmt.Sprintf("%d New", newsItems)) + } + + s += fmt.Sprintf("%s%s", divider, si) + } return common.Subtle(s) + maybeOffline } From 56847c1b01ac10a8d00fb85f12537f1abd1ca1f2 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Mon, 26 Oct 2020 15:52:54 +0100 Subject: [PATCH 550/911] Dim search results during filtering --- ui/stash.go | 5 ++++- ui/stashitem.go | 21 ++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 6ebcdbe..218b6b2 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -785,7 +785,10 @@ func stashView(m stashModel) string { logoOrSearch := glowLogoView(" Glow ") // we replace the logo with the search field in - if m.state == stashStateSearchNotes || m.state == stashStateShowFiltered { + if m.state == stashStateSearchNotes { + logoOrSearch = textinput.View(m.searchInput) + } else if m.state == stashStateShowFiltered { + m.searchInput.TextColor = m.searchInput.PlaceholderColor logoOrSearch = textinput.View(m.searchInput) } diff --git a/ui/stashitem.go b/ui/stashitem.go index 6153c39..fdb95a9 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -69,6 +69,14 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { icon = "" title = textinput.View(m.noteInput) date = dullYellowFg(date) + case stashStateSearchNotes: + if len(m.getNotes()) != 1 { + gutter = dullFuchsiaFg(verticalLine) + icon = dullFuchsiaFg(icon) + title = dullFuchsiaFg(title) + break + } + fallthrough default: // Selected gutter = dullFuchsiaFg(verticalLine) @@ -80,7 +88,11 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { // Normal if md.markdownType == newsMarkdown { gutter = " " - title = te.String(title).Foreground(common.Indigo.Color()).String() + if m.state == stashStateSearchNotes { + title = subtleIndigoFg(title) + } else { + title = te.String(title).Foreground(common.Indigo.Color()).String() + } date = subtleIndigoFg(date) } else { icon = greenFg(icon) @@ -90,6 +102,13 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { gutter = " " date = warmGrayFg(date) } + + if m.state == stashStateSearchNotes { + icon = common.Subtle(icon) + title = common.Subtle(title) + gutter = common.Subtle(gutter) + date = common.Subtle(date) + } } fmt.Fprintf(b, "%s %s%s\n", gutter, icon, title) From c91501655ffa492aeffcfda4b9048104488bc163 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Wed, 28 Oct 2020 01:48:07 +0100 Subject: [PATCH 551/911] Dont panic during actions in the filtered stash view w/o items Filterng down the stash to 0 items (no cursor is displayed as there are no items left) caused a panic during execution of one of these actions: - x: Delete - m: Set Memo - s: Stash file This change prevents that from happening by breaking the switch statement when there are no items left. Also glow now uses the filtered markdown notes in the `stashHelpView` so `m.selectedMarkdown()` cannot return a nil refernce anymore. --- ui/stash.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 218b6b2..c1311b6 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -505,6 +505,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case "m": m.hideStatusMessage() + if pages == 0 { + break + } + md := m.selectedMarkdown() isUserMarkdown := md.markdownType == stashedMarkdown || md.markdownType == convertedMarkdown isSettingNote := m.state == stashStateSettingNote @@ -523,6 +527,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { break } + if pages == 0 { + break + } + md := m.selectedMarkdown() // is the file in the process of being stashed? @@ -553,6 +561,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case "x": m.hideStatusMessage() + if pages == 0 { + break + } + t := m.selectedMarkdown().markdownType isUserMarkdown := t == stashedMarkdown || t == convertedMarkdown isValidState := m.state != stashStateSettingNote @@ -933,7 +945,7 @@ func stashHelpView(m stashModel) string { isLocal bool ) - if len(m.markdowns) > 0 { + if len(m.getNotes()) > 0 { md := m.selectedMarkdown() isStashed = md != nil && md.markdownType == stashedMarkdown isLocal = md != nil && md.markdownType == localMarkdown From 89965743a1d26bec6e9dc5a743c91f99e561ca55 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Wed, 28 Oct 2020 01:58:40 +0100 Subject: [PATCH 552/911] Ensure the search binding "/" always works --- ui/stash.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index c1311b6..e1da5d9 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -492,10 +492,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case "/": m.hideStatusMessage() - if pages == 0 { - break - } - m.state = stashStateSearchNotes m.searchInput.CursorEnd() m.searchInput.Focus() From 7500d88e93a83701ea48cd9646e3e0d1329d0263 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Wed, 28 Oct 2020 02:00:02 +0100 Subject: [PATCH 553/911] TIL: 'News' is singular --- ui/stash.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index e1da5d9..eadce02 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -892,9 +892,6 @@ func stashHeaderView(m stashModel) string { divider = dividerDot } si := common.Subtle(fmt.Sprintf("%d News", newsItems)) - if newsItems == 1 { - si = common.Subtle(fmt.Sprintf("%d New", newsItems)) - } s += fmt.Sprintf("%s%s", divider, si) } From aba133b7e64cc60abfd1677b1ff4810beb17bae9 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Wed, 28 Oct 2020 02:17:18 +0100 Subject: [PATCH 554/911] There's always at least 1 page available in the paginator Passing 0 to `paginator.SetTotalPages()` is ineffective as it won't alter the model (paginator needs at least 1 page) and therefore doesn't update the page count. Filtering can lead to 0 items in the stash view - in this case we still want to have a page available in the paginator - so we also have pass 1 to `setTotalPages()`. --- ui/stash.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index eadce02..46c072e 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -133,10 +133,13 @@ func (m *stashModel) setSize(width, height int) { // Sets the total paginator pages according to the amount of markdowns for the // current state. func (m *stashModel) setTotalPages() { - pages := len(m.getNotes()) - m.paginator.PerPage = max(1, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)/stashViewItemHeight) - m.paginator.SetTotalPages(pages) + + if pages := len(m.getNotes()); pages < 1 { + m.paginator.SetTotalPages(1) + } else { + m.paginator.SetTotalPages(pages) + } // Make sure the page stays in bounds if m.paginator.Page >= m.paginator.TotalPages-1 { From 2131b255efa3098b508610e98ded26f526198db0 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Wed, 28 Oct 2020 02:50:47 +0100 Subject: [PATCH 555/911] Reset cursor and page positions when entering the search state --- ui/stash.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/stash.go b/ui/stash.go index 46c072e..cd8f78a 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -495,6 +495,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case "/": m.hideStatusMessage() + m.paginator.Page = 0 + m.index = 0 m.state = stashStateSearchNotes m.searchInput.CursorEnd() m.searchInput.Focus() From 8d03dd5731b333360422553b1dbbb570e5450f5a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 3 Nov 2020 20:15:30 -0500 Subject: [PATCH 556/911] Adjust dimmed colors for dark backgrounds; light colors outstanding --- ui/stashitem.go | 83 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 25 deletions(-) diff --git a/ui/stashitem.go b/ui/stashitem.go index fdb95a9..39f6400 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -18,17 +18,40 @@ const ( ) var ( - greenFg = te.Style{}.Foreground(common.NewColorPair("#04B575", "#04B575").Color()).Styled - fuchsiaFg = te.Style{}.Foreground(common.Fuschia.Color()).Styled - dullFuchsiaFg = te.Style{}.Foreground(common.NewColorPair("#AD58B4", "#F793FF").Color()).Styled - yellowFg = te.Style{}.Foreground(common.YellowGreen.Color()).Styled // renders light green on light backgrounds - dullYellowFg = te.Style{}.Foreground(common.NewColorPair("#9BA92F", "#6BCB94").Color()).Styled // renders light green on light backgrounds - subtleIndigoFg = te.Style{}.Foreground(common.NewColorPair("#514DC1", "#7D79F6").Color()).Styled - redFg = te.Style{}.Foreground(common.Red.Color()).Styled - faintRedFg = te.Style{}.Foreground(common.FaintRed.Color()).Styled - warmGrayFg = te.Style{}.Foreground(common.NewColorPair("#979797", "#847A85").Color()).Styled + normalFg = makeFgStyle(common.NewColorPair("#dddddd", "#000")) + dimNormalFg = makeFgStyle(common.NewColorPair("#777777", "#000")) + + warmGrayFg = makeFgStyle(common.NewColorPair("#979797", "#847A85")) + dimWarmGrayFg = makeFgStyle(common.NewColorPair("#4D4D4D", "#000000")) + + grayFg = makeFgStyle(common.NewColorPair("#626262", "#000")) + dimGrayFg = makeFgStyle(common.NewColorPair("#3F3F3F", "#000")) + + greenFg = makeFgStyle(common.NewColorPair("#04B575", "#04B575")) + dimGreenFg = makeFgStyle(common.NewColorPair("#0B5137", "#000000")) + + fuchsiaFg = makeFgStyle(common.Fuschia) + dimFuchsiaFg = makeFgStyle(common.NewColorPair("#99519E", "#000000")) + + dullFuchsiaFg = makeFgStyle(common.NewColorPair("#AD58B4", "#F793FF")) + dimDullFuchsiaFg = makeFgStyle(common.NewColorPair("#6B3A6F", "#000000")) + + indigoFg = makeFgStyle(common.Indigo) + dimIndigoFg = makeFgStyle(common.NewColorPair("#494690", "#000000")) + + subtleIndigoFg = makeFgStyle(common.NewColorPair("#514DC1", "#7D79F6")) + dimSubtleIndigoFg = makeFgStyle(common.NewColorPair("#383584", "#000000")) + + yellowFg = makeFgStyle(common.YellowGreen) // renders light green on light backgrounds + dullYellowFg = makeFgStyle(common.NewColorPair("#9BA92F", "#6BCB94")) // renders light green on light backgrounds + redFg = makeFgStyle(common.Red) + faintRedFg = makeFgStyle(common.FaintRed) ) +func makeFgStyle(c common.ColorPair) func(string) string { + return te.Style{}.Foreground(c.Color()).Styled +} + func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { var ( truncateTo = m.terminalWidth - stashViewHorizontalPadding*2 @@ -56,59 +79,69 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { } if index == m.index { + // Selected item + switch m.state { case stashStatePromptDelete: - // Deleting gutter = faintRedFg(verticalLine) icon = faintRedFg(icon) title = redFg(title) date = faintRedFg(date) case stashStateSettingNote: - // Setting note gutter = dullYellowFg(verticalLine) icon = "" title = textinput.View(m.noteInput) date = dullYellowFg(date) case stashStateSearchNotes: if len(m.getNotes()) != 1 { - gutter = dullFuchsiaFg(verticalLine) - icon = dullFuchsiaFg(icon) - title = dullFuchsiaFg(title) + gutter = dimDullFuchsiaFg(verticalLine) + icon = dimDullFuchsiaFg(icon) + title = dimFuchsiaFg(title) + date = dimDullFuchsiaFg(date) break } + // If we've filtered down to exactly item color it as though it's + // not filtered, since pressing return will open it. fallthrough default: - // Selected gutter = dullFuchsiaFg(verticalLine) icon = dullFuchsiaFg(icon) title = fuchsiaFg(title) date = dullFuchsiaFg(date) } } else { - // Normal + // Regular (non-selected) items + if md.markdownType == newsMarkdown { gutter = " " if m.state == stashStateSearchNotes { - title = subtleIndigoFg(title) + title = dimIndigoFg(title) + date = dimSubtleIndigoFg(date) } else { - title = te.String(title).Foreground(common.Indigo.Color()).String() + title = indigoFg(title) + date = subtleIndigoFg(date) } - date = subtleIndigoFg(date) + } else if m.state == stashStateSearchNotes { + icon = dimGreenFg(icon) + if title == noMemoTitle { + title = dimWarmGrayFg(title) + } else { + title = dimNormalFg(title) + } + gutter = " " + date = dimWarmGrayFg(date) + } else { icon = greenFg(icon) if title == noMemoTitle { title = warmGrayFg(title) + } else { + title = normalFg(title) } gutter = " " date = warmGrayFg(date) } - if m.state == stashStateSearchNotes { - icon = common.Subtle(icon) - title = common.Subtle(title) - gutter = common.Subtle(gutter) - date = common.Subtle(date) - } } fmt.Fprintf(b, "%s %s%s\n", gutter, icon, title) From 5e27376af43074df638cfa6494151ef19a1e3c6a Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Wed, 4 Nov 2020 18:13:59 +0100 Subject: [PATCH 557/911] Keep displaying local markdowns after stashing & deleting them --- ui/stash.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index cd8f78a..011e102 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -636,10 +636,11 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // back to a local file. md.markdownType = localMarkdown md.Note = m.markdowns[i].displayPath + } else { + // Delete optimistically and remove the stashed item + // before we've received a success response. + m.markdowns = append(m.markdowns[:i], m.markdowns[i+1:]...) } - // Delete optimistically and remove the stashed item - // before we've received a success response. - m.markdowns = append(m.markdowns[:i], m.markdowns[i+1:]...) } // Set state and delete From 356cd57c0e856cd22228834e3208f5003434235f Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Wed, 4 Nov 2020 18:15:03 +0100 Subject: [PATCH 558/911] Only dim items when starting a new search --- ui/stashitem.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/stashitem.go b/ui/stashitem.go index 39f6400..cb2af90 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -93,7 +93,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { title = textinput.View(m.noteInput) date = dullYellowFg(date) case stashStateSearchNotes: - if len(m.getNotes()) != 1 { + if len(m.getNotes()) != 1 && m.searchInput.Value() == "" { gutter = dimDullFuchsiaFg(verticalLine) icon = dimDullFuchsiaFg(icon) title = dimFuchsiaFg(title) @@ -114,14 +114,14 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { if md.markdownType == newsMarkdown { gutter = " " - if m.state == stashStateSearchNotes { + if m.state == stashStateSearchNotes && m.searchInput.Value() == "" { title = dimIndigoFg(title) date = dimSubtleIndigoFg(date) } else { title = indigoFg(title) date = subtleIndigoFg(date) } - } else if m.state == stashStateSearchNotes { + } else if m.state == stashStateSearchNotes && m.searchInput.Value() == "" { icon = dimGreenFg(icon) if title == noMemoTitle { title = dimWarmGrayFg(title) From d717b7e330e895ff7e0a468f2c481156e410812c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 10 Nov 2020 16:18:09 -0500 Subject: [PATCH 559/911] Add dimmed colors for light backgrounds --- ui/stashitem.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ui/stashitem.go b/ui/stashitem.go index cb2af90..f3be1df 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -18,29 +18,29 @@ const ( ) var ( - normalFg = makeFgStyle(common.NewColorPair("#dddddd", "#000")) - dimNormalFg = makeFgStyle(common.NewColorPair("#777777", "#000")) + normalFg = makeFgStyle(common.NewColorPair("#dddddd", "#1a1a1a")) + dimNormalFg = makeFgStyle(common.NewColorPair("#777777", "#A49FA5")) warmGrayFg = makeFgStyle(common.NewColorPair("#979797", "#847A85")) - dimWarmGrayFg = makeFgStyle(common.NewColorPair("#4D4D4D", "#000000")) + dimWarmGrayFg = makeFgStyle(common.NewColorPair("#4D4D4D", "#C2B8C2")) grayFg = makeFgStyle(common.NewColorPair("#626262", "#000")) dimGrayFg = makeFgStyle(common.NewColorPair("#3F3F3F", "#000")) greenFg = makeFgStyle(common.NewColorPair("#04B575", "#04B575")) - dimGreenFg = makeFgStyle(common.NewColorPair("#0B5137", "#000000")) + dimGreenFg = makeFgStyle(common.NewColorPair("#0B5137", "#82E1BF")) fuchsiaFg = makeFgStyle(common.Fuschia) - dimFuchsiaFg = makeFgStyle(common.NewColorPair("#99519E", "#000000")) + dimFuchsiaFg = makeFgStyle(common.NewColorPair("#99519E", "#F1A8FF")) dullFuchsiaFg = makeFgStyle(common.NewColorPair("#AD58B4", "#F793FF")) - dimDullFuchsiaFg = makeFgStyle(common.NewColorPair("#6B3A6F", "#000000")) + dimDullFuchsiaFg = makeFgStyle(common.NewColorPair("#6B3A6F", "#F6C9FF")) indigoFg = makeFgStyle(common.Indigo) - dimIndigoFg = makeFgStyle(common.NewColorPair("#494690", "#000000")) + dimIndigoFg = makeFgStyle(common.NewColorPair("#494690", "#9498FF")) subtleIndigoFg = makeFgStyle(common.NewColorPair("#514DC1", "#7D79F6")) - dimSubtleIndigoFg = makeFgStyle(common.NewColorPair("#383584", "#000000")) + dimSubtleIndigoFg = makeFgStyle(common.NewColorPair("#383584", "#BBBDFF")) yellowFg = makeFgStyle(common.YellowGreen) // renders light green on light backgrounds dullYellowFg = makeFgStyle(common.NewColorPair("#9BA92F", "#6BCB94")) // renders light green on light backgrounds From 6965caf3af80ce5d620445daa9f40667a5324b7c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 10 Nov 2020 16:53:17 -0500 Subject: [PATCH 560/911] When stashing/unstashing an item during filtering maintain its position --- ui/stash.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 011e102..bab9656 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -232,15 +232,17 @@ func (m *stashModel) getNotes() []*markdown { targets := []string{} for _, t := range m.markdowns { - prefix := "" + note := "" switch t.markdownType { case newsMarkdown: - prefix = "News: " - case convertedMarkdown: - prefix = t.localPath + note = "News: " + t.Note + case stashedMarkdown: + note = t.Note + default: + note = t.localPath } - targets = append(targets, prefix+t.Note) + targets = append(targets, note) } ranks := fuzzy.RankFindFold(m.searchInput.Value(), targets) From 75528db9f1278554ae1dd37d539eb35ae0d517b4 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 10 Nov 2020 17:18:47 -0500 Subject: [PATCH 561/911] Maintain previous filtering after unloading a document --- ui/stash.go | 6 ------ ui/ui.go | 7 ++++++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index bab9656..9ae9bb7 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -221,7 +221,6 @@ func (m *stashModel) getNotes() []*markdown { if m.searchInput.Value() == "" { return m.markdowns } - if m.state != stashStateSearchNotes && m.state != stashStateShowFiltered && m.state != stashStatePromptDelete && @@ -480,11 +479,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { md := m.selectedMarkdown() m.state = stashStateLoadingDocument - // This is only relevant when "enter" was called from the - // filtered stash view - m.searchInput.SetValue("") - m.setTotalPages() - if md.markdownType == localMarkdown { cmds = append(cmds, loadLocalMarkdown(md)) } else { diff --git a/ui/ui.go b/ui/ui.go index cefc9f9..af83f80 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -156,10 +156,15 @@ type model struct { // method alters the model we also need to send along any commands returned. func (m *model) unloadDocument() []tea.Cmd { m.state = stateShowStash - m.stash.state = stashStateReady m.pager.unload() m.pager.showHelp = false + if m.stash.searchInput.Value() == "" { + m.stash.state = stashStateReady + } else { + m.stash.state = stashStateShowFiltered + } + var batch []tea.Cmd if m.pager.viewport.HighPerformanceRendering { batch = append(batch, tea.ClearScrollArea) From 9797f225a7d1c410acbf4040da62e3b412a9437e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 10 Nov 2020 18:09:34 -0500 Subject: [PATCH 562/911] Change help text if we've filtered down to one item --- ui/stash.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 9ae9bb7..71d9d52 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -938,9 +938,10 @@ func stashHelpView(m stashModel) string { h []string isStashed bool isLocal bool + numDocs = len(m.getNotes()) ) - if len(m.getNotes()) > 0 { + if numDocs > 0 { md := m.selectedMarkdown() isStashed = md != nil && md.markdownType == stashedMarkdown isLocal = md != nil && md.markdownType == localMarkdown @@ -950,6 +951,8 @@ func stashHelpView(m stashModel) string { h = append(h, "enter: confirm", "esc: cancel") } else if m.state == stashStatePromptDelete { h = append(h, "y: delete", "n: cancel") + } else if m.state == stashStateSearchNotes && numDocs == 1 { + h = append(h, "enter: open", "esc: cancel") } else if m.state == stashStateSearchNotes { h = append(h, "enter: confirm", "esc: cancel", "ctrl+j/ctrl+k, ↑/↓: choose") } else { From ef0f5338f4135d9f7fbbe0f63d61a738ef832df4 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 10 Nov 2020 18:15:10 -0500 Subject: [PATCH 563/911] Pressing return with no items filtered clears the filter --- ui/stash.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 71d9d52..93245f1 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -671,10 +671,19 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { break } + h := m.getNotes() + + // If we've filtered down to nothing, cancel the search + if len(h) == 0 { + m.state = stashStateReady + m.searchInput.Reset() + break + } + // When there's only one filtered markdown left and the cursor // is placed on it we can diretly "enter" it and change to the // markdown view - if h := m.getNotes(); len(h) == 1 && h[0].ID == m.selectedMarkdown().ID { + if len(h) == 1 && h[0].ID == m.selectedMarkdown().ID { m.state = stashStateReady m.searchInput.Reset() @@ -794,7 +803,8 @@ func stashView(m stashModel) string { } logoOrSearch := glowLogoView(" Glow ") - // we replace the logo with the search field in + + // If we're filtering we replace the logo with the search field if m.state == stashStateSearchNotes { logoOrSearch = textinput.View(m.searchInput) } else if m.state == stashStateShowFiltered { @@ -953,6 +963,8 @@ func stashHelpView(m stashModel) string { h = append(h, "y: delete", "n: cancel") } else if m.state == stashStateSearchNotes && numDocs == 1 { h = append(h, "enter: open", "esc: cancel") + } else if m.state == stashStateSearchNotes && numDocs == 0 { + h = append(h, "enter/esc: cancel") } else if m.state == stashStateSearchNotes { h = append(h, "enter: confirm", "esc: cancel", "ctrl+j/ctrl+k, ↑/↓: choose") } else { From 2e1579542e92db45b4f754e04682375229510ed5 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 10 Nov 2020 18:48:34 -0500 Subject: [PATCH 564/911] Don't highlight filtered items until search is blurred --- ui/stash.go | 6 +----- ui/stashitem.go | 21 +++++++++------------ 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 93245f1..f923fee 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -701,11 +701,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.state = stashStateReady } - case "ctrl+k", "up": - m.moveCursorUp() - m.state = stashStateShowFiltered - case "ctrl+j", "down": - m.moveCursorDown() + case "ctrl+k", "ctrl+j", "up", "down": m.state = stashStateShowFiltered } } diff --git a/ui/stashitem.go b/ui/stashitem.go index f3be1df..770d5d2 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -78,7 +78,15 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { title = truncate(title, truncateTo) } - if index == m.index { + isSelected := index == m.index + notSearchingNotes := m.state != stashStateSearchNotes + + // If there are multiple items being filtered we don't highlight a selected + // item in the results. If we've filtered down to one item, however, + // highlight that first item since pressing return will open it. + singleFilteredItem := m.state == stashStateSearchNotes && len(m.getNotes()) == 1 + + if isSelected && notSearchingNotes || singleFilteredItem { // Selected item switch m.state { @@ -92,17 +100,6 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { icon = "" title = textinput.View(m.noteInput) date = dullYellowFg(date) - case stashStateSearchNotes: - if len(m.getNotes()) != 1 && m.searchInput.Value() == "" { - gutter = dimDullFuchsiaFg(verticalLine) - icon = dimDullFuchsiaFg(icon) - title = dimFuchsiaFg(title) - date = dimDullFuchsiaFg(date) - break - } - // If we've filtered down to exactly item color it as though it's - // not filtered, since pressing return will open it. - fallthrough default: gutter = dullFuchsiaFg(verticalLine) icon = dullFuchsiaFg(icon) From a17cfa6d2699ca944b7e88f26ecc72b7466b31df Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 10 Nov 2020 22:19:34 -0500 Subject: [PATCH 565/911] Shift+tab also moves into filtered results --- ui/stash.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index f923fee..5be66e1 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -664,7 +664,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Cancel search m.state = stashStateReady m.searchInput.Reset() - case "enter", "tab": + case "enter", "tab", "shift+tab", "ctrl+k", "up", "ctrl+j", "down": m.hideStatusMessage() if len(m.markdowns) == 0 { @@ -700,9 +700,6 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.searchInput.Reset() m.state = stashStateReady } - - case "ctrl+k", "ctrl+j", "up", "down": - m.state = stashStateShowFiltered } } From 899c038402abb3c31d1073bed8e5a090e7481c0b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 10 Nov 2020 22:19:55 -0500 Subject: [PATCH 566/911] Also add tab/shift+tab bindings to file browser --- ui/stash.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 5be66e1..39ce16e 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -444,10 +444,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Handle keys case tea.KeyMsg: switch msg.String() { - case "k", "ctrl+k", "up": + case "k", "ctrl+k", "up", "shift+tab": m.moveCursorUp() - case "j", "ctrl+j", "down": + case "j", "ctrl+j", "down", "tab": m.moveCursorDown() // Go to the very start From 759b8707f8a1486bcb55d919b51160c9023e62a7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 11 Nov 2020 16:14:38 -0500 Subject: [PATCH 567/911] Tidying up --- ui/stash.go | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 39ce16e..6c34c29 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -215,8 +215,8 @@ func (m stashModel) countMarkdowns(t markdownType) (found int) { } // Returns the stashed markdown notes. When the model state indicates that -// filtering is desired this also filters and ranks the notes by the search term -// in the searchinput field. +// filtering is desired, this also filters and ranks the notes by the search +// term in the searchInput field. func (m *stashModel) getNotes() []*markdown { if m.searchInput.Value() == "" { return m.markdowns @@ -463,7 +463,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // esc only passed trough in stashStateSearchNotes case "esc": m.state = stashStateReady - m.searchInput.SetValue("") // clear the searchinput + m.searchInput.SetValue("") // clear the searchInput m.setTotalPages() // Open document @@ -520,11 +520,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Stash case "s": - if m.authStatus != authOK || m.selectedMarkdown() == nil { - break - } - - if pages == 0 { + if pages == 0 || m.authStatus != authOK || m.selectedMarkdown() == nil { break } From 7b7a398c74a4e90f06d933b69d24b010bd22bac0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 11 Nov 2020 16:14:51 -0500 Subject: [PATCH 568/911] Don't dim the search entry when blurring the search field --- ui/stash.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 6c34c29..9ea2d7d 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -794,10 +794,7 @@ func stashView(m stashModel) string { logoOrSearch := glowLogoView(" Glow ") // If we're filtering we replace the logo with the search field - if m.state == stashStateSearchNotes { - logoOrSearch = textinput.View(m.searchInput) - } else if m.state == stashStateShowFiltered { - m.searchInput.TextColor = m.searchInput.PlaceholderColor + if m.state == stashStateSearchNotes || m.state == stashStateShowFiltered { logoOrSearch = textinput.View(m.searchInput) } From 4b121593d4fde40e29f226d14a68d99de3936b35 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 11 Nov 2020 16:28:48 -0500 Subject: [PATCH 569/911] Mop up styling big time --- ui/pager.go | 46 +++++++++++++++++------------------------- ui/stash.go | 11 +++++----- ui/stashitem.go | 37 ---------------------------------- ui/styles.go | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 70 deletions(-) create mode 100644 ui/styles.go diff --git a/ui/pager.go b/ui/pager.go index d050989..9ae6462 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -21,11 +21,6 @@ import ( const ( statusBarHeight = 1 - gray = "#333333" - yellowGreen = "#ECFD65" - fuschia = "#EE6FF8" - mintGreen = "#89F0CB" - darkGreen = "#1C8760" noteHeadingText = " Set Memo " notePromptText = " > " ) @@ -33,35 +28,29 @@ const ( var ( pagerHelpHeight int + mintGreen = common.NewColorPair("#89F0CB", "#89F0CB") + darkGreen = common.NewColorPair("#1C8760", "#1C8760") + noteHeading = te.String(noteHeadingText). Foreground(common.Cream.Color()). Background(common.Green.Color()). String() - statusBarBg = common.NewColorPair("#242424", "#E6E6E6") statusBarNoteFg = common.NewColorPair("#7D7D7D", "#656565") + statusBarBg = common.NewColorPair("#242424", "#E6E6E6") - // Styling functions. - statusBarScrollPosStyle = newStyle(common.NewColorPair("#5A5A5A", "#949494").String(), statusBarBg.String()) - statusBarNoteStyle = newStyle(statusBarNoteFg.String(), statusBarBg.String()) - statusBarHelpStyle = newStyle(statusBarNoteFg.String(), common.NewColorPair("#323232", "#DCDCDC").String()) - statusBarStashDotStyle = newStyle(common.Green.String(), statusBarBg.String()) + // Styling funcs + statusBarScrollPosStyle = newStyle(common.NewColorPair("#5A5A5A", "#949494"), statusBarBg) + statusBarNoteStyle = newStyle(statusBarNoteFg, statusBarBg) + statusBarHelpStyle = newStyle(statusBarNoteFg, common.NewColorPair("#323232", "#DCDCDC")) + statusBarStashDotStyle = newStyle(common.Green, statusBarBg) statusBarMessageStyle = newStyle(mintGreen, darkGreen) statusBarMessageStashIconStyle = newStyle(mintGreen, darkGreen) statusBarMessageScrollPosStyle = newStyle(mintGreen, darkGreen) - statusBarMessageHelpStyle = newStyle("#B6FFE4", common.Green.String()) - - helpViewStyle = newStyle(statusBarNoteFg.String(), common.NewColorPair("#1B1B1B", "#f2f2f2").String()) + statusBarMessageHelpStyle = newStyle(common.NewColorPair("#B6FFE4", "#B6FFE4"), common.Green) + helpViewStyle = newStyle(statusBarNoteFg, common.NewColorPair("#1B1B1B", "#f2f2f2")) ) -// Returns a termenv style. -func newStyle(fg, bg string) func(string) string { - return te.Style{}. - Foreground(te.ColorProfile().Color(fg)). - Background(te.ColorProfile().Color(bg)). - Styled -} - type contentRenderedMsg string type noteSavedMsg *charm.Markdown type stashSuccessMsg markdown @@ -109,18 +98,19 @@ func newPagerModel(cfg *Config, as authStatus) pagerModel { vp.YPosition = 0 vp.HighPerformanceRendering = config.HighPerformancePager - // Init text input UI for notes/memos + // Text input for notes/memos ti := textinput.NewModel() ti.Prompt = te.String(notePromptText). - Foreground(te.ColorProfile().Color(gray)). - Background(te.ColorProfile().Color(yellowGreen)). + Foreground(common.Color(darkGray)). + Background(common.YellowGreen.Color()). String() - ti.TextColor = gray - ti.BackgroundColor = yellowGreen - ti.CursorColor = fuschia + ti.TextColor = darkGray + ti.BackgroundColor = common.YellowGreen.String() + ti.CursorColor = common.Fuschia.String() ti.CharLimit = noteCharacterLimit ti.Focus() + // Text input for search sp := spinner.NewModel() sp.ForegroundColor = statusBarNoteFg.String() sp.BackgroundColor = statusBarBg.String() diff --git a/ui/stash.go b/ui/stash.go index 9ea2d7d..9377cab 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -34,9 +34,10 @@ const ( ) var ( - stashHelpItemStyle func(string) string = te.Style{}.Foreground(common.NewColorPair("#5C5C5C", "#9B9B9B").Color()).Styled - dividerDot string = te.String(" • ").Foreground(common.NewColorPair("#3C3C3C", "#DDDADA").Color()).String() - offlineHeaderNote string = te.String("(Offline)").Foreground(common.NewColorPair("#3C3C3C", "#DDDADA").Color()).String() + stashHelpItemStyle styleFunc = newFgStyle(common.NewColorPair("#5C5C5C", "#9B9B9B")) + stashTextInputPromptStyle styleFunc = newFgStyle(common.YellowGreen) + dividerDot string = te.String(" • ").Foreground(common.NewColorPair("#3C3C3C", "#DDDADA").Color()).String() + offlineHeaderNote string = te.String("(Offline)").Foreground(common.NewColorPair("#3C3C3C", "#DDDADA").Color()).String() ) // MSG @@ -318,13 +319,13 @@ func newStashModel(cfg *Config, as authStatus) stashModel { p.InactiveDot = common.Subtle("•") ni := textinput.NewModel() - ni.Prompt = te.String(setNotePromptText).Foreground(common.YellowGreen.Color()).String() + ni.Prompt = stashTextInputPromptStyle(setNotePromptText) ni.CursorColor = common.Fuschia.String() ni.CharLimit = noteCharacterLimit ni.Focus() si := textinput.NewModel() - si.Prompt = te.String(searchNotePromptText).Foreground(common.YellowGreen.Color()).String() + si.Prompt = stashTextInputPromptStyle(searchNotePromptText) si.CursorColor = common.Fuschia.String() si.CharLimit = noteCharacterLimit si.Focus() diff --git a/ui/stashitem.go b/ui/stashitem.go index 770d5d2..80dfb28 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -5,9 +5,7 @@ import ( "strings" "github.com/charmbracelet/bubbles/textinput" - "github.com/charmbracelet/charm/ui/common" rw "github.com/mattn/go-runewidth" - te "github.com/muesli/termenv" ) const ( @@ -17,41 +15,6 @@ const ( fileListingStashIcon = "• " ) -var ( - normalFg = makeFgStyle(common.NewColorPair("#dddddd", "#1a1a1a")) - dimNormalFg = makeFgStyle(common.NewColorPair("#777777", "#A49FA5")) - - warmGrayFg = makeFgStyle(common.NewColorPair("#979797", "#847A85")) - dimWarmGrayFg = makeFgStyle(common.NewColorPair("#4D4D4D", "#C2B8C2")) - - grayFg = makeFgStyle(common.NewColorPair("#626262", "#000")) - dimGrayFg = makeFgStyle(common.NewColorPair("#3F3F3F", "#000")) - - greenFg = makeFgStyle(common.NewColorPair("#04B575", "#04B575")) - dimGreenFg = makeFgStyle(common.NewColorPair("#0B5137", "#82E1BF")) - - fuchsiaFg = makeFgStyle(common.Fuschia) - dimFuchsiaFg = makeFgStyle(common.NewColorPair("#99519E", "#F1A8FF")) - - dullFuchsiaFg = makeFgStyle(common.NewColorPair("#AD58B4", "#F793FF")) - dimDullFuchsiaFg = makeFgStyle(common.NewColorPair("#6B3A6F", "#F6C9FF")) - - indigoFg = makeFgStyle(common.Indigo) - dimIndigoFg = makeFgStyle(common.NewColorPair("#494690", "#9498FF")) - - subtleIndigoFg = makeFgStyle(common.NewColorPair("#514DC1", "#7D79F6")) - dimSubtleIndigoFg = makeFgStyle(common.NewColorPair("#383584", "#BBBDFF")) - - yellowFg = makeFgStyle(common.YellowGreen) // renders light green on light backgrounds - dullYellowFg = makeFgStyle(common.NewColorPair("#9BA92F", "#6BCB94")) // renders light green on light backgrounds - redFg = makeFgStyle(common.Red) - faintRedFg = makeFgStyle(common.FaintRed) -) - -func makeFgStyle(c common.ColorPair) func(string) string { - return te.Style{}.Foreground(c.Color()).Styled -} - func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { var ( truncateTo = m.terminalWidth - stashViewHorizontalPadding*2 diff --git a/ui/styles.go b/ui/styles.go new file mode 100644 index 0000000..d8b4971 --- /dev/null +++ b/ui/styles.go @@ -0,0 +1,53 @@ +package ui + +import ( + "github.com/charmbracelet/charm/ui/common" + te "github.com/muesli/termenv" +) + +type styleFunc func(string) string + +const ( + darkGray = "#333333" +) + +var ( + normalFg = newFgStyle(common.NewColorPair("#dddddd", "#1a1a1a")) + dimNormalFg = newFgStyle(common.NewColorPair("#777777", "#A49FA5")) + + warmGrayFg = newFgStyle(common.NewColorPair("#979797", "#847A85")) + dimWarmGrayFg = newFgStyle(common.NewColorPair("#4D4D4D", "#C2B8C2")) + + grayFg = newFgStyle(common.NewColorPair("#626262", "#000")) + dimGrayFg = newFgStyle(common.NewColorPair("#3F3F3F", "#000")) + + greenFg = newFgStyle(common.NewColorPair("#04B575", "#04B575")) + dimGreenFg = newFgStyle(common.NewColorPair("#0B5137", "#82E1BF")) + + fuchsiaFg = newFgStyle(common.Fuschia) + dimFuchsiaFg = newFgStyle(common.NewColorPair("#99519E", "#F1A8FF")) + + dullFuchsiaFg = newFgStyle(common.NewColorPair("#AD58B4", "#F793FF")) + dimDullFuchsiaFg = newFgStyle(common.NewColorPair("#6B3A6F", "#F6C9FF")) + + indigoFg = newFgStyle(common.Indigo) + dimIndigoFg = newFgStyle(common.NewColorPair("#494690", "#9498FF")) + + subtleIndigoFg = newFgStyle(common.NewColorPair("#514DC1", "#7D79F6")) + dimSubtleIndigoFg = newFgStyle(common.NewColorPair("#383584", "#BBBDFF")) + + yellowFg = newFgStyle(common.YellowGreen) // renders light green on light backgrounds + dullYellowFg = newFgStyle(common.NewColorPair("#9BA92F", "#6BCB94")) // renders light green on light backgrounds + redFg = newFgStyle(common.Red) + faintRedFg = newFgStyle(common.FaintRed) +) + +// Returns a termenv style with foreground and background options. +func newStyle(fg, bg common.ColorPair) func(string) string { + return te.Style{}.Foreground(fg.Color()).Background(bg.Color()).Styled +} + +// Returns a new termenv style with background options only. +func newFgStyle(c common.ColorPair) styleFunc { + return te.Style{}.Foreground(c.Color()).Styled +} From 8277cbb71fba42fea7152ee9517d0a01cd246db9 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 11 Nov 2020 17:56:40 -0500 Subject: [PATCH 570/911] Remove some consts + check cell widths of prompts, not byte lengths We're able to remove those consts by virtue of reflow's new-ish ansi.PrintableRuneWidth. --- ui/pager.go | 14 ++++++-------- ui/stash.go | 10 ++++------ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 9ae6462..8e88528 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -19,11 +19,7 @@ import ( te "github.com/muesli/termenv" ) -const ( - statusBarHeight = 1 - noteHeadingText = " Set Memo " - notePromptText = " > " -) +const statusBarHeight = 1 var ( pagerHelpHeight int @@ -31,7 +27,7 @@ var ( mintGreen = common.NewColorPair("#89F0CB", "#89F0CB") darkGreen = common.NewColorPair("#1C8760", "#1C8760") - noteHeading = te.String(noteHeadingText). + noteHeading = te.String(" Set Memo "). Foreground(common.Cream.Color()). Background(common.Green.Color()). String() @@ -100,7 +96,7 @@ func newPagerModel(cfg *Config, as authStatus) pagerModel { // Text input for notes/memos ti := textinput.NewModel() - ti.Prompt = te.String(notePromptText). + ti.Prompt = te.String(" > "). Foreground(common.Color(darkGray)). Background(common.YellowGreen.Color()). String() @@ -132,7 +128,9 @@ func (m *pagerModel) setSize(w, h int) { m.height = h m.viewport.Width = w m.viewport.Height = h - statusBarHeight - m.textInput.Width = w - len(noteHeadingText) - len(notePromptText) - 1 + m.textInput.Width = w - + ansi.PrintableRuneWidth(noteHeading) - + ansi.PrintableRuneWidth(m.textInput.Prompt) - 1 if m.showHelp { if pagerHelpHeight == 0 { diff --git a/ui/stash.go b/ui/stash.go index 9377cab..fd305b6 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -29,8 +29,6 @@ const ( stashViewTopPadding = 5 stashViewBottomPadding = 4 stashViewHorizontalPadding = 6 - setNotePromptText = "Memo: " - searchNotePromptText = "Search: " ) var ( @@ -127,8 +125,8 @@ func (m *stashModel) setSize(width, height int) { // Update the paginator m.setTotalPages() - m.noteInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - len(setNotePromptText) - m.searchInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - len(searchNotePromptText) + m.noteInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.noteInput.Prompt) + m.searchInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.searchInput.Prompt) } // Sets the total paginator pages according to the amount of markdowns for the @@ -319,13 +317,13 @@ func newStashModel(cfg *Config, as authStatus) stashModel { p.InactiveDot = common.Subtle("•") ni := textinput.NewModel() - ni.Prompt = stashTextInputPromptStyle(setNotePromptText) + ni.Prompt = stashTextInputPromptStyle("Memo: ") ni.CursorColor = common.Fuschia.String() ni.CharLimit = noteCharacterLimit ni.Focus() si := textinput.NewModel() - si.Prompt = stashTextInputPromptStyle(searchNotePromptText) + si.Prompt = stashTextInputPromptStyle("Search: ") si.CursorColor = common.Fuschia.String() si.CharLimit = noteCharacterLimit si.Focus() From d09b225087f9aa9cac55c8383291db3c8e9a6385 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 12 Nov 2020 15:22:03 -0500 Subject: [PATCH 571/911] Filter against relative path rather than full path --- ui/stash.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index fd305b6..11c1c04 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -237,7 +237,7 @@ func (m *stashModel) getNotes() []*markdown { case stashedMarkdown: note = t.Note default: - note = t.localPath + note = t.displayPath } targets = append(targets, note) From 000a0baae8b6002cbb85253719f79ec568773870 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 12 Nov 2020 15:23:34 -0500 Subject: [PATCH 572/911] Use path separator const when building relative path --- ui/ui.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/ui.go b/ui/ui.go index af83f80..656a4f2 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -654,7 +654,7 @@ func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { md := &markdown{ markdownType: localMarkdown, localPath: res.Path, - displayPath: strings.Replace(res.Path, cwd+"/", "", -1), // strip absolute path + displayPath: strings.Replace(res.Path, cwd+string(os.PathSeparator), "", -1), // strip absolute path Markdown: charm.Markdown{}, } From 005aa65d7be7989bda0ea580412081f9a0fe23da Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 12 Nov 2020 15:49:15 -0500 Subject: [PATCH 573/911] The q key should quit when browsing a list of filtered documents --- ui/ui.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/ui.go b/ui/ui.go index 656a4f2..ba23684 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -245,7 +245,8 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case stateShowStash: switch m.stash.state { - case stashStateSettingNote, stashStatePromptDelete, stashStateShowingError, stashStateSearchNotes, stashStateShowFiltered: + case stashStateSettingNote, stashStatePromptDelete, + stashStateShowingError, stashStateSearchNotes: m.stash, cmd = stashUpdate(msg, m.stash) return m, cmd } From 464c84bb13af916400e44a8746bb86dc9d810562 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 12 Nov 2020 21:59:33 -0500 Subject: [PATCH 574/911] Fix a regression where esc wouldn't clear filtered results --- ui/ui.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index ba23684..2908e2c 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -240,13 +240,23 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case "q", "esc": var cmd tea.Cmd - // Send these keys through to stash + // Send q/esc through to stash switch m.state { case stateShowStash: switch m.stash.state { + + // Send q/esc through in these cases case stashStateSettingNote, stashStatePromptDelete, - stashStateShowingError, stashStateSearchNotes: + stashStateShowingError, stashStateSearchNotes, + stashStateShowFiltered: + + // If we're fitering, only send esc through so we can clear + // the filter results. Q quits as normal. + if m.stash.state == stashStateShowFiltered && msg.String() == "q" { + return m, tea.Quit + } + m.stash, cmd = stashUpdate(msg, m.stash) return m, cmd } From 7722b6e6bca9f65ad2b387c160473be0c975fec7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 13 Nov 2020 15:59:23 -0500 Subject: [PATCH 575/911] Minor comment improvement --- ui/stash.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 11c1c04..6cb2825 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -698,7 +698,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } } - // Update the text input component + // Update the search text input component newSearchInputModel, cmd := textinput.Update(msg, m.searchInput) m.searchInput = newSearchInputModel cmds = append(cmds, cmd) @@ -731,7 +731,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } } - // Update the text input component used to set notes + // Update the note text input component newNoteInputModel, cmd := textinput.Update(msg, m.noteInput) m.noteInput = newNoteInputModel cmds = append(cmds, cmd) From fb5a81f4d69c91b3575e17c28caaf8e9025c6cf6 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 13 Nov 2020 16:17:50 -0500 Subject: [PATCH 576/911] Upgrade to Bubble Tea v0.12.2 and Bubbles v0.7.5 --- go.mod | 4 ++-- go.sum | 8 ++++---- ui/pager.go | 16 ++++++++-------- ui/stash.go | 40 +++++++++++++++++++--------------------- ui/stashitem.go | 3 +-- ui/ui.go | 4 ++-- 6 files changed, 36 insertions(+), 39 deletions(-) diff --git a/go.mod b/go.mod index 7746b36..2f8c1cc 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,8 @@ go 1.13 require ( github.com/alecthomas/chroma v0.8.0 // indirect - github.com/charmbracelet/bubbles v0.7.1 - github.com/charmbracelet/bubbletea v0.12.1 + github.com/charmbracelet/bubbles v0.7.5 + github.com/charmbracelet/bubbletea v0.12.2 github.com/charmbracelet/charm v0.8.2 github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac diff --git a/go.sum b/go.sum index 932681c..eb18c1b 100644 --- a/go.sum +++ b/go.sum @@ -43,12 +43,12 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.6.0/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= -github.com/charmbracelet/bubbles v0.7.1 h1:qvXoIh7ItTA+IA+IO2xxuI9ntp+uVprDAK+IoMzC5OI= -github.com/charmbracelet/bubbles v0.7.1/go.mod h1:UV3dot0XR45cnQX2d8gtohfUFMepquRG2WE56LPKWNc= +github.com/charmbracelet/bubbles v0.7.5 h1:N6TiahuRt2iGNE5gYxKBQ5/C6Lc8xxSp5LY9QJ09mS4= +github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGimk1BE6cmHijOkM= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= github.com/charmbracelet/bubbletea v0.10.5/go.mod h1:Nay5oWkkSZvc6E/be+W3nDFXAsVytNUNKV9jbXcuae0= -github.com/charmbracelet/bubbletea v0.12.1 h1:t21pkG2IDBRduPbt2J64Dx5yt8yIidAkXwhhrc11SzY= -github.com/charmbracelet/bubbletea v0.12.1/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= +github.com/charmbracelet/bubbletea v0.12.2 h1:y9Yo2Pv8tcm3mAJsWONGsmHhzrbNxJVxpVtemikxE9A= +github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= github.com/charmbracelet/charm v0.8.2 h1:sYJhP7YopJUvjWE8VKlNrcAHAaRZsEgKn8z2FoIhHOI= github.com/charmbracelet/charm v0.8.2/go.mod h1:xi3evUxj8hw+dMApaXRczb2SiEzrn8a3NYobj0off+c= github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 h1:XgXVfMdJTNTq/ajMvwiB1OW3Tg/TXHtM3tYr/vYF76w= diff --git a/ui/pager.go b/ui/pager.go index 8e88528..0141b1c 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -244,7 +244,7 @@ func (m pagerModel) Update(msg tea.Msg) (pagerModel, tea.Cmd) { m.textInput.CursorEnd() } - return m, textinput.Blink(m.textInput) + return m, textinput.Blink case "s": if m.authStatus != authOK { break @@ -257,7 +257,7 @@ func (m pagerModel) Update(msg tea.Msg) (pagerModel, tea.Cmd) { cmds = append( cmds, stashDocument(m.cc, m.currentDocument), - spinner.Tick(m.spinner), + spinner.Tick, ) } case "?": @@ -270,7 +270,7 @@ func (m pagerModel) Update(msg tea.Msg) (pagerModel, tea.Cmd) { case spinner.TickMsg: if m.state == pagerStateStashing || m.spinner.Visible() { - newSpinnerModel, cmd := spinner.Update(msg, m.spinner) + newSpinnerModel, cmd := m.spinner.Update(msg) m.spinner = newSpinnerModel cmds = append(cmds, cmd) } else if m.state == pagerStateStashSuccess && !m.spinner.Visible() { @@ -319,10 +319,10 @@ func (m pagerModel) Update(msg tea.Msg) (pagerModel, tea.Cmd) { switch m.state { case pagerStateSetNote: - m.textInput, cmd = textinput.Update(msg, m.textInput) + m.textInput, cmd = m.textInput.Update(msg) cmds = append(cmds, cmd) default: - m.viewport, cmd = viewport.Update(msg, m.viewport) + m.viewport, cmd = m.viewport.Update(msg) cmds = append(cmds, cmd) } @@ -331,7 +331,7 @@ func (m pagerModel) Update(msg tea.Msg) (pagerModel, tea.Cmd) { func (m pagerModel) View() string { var b strings.Builder - fmt.Fprint(&b, viewport.View(m.viewport)+"\n") + fmt.Fprint(&b, m.viewport.View()+"\n") // Footer switch m.state { @@ -383,7 +383,7 @@ func (m pagerModel) statusBarView(b *strings.Builder) { var statusIndicator string if m.state == pagerStateStashing || m.state == pagerStateStashSuccess { if m.spinner.Visible() { - statusIndicator = statusBarNoteStyle(" ") + spinner.View(m.spinner) + statusIndicator = statusBarNoteStyle(" ") + m.spinner.View() } } else if isStashed && showStatusMessage { statusIndicator = statusBarMessageStashIconStyle(" " + pagerStashIcon) @@ -442,7 +442,7 @@ func (m pagerModel) statusBarView(b *strings.Builder) { func (m pagerModel) setNoteView(b *strings.Builder) { fmt.Fprint(b, noteHeading) - fmt.Fprint(b, textinput.View(m.textInput)) + fmt.Fprint(b, m.textInput.View()) } func (m pagerModel) helpView() (s string) { diff --git a/ui/stash.go b/ui/stash.go index 6cb2825..9b9f79c 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -306,7 +306,7 @@ func (m *stashModel) moveCursorDown() { func newStashModel(cfg *Config, as authStatus) stashModel { sp := spinner.NewModel() - sp.Frames = spinner.Line + sp.Spinner = spinner.Line sp.ForegroundColor = common.SpinnerColor.String() sp.HideFor = time.Millisecond * 50 sp.MinimumLifetime = time.Millisecond * 180 @@ -399,7 +399,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.spinner.Visible() if condition { - newSpinnerModel, cmd := spinner.Update(msg, m.spinner) + newSpinnerModel, cmd := m.spinner.Update(msg) m.spinner = newSpinnerModel cmds = append(cmds, cmd) } @@ -484,7 +484,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { cmds = append(cmds, loadRemoteMarkdown(m.cc, md.ID, md.markdownType)) } - cmds = append(cmds, spinner.Tick(m.spinner)) + cmds = append(cmds, spinner.Tick) // Search through your notes case "/": @@ -495,7 +495,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.state = stashStateSearchNotes m.searchInput.CursorEnd() m.searchInput.Focus() - return m, textinput.Blink(m.searchInput) + return m, textinput.Blink // Set note case "m": @@ -514,7 +514,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.state = stashStateSettingNote m.noteInput.SetValue(md.Note) m.noteInput.CursorEnd() - return m, textinput.Blink(m.noteInput) + return m, textinput.Blink } // Stash @@ -546,7 +546,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { if m.loadingDone() && !m.spinner.Visible() { m.spinner.Start() - cmds = append(cmds, spinner.Tick(m.spinner)) + cmds = append(cmds, spinner.Tick) } // Prompt for deletion @@ -577,19 +577,17 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Update paginator. Pagination key handling is done here, but it could // also be moved up to this level, in which case we'd use model methods // like model.PageUp(). - newPaginatorModel, cmd := paginator.Update(msg, m.paginator) + newPaginatorModel, cmd := m.paginator.Update(msg) m.paginator = newPaginatorModel cmds = append(cmds, cmd) // Extra paginator keystrokes if key, ok := msg.(tea.KeyMsg); ok { - if key.Type == tea.KeyRune { - switch key.Rune { - case 'b', 'u': - m.paginator.PrevPage() - case 'f', 'd': - m.paginator.NextPage() - } + switch key.String() { + case "b", "u": + m.paginator.PrevPage() + case "f", "d": + m.paginator.NextPage() } } @@ -699,7 +697,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } // Update the search text input component - newSearchInputModel, cmd := textinput.Update(msg, m.searchInput) + newSearchInputModel, cmd := m.searchInput.Update(msg) m.searchInput = newSearchInputModel cmds = append(cmds, cmd) @@ -732,7 +730,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } // Update the note text input component - newNoteInputModel, cmd := textinput.Update(msg, m.noteInput) + newNoteInputModel, cmd := m.noteInput.Update(msg) m.noteInput = newNoteInputModel cmds = append(cmds, cmd) @@ -756,12 +754,12 @@ func stashView(m stashModel) string { case stashStateShowingError: return errorView(m.err, false) case stashStateLoadingDocument: - s += " " + spinner.View(m.spinner) + " Loading document..." + s += " " + m.spinner.View() + " Loading document..." case stashStateReady, stashStateSettingNote, stashStatePromptDelete, stashStateSearchNotes, stashStateShowFiltered: loadingIndicator := " " if !m.localOnly() && (!m.loadingDone() || m.loadingFromNetwork || m.spinner.Visible()) { - loadingIndicator = spinner.View(m.spinner) + loadingIndicator = m.spinner.View() } // We need to fill any empty height with newlines so the footer reaches @@ -794,18 +792,18 @@ func stashView(m stashModel) string { // If we're filtering we replace the logo with the search field if m.state == stashStateSearchNotes || m.state == stashStateShowFiltered { - logoOrSearch = textinput.View(m.searchInput) + logoOrSearch = m.searchInput.View() } var pagination string if m.paginator.TotalPages > 1 { - pagination = paginator.View(m.paginator) + pagination = m.paginator.View() // If the dot pagination is wider than the width of the window // switch to the arabic paginator. if ansi.PrintableRuneWidth(pagination) > m.terminalWidth-stashViewHorizontalPadding { m.paginator.Type = paginator.Arabic - pagination = common.Subtle(paginator.View(m.paginator)) + pagination = common.Subtle(m.paginator.View()) } // We could also look at m.stashFullyLoaded and add an indicator diff --git a/ui/stashitem.go b/ui/stashitem.go index 80dfb28..f211756 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -4,7 +4,6 @@ import ( "fmt" "strings" - "github.com/charmbracelet/bubbles/textinput" rw "github.com/mattn/go-runewidth" ) @@ -61,7 +60,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { case stashStateSettingNote: gutter = dullYellowFg(verticalLine) icon = "" - title = textinput.View(m.noteInput) + title = m.noteInput.View() date = dullYellowFg(date) default: gutter = dullFuchsiaFg(verticalLine) diff --git a/ui/ui.go b/ui/ui.go index 2908e2c..826e024 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -171,7 +171,7 @@ func (m *model) unloadDocument() []tea.Cmd { } if !m.stash.loadingDone() || m.stash.loadingFromNetwork { - batch = append(batch, spinner.Tick(m.stash.spinner)) + batch = append(batch, spinner.Tick) } return batch } @@ -213,7 +213,7 @@ func (m model) Init() tea.Cmd { if m.cfg.DocumentTypes&StashedDocuments != 0 || m.cfg.DocumentTypes&NewsDocuments != 0 { cmds = append(cmds, newCharmClient, - spinner.Tick(m.stash.spinner), + spinner.Tick, ) } From f9883e8f8d69c9852219e4d69b39217c2b3c43b0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 13 Nov 2020 16:33:22 -0500 Subject: [PATCH 577/911] Change 'search' to 'filter' --- ui/stash.go | 86 ++++++++++++++++++++++++------------------------- ui/stashitem.go | 10 +++--- ui/ui.go | 4 +-- 3 files changed, 50 insertions(+), 50 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 9b9f79c..55802ab 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -61,7 +61,7 @@ const ( stashStateLoadingDocument stashStateSettingNote stashStateShowingError - stashStateSearchNotes + stashStateFilterNotes stashStateShowFiltered ) @@ -74,7 +74,7 @@ type stashModel struct { markdowns []*markdown spinner spinner.Model noteInput textinput.Model - searchInput textinput.Model + filterInput textinput.Model terminalWidth int terminalHeight int stashFullyLoaded bool // have we loaded all available stashed documents from the server? @@ -126,7 +126,7 @@ func (m *stashModel) setSize(width, height int) { m.setTotalPages() m.noteInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.noteInput.Prompt) - m.searchInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.searchInput.Prompt) + m.filterInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.filterInput.Prompt) } // Sets the total paginator pages according to the amount of markdowns for the @@ -214,13 +214,13 @@ func (m stashModel) countMarkdowns(t markdownType) (found int) { } // Returns the stashed markdown notes. When the model state indicates that -// filtering is desired, this also filters and ranks the notes by the search -// term in the searchInput field. +// filtering is desired, this also filters and ranks the notes by the filter +// term in the filterInput field. func (m *stashModel) getNotes() []*markdown { - if m.searchInput.Value() == "" { + if m.filterInput.Value() == "" { return m.markdowns } - if m.state != stashStateSearchNotes && + if m.state != stashStateFilterNotes && m.state != stashStateShowFiltered && m.state != stashStatePromptDelete && m.state != stashStateSettingNote { @@ -243,7 +243,7 @@ func (m *stashModel) getNotes() []*markdown { targets = append(targets, note) } - ranks := fuzzy.RankFindFold(m.searchInput.Value(), targets) + ranks := fuzzy.RankFindFold(m.filterInput.Value(), targets) sort.Sort(ranks) filtered := []*markdown{} @@ -323,7 +323,7 @@ func newStashModel(cfg *Config, as authStatus) stashModel { ni.Focus() si := textinput.NewModel() - si.Prompt = stashTextInputPromptStyle("Search: ") + si.Prompt = stashTextInputPromptStyle("Filter: ") si.CursorColor = common.Fuschia.String() si.CharLimit = noteCharacterLimit si.Focus() @@ -333,7 +333,7 @@ func newStashModel(cfg *Config, as authStatus) stashModel { authStatus: as, spinner: sp, noteInput: ni, - searchInput: si, + filterInput: si, page: 1, paginator: p, loadingFromNetwork: true, @@ -459,10 +459,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.paginator.Page = m.paginator.TotalPages - 1 m.index = m.paginator.ItemsOnPage(pages) - 1 - // esc only passed trough in stashStateSearchNotes + // esc only passed trough in stashStateFilterNotes case "esc": m.state = stashStateReady - m.searchInput.SetValue("") // clear the searchInput + m.filterInput.SetValue("") // clear the filter input m.setTotalPages() // Open document @@ -486,15 +486,15 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { cmds = append(cmds, spinner.Tick) - // Search through your notes + // Filter your notes case "/": m.hideStatusMessage() m.paginator.Page = 0 m.index = 0 - m.state = stashStateSearchNotes - m.searchInput.CursorEnd() - m.searchInput.Focus() + m.state = stashStateFilterNotes + m.filterInput.CursorEnd() + m.filterInput.Focus() return m, textinput.Blink // Set note @@ -634,7 +634,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Set state and delete m.state = stashStateReady - if m.searchInput.Value() != "" { + if m.filterInput.Value() != "" { m.state = stashStateShowFiltered } @@ -644,19 +644,19 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { default: m.state = stashStateReady - if m.searchInput.Value() != "" { + if m.filterInput.Value() != "" { m.state = stashStateShowFiltered } } } - case stashStateSearchNotes: + case stashStateFilterNotes: if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { case "esc": - // Cancel search + // Cancel filtering m.state = stashStateReady - m.searchInput.Reset() + m.filterInput.Reset() case "enter", "tab", "shift+tab", "ctrl+k", "up", "ctrl+j", "down": m.hideStatusMessage() @@ -666,10 +666,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { h := m.getNotes() - // If we've filtered down to nothing, cancel the search + // If we've filtered down to nothing, clear the filter if len(h) == 0 { m.state = stashStateReady - m.searchInput.Reset() + m.filterInput.Reset() break } @@ -678,7 +678,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // markdown view if len(h) == 1 && h[0].ID == m.selectedMarkdown().ID { m.state = stashStateReady - m.searchInput.Reset() + m.filterInput.Reset() var cmd tea.Cmd m, cmd = stashUpdate(msg, m) @@ -686,19 +686,19 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { break } - m.searchInput.Blur() + m.filterInput.Blur() m.state = stashStateShowFiltered - if m.searchInput.Value() == "" { - m.searchInput.Reset() + if m.filterInput.Value() == "" { + m.filterInput.Reset() m.state = stashStateReady } } } - // Update the search text input component - newSearchInputModel, cmd := m.searchInput.Update(msg) - m.searchInput = newSearchInputModel + // Update the filter text input component + newFilterInputModel, cmd := m.filterInput.Update(msg) + m.filterInput = newFilterInputModel cmds = append(cmds, cmd) // Update pagination @@ -710,7 +710,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case "esc": // Cancel note m.state = stashStateReady - if m.searchInput.Value() != "" { + if m.filterInput.Value() != "" { m.state = stashStateShowFiltered } m.noteInput.Reset() @@ -722,7 +722,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { md.Note = newNote m.noteInput.Reset() m.state = stashStateReady - if m.searchInput.Value() != "" { + if m.filterInput.Value() != "" { m.state = stashStateShowFiltered } return m, cmd @@ -755,7 +755,7 @@ func stashView(m stashModel) string { return errorView(m.err, false) case stashStateLoadingDocument: s += " " + m.spinner.View() + " Loading document..." - case stashStateReady, stashStateSettingNote, stashStatePromptDelete, stashStateSearchNotes, stashStateShowFiltered: + case stashStateReady, stashStateSettingNote, stashStatePromptDelete, stashStateFilterNotes, stashStateShowFiltered: loadingIndicator := " " if !m.localOnly() && (!m.loadingDone() || m.loadingFromNetwork || m.spinner.Visible()) { @@ -788,11 +788,11 @@ func stashView(m stashModel) string { header = stashHeaderView(m) } - logoOrSearch := glowLogoView(" Glow ") + logoOrFilter := glowLogoView(" Glow ") - // If we're filtering we replace the logo with the search field - if m.state == stashStateSearchNotes || m.state == stashStateShowFiltered { - logoOrSearch = m.searchInput.View() + // If we're filtering we replace the logo with the filter field + if m.state == stashStateFilterNotes || m.state == stashStateShowFiltered { + logoOrFilter = m.filterInput.View() } var pagination string @@ -814,7 +814,7 @@ func stashView(m stashModel) string { s += fmt.Sprintf( "%s %s\n\n %s\n\n%s\n\n%s %s\n\n %s", loadingIndicator, - logoOrSearch, + logoOrFilter, header, stashPopulatedView(m), blankLines, @@ -944,18 +944,18 @@ func stashHelpView(m stashModel) string { h = append(h, "enter: confirm", "esc: cancel") } else if m.state == stashStatePromptDelete { h = append(h, "y: delete", "n: cancel") - } else if m.state == stashStateSearchNotes && numDocs == 1 { + } else if m.state == stashStateFilterNotes && numDocs == 1 { h = append(h, "enter: open", "esc: cancel") - } else if m.state == stashStateSearchNotes && numDocs == 0 { + } else if m.state == stashStateFilterNotes && numDocs == 0 { h = append(h, "enter/esc: cancel") - } else if m.state == stashStateSearchNotes { + } else if m.state == stashStateFilterNotes { h = append(h, "enter: confirm", "esc: cancel", "ctrl+j/ctrl+k, ↑/↓: choose") } else { if len(m.markdowns) > 0 { h = append(h, "enter: open") } if m.state == stashStateShowFiltered { - h = append(h, "esc: clear search") + h = append(h, "esc: clear filter") } if len(m.markdowns) > 1 { h = append(h, "j/k, ↑/↓: choose") @@ -971,7 +971,7 @@ func stashHelpView(m stashModel) string { if m.err != nil { h = append(h, "!: errors") } - h = append(h, "/: search") + h = append(h, "/: filter") h = append(h, "q: quit") } return stashHelpViewBuilder(m.terminalWidth, h...) diff --git a/ui/stashitem.go b/ui/stashitem.go index f211756..2a8ba7a 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -41,14 +41,14 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { } isSelected := index == m.index - notSearchingNotes := m.state != stashStateSearchNotes + notFilteringNotes := m.state != stashStateFilterNotes // If there are multiple items being filtered we don't highlight a selected // item in the results. If we've filtered down to one item, however, // highlight that first item since pressing return will open it. - singleFilteredItem := m.state == stashStateSearchNotes && len(m.getNotes()) == 1 + singleFilteredItem := m.state == stashStateFilterNotes && len(m.getNotes()) == 1 - if isSelected && notSearchingNotes || singleFilteredItem { + if isSelected && notFilteringNotes || singleFilteredItem { // Selected item switch m.state { @@ -73,14 +73,14 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { if md.markdownType == newsMarkdown { gutter = " " - if m.state == stashStateSearchNotes && m.searchInput.Value() == "" { + if m.state == stashStateFilterNotes && m.filterInput.Value() == "" { title = dimIndigoFg(title) date = dimSubtleIndigoFg(date) } else { title = indigoFg(title) date = subtleIndigoFg(date) } - } else if m.state == stashStateSearchNotes && m.searchInput.Value() == "" { + } else if m.state == stashStateFilterNotes && m.filterInput.Value() == "" { icon = dimGreenFg(icon) if title == noMemoTitle { title = dimWarmGrayFg(title) diff --git a/ui/ui.go b/ui/ui.go index 826e024..fe37f08 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -159,7 +159,7 @@ func (m *model) unloadDocument() []tea.Cmd { m.pager.unload() m.pager.showHelp = false - if m.stash.searchInput.Value() == "" { + if m.stash.filterInput.Value() == "" { m.stash.state = stashStateReady } else { m.stash.state = stashStateShowFiltered @@ -248,7 +248,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Send q/esc through in these cases case stashStateSettingNote, stashStatePromptDelete, - stashStateShowingError, stashStateSearchNotes, + stashStateShowingError, stashStateFilterNotes, stashStateShowFiltered: // If we're fitering, only send esc through so we can clear From 43a5ac1b64d9cf27e3d38f86dec372772e9a0592 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 13 Nov 2020 18:34:59 -0500 Subject: [PATCH 578/911] Highlight relevant characters in filter results --- ui/stashitem.go | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/ui/stashitem.go b/ui/stashitem.go index 2a8ba7a..ea1c09c 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -3,8 +3,11 @@ package ui import ( "fmt" "strings" + "unicode" + "github.com/charmbracelet/charm/ui/common" rw "github.com/mattn/go-runewidth" + "github.com/muesli/termenv" ) const ( @@ -65,7 +68,12 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { default: gutter = dullFuchsiaFg(verticalLine) icon = dullFuchsiaFg(icon) - title = fuchsiaFg(title) + if singleFilteredItem { + s := termenv.Style{}.Foreground(common.Fuschia.Color()) + title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) + } else { + title = fuchsiaFg(title) + } date = dullFuchsiaFg(date) } } else { @@ -73,11 +81,13 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { if md.markdownType == newsMarkdown { gutter = " " + if m.state == stashStateFilterNotes && m.filterInput.Value() == "" { title = dimIndigoFg(title) date = dimSubtleIndigoFg(date) } else { - title = indigoFg(title) + s := termenv.Style{}.Foreground(common.Indigo.Color()) + title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) date = subtleIndigoFg(date) } } else if m.state == stashStateFilterNotes && m.filterInput.Value() == "" { @@ -91,11 +101,13 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { date = dimWarmGrayFg(date) } else { + icon = greenFg(icon) if title == noMemoTitle { title = warmGrayFg(title) } else { - title = normalFg(title) + s := termenv.Style{}.Foreground(common.NewColorPair("#dddddd", "#1a1a1a").Color()) + title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) } gutter = " " date = warmGrayFg(date) @@ -106,3 +118,20 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { fmt.Fprintf(b, "%s %s%s\n", gutter, icon, title) fmt.Fprintf(b, "%s %s", gutter, date) } + +func styleFilteredText(haystack, needles string, defaultStyle, matchedStyle termenv.Style) string { + b := strings.Builder{} + n := []rune(needles) + j := 0 + + for _, h := range []rune(haystack) { + if j < len(n) && unicode.ToLower(h) == unicode.ToLower(n[j]) { + b.WriteString(matchedStyle.Styled(string(h))) + j++ + continue + } + b.WriteString(defaultStyle.Styled(string(h))) + } + + return b.String() +} From d98e3c11bacd2a50fd6d1ba43b05f008d14913d9 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Mon, 16 Nov 2020 21:25:23 +0100 Subject: [PATCH 579/911] Switch to `sahilm/fuzzy` for fuzzy-filtering and text highlighting --- go.mod | 3 ++- go.sum | 6 ++++-- ui/stash.go | 6 +++--- ui/stashitem.go | 26 +++++++++++++++++--------- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 2f8c1cc..3edc76d 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/google/uuid v1.1.2 // indirect - github.com/lithammer/fuzzysearch v1.1.1 + github.com/kylelemons/godebug v1.1.0 // indirect github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.3.0 github.com/microcosm-cc/bluemonday v1.0.4 // indirect @@ -18,6 +18,7 @@ require ( github.com/muesli/go-app-paths v0.2.1 github.com/muesli/reflow v0.2.0 github.com/muesli/termenv v0.7.4 + github.com/sahilm/fuzzy v0.1.0 github.com/spf13/cobra v1.1.1 github.com/spf13/viper v1.7.0 golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 diff --git a/go.sum b/go.sum index eb18c1b..ed099fb 100644 --- a/go.sum +++ b/go.sum @@ -158,8 +158,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lithammer/fuzzysearch v1.1.1 h1:8F9OAV2xPuYblToVohjanztdnPjbtA0MLgMvDKQ0Z08= -github.com/lithammer/fuzzysearch v1.1.1/go.mod h1:H2bng+w5gsR7NlfIJM8ElGZI0sX6C/9uzGqicVXGU6c= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -239,6 +239,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= +github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= +github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= diff --git a/ui/stash.go b/ui/stash.go index 55802ab..71fd02c 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -17,10 +17,10 @@ import ( "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" "github.com/dustin/go-humanize" - "github.com/lithammer/fuzzysearch/fuzzy" runewidth "github.com/mattn/go-runewidth" "github.com/muesli/reflow/ansi" te "github.com/muesli/termenv" + "github.com/sahilm/fuzzy" ) const ( @@ -243,12 +243,12 @@ func (m *stashModel) getNotes() []*markdown { targets = append(targets, note) } - ranks := fuzzy.RankFindFold(m.filterInput.Value(), targets) + ranks := fuzzy.Find(m.filterInput.Value(), targets) sort.Sort(ranks) filtered := []*markdown{} for _, r := range ranks { - filtered = append(filtered, m.markdowns[r.OriginalIndex]) + filtered = append(filtered, m.markdowns[r.Index]) } return filtered diff --git a/ui/stashitem.go b/ui/stashitem.go index ea1c09c..9200c85 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -3,11 +3,11 @@ package ui import ( "fmt" "strings" - "unicode" "github.com/charmbracelet/charm/ui/common" rw "github.com/mattn/go-runewidth" "github.com/muesli/termenv" + "github.com/sahilm/fuzzy" ) const ( @@ -121,16 +121,24 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { func styleFilteredText(haystack, needles string, defaultStyle, matchedStyle termenv.Style) string { b := strings.Builder{} - n := []rune(needles) - j := 0 - for _, h := range []rune(haystack) { - if j < len(n) && unicode.ToLower(h) == unicode.ToLower(n[j]) { - b.WriteString(matchedStyle.Styled(string(h))) - j++ - continue + matches := fuzzy.Find(needles, []string{haystack}) + if len(matches) == 0 { + return defaultStyle.Styled(haystack) + } + + m := matches[0] // only one match exists + for i, rune := range haystack { + styled := false + for _, mi := range m.MatchedIndexes { + if i == mi { + b.WriteString(matchedStyle.Styled(string(rune))) + styled = true + } + } + if !styled { + b.WriteString(defaultStyle.Styled(string(rune))) } - b.WriteString(defaultStyle.Styled(string(h))) } return b.String() From 58eca2414aeb626b52c909e4ae445a4cac662e32 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 16 Nov 2020 18:32:14 -0500 Subject: [PATCH 580/911] Match documents which were stashed in-session then renamed Note that we've also removed field `displayPath` from struct `markdown` as it turned out to not be necssary in the first place. --- ui/markdown.go | 1 - ui/stash.go | 10 ++++------ ui/ui.go | 16 ++++++++++------ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/ui/markdown.go b/ui/markdown.go index f8ca91c..9f924bf 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -21,7 +21,6 @@ const ( type markdown struct { markdownType markdownType localPath string // only relevant to local files and converted files that are newly stashed - displayPath string // what we show in the note field charm.Markdown } diff --git a/ui/stash.go b/ui/stash.go index 71fd02c..2325ac6 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -68,6 +68,7 @@ const ( type stashModel struct { cc *charm.Client cfg *Config + cwd string authStatus authStatus state stashState err error @@ -231,13 +232,10 @@ func (m *stashModel) getNotes() []*markdown { for _, t := range m.markdowns { note := "" - switch t.markdownType { - case newsMarkdown: + if t.markdownType == newsMarkdown { note = "News: " + t.Note - case stashedMarkdown: + } else { note = t.Note - default: - note = t.displayPath } targets = append(targets, note) @@ -624,7 +622,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // If document was stashed during this session, convert it // back to a local file. md.markdownType = localMarkdown - md.Note = m.markdowns[i].displayPath + md.Note = stripAbsolutePath(m.markdowns[i].localPath, m.cwd) } else { // Delete optimistically and remove the stashed item // before we've received a success response. diff --git a/ui/ui.go b/ui/ui.go index fe37f08..b8a83c8 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -317,6 +317,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case initLocalFileSearchMsg: m.localFileFinder = msg.ch m.cwd = msg.cwd + m.stash.cwd = msg.cwd cmds = append(cmds, findNextLocalFile(m)) case foundLocalFileMsg: @@ -379,7 +380,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.state = stateShowDocument case noteSavedMsg: - // A note was saved to a document. This will have be done in the + // A note was saved to a document. This will have been done in the // pager, so we'll need to find the corresponding note in the stash. // So, pass the message to the stash for processing. stashModel, cmd := stashUpdate(msg, m.stash) @@ -665,16 +666,19 @@ func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { md := &markdown{ markdownType: localMarkdown, localPath: res.Path, - displayPath: strings.Replace(res.Path, cwd+string(os.PathSeparator), "", -1), // strip absolute path - Markdown: charm.Markdown{}, + Markdown: charm.Markdown{ + Note: stripAbsolutePath(res.Path, cwd), + CreatedAt: res.Info.ModTime(), + }, } - md.Markdown.Note = md.displayPath - md.CreatedAt = res.Info.ModTime() // last modified time - return md } +func stripAbsolutePath(fullPath, cwd string) string { + return strings.Replace(fullPath, cwd+string(os.PathSeparator), "", -1) +} + // Lightweight version of reflow's indent function. func indent(s string, n int) string { if n <= 0 || s == "" { From 6cf1152f87126a706faad7ccd74f57afaebefc00 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 16 Nov 2020 20:03:49 -0500 Subject: [PATCH 581/911] Also highlight filtered characters on selected filter results --- ui/stashitem.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/stashitem.go b/ui/stashitem.go index 9200c85..0f15b3c 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -44,14 +44,14 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { } isSelected := index == m.index - notFilteringNotes := m.state != stashStateFilterNotes + isFilteringNotes := m.state == stashStateFilterNotes // If there are multiple items being filtered we don't highlight a selected // item in the results. If we've filtered down to one item, however, // highlight that first item since pressing return will open it. singleFilteredItem := m.state == stashStateFilterNotes && len(m.getNotes()) == 1 - if isSelected && notFilteringNotes || singleFilteredItem { + if isSelected && !isFilteringNotes || singleFilteredItem { // Selected item switch m.state { @@ -68,7 +68,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { default: gutter = dullFuchsiaFg(verticalLine) icon = dullFuchsiaFg(icon) - if singleFilteredItem { + if m.state == stashStateShowFiltered || singleFilteredItem { s := termenv.Style{}.Foreground(common.Fuschia.Color()) title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) } else { @@ -82,7 +82,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { if md.markdownType == newsMarkdown { gutter = " " - if m.state == stashStateFilterNotes && m.filterInput.Value() == "" { + if isFilteringNotes && m.filterInput.Value() == "" { title = dimIndigoFg(title) date = dimSubtleIndigoFg(date) } else { @@ -90,7 +90,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) date = subtleIndigoFg(date) } - } else if m.state == stashStateFilterNotes && m.filterInput.Value() == "" { + } else if isFilteringNotes && m.filterInput.Value() == "" { icon = dimGreenFg(icon) if title == noMemoTitle { title = dimWarmGrayFg(title) From de09997fdb18c0314a55099a2d4f2d7285ffa643 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 16 Nov 2020 21:17:11 -0500 Subject: [PATCH 582/911] Normalize strings during filtering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes it easier to match characters with diacritics (i.e. you can type 'o' and match an 'ö'). --- go.mod | 1 + ui/stash.go | 28 ++++++++++++++++++++++++---- ui/stashitem.go | 10 ++++++++-- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 3edc76d..a2e7086 100644 --- a/go.mod +++ b/go.mod @@ -24,4 +24,5 @@ require ( golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a + golang.org/x/text v0.3.2 ) diff --git a/ui/stash.go b/ui/stash.go index 2325ac6..f59df57 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -9,6 +9,7 @@ import ( "sort" "strings" "time" + "unicode" "github.com/charmbracelet/bubbles/paginator" "github.com/charmbracelet/bubbles/spinner" @@ -21,6 +22,8 @@ import ( "github.com/muesli/reflow/ansi" te "github.com/muesli/termenv" "github.com/sahilm/fuzzy" + "golang.org/x/text/transform" + "golang.org/x/text/unicode/norm" ) const ( @@ -231,13 +234,16 @@ func (m *stashModel) getNotes() []*markdown { targets := []string{} for _, t := range m.markdowns { - note := "" - if t.markdownType == newsMarkdown { - note = "News: " + t.Note - } else { + note, err := normalize(t.Note) + if err != nil && debug { + log.Printf("error normalizing '%s': %v", t.Note, err) note = t.Note } + if t.markdownType == newsMarkdown { + note = "News: " + note + } + targets = append(targets, note) } @@ -1081,6 +1087,20 @@ func deleteStashedItem(cc *charm.Client, id int) tea.Cmd { // ETC +// Normalize text to aid in the filtering process. in particular, we remove +// diacritics. +func normalize(in string) (string, error) { + t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC) + out, _, err := transform.String(t, in) + return out, err +} + +// Returns whether a given rune is a nonspacing mark (Mn is the key for +// nonspacing marks) +func isMn(r rune) bool { + return unicode.Is(unicode.Mn, r) +} + // wrapMarkdowns wraps a *charm.Markdown with a *markdown in order to add some // extra metadata. func wrapMarkdowns(t markdownType, md []*charm.Markdown) (m []*markdown) { diff --git a/ui/stashitem.go b/ui/stashitem.go index 0f15b3c..f74ed17 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -2,6 +2,7 @@ package ui import ( "fmt" + "log" "strings" "github.com/charmbracelet/charm/ui/common" @@ -122,13 +123,18 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { func styleFilteredText(haystack, needles string, defaultStyle, matchedStyle termenv.Style) string { b := strings.Builder{} - matches := fuzzy.Find(needles, []string{haystack}) + normalizedHay, err := normalize(haystack) + if err != nil && debug { + log.Printf("error normalizing '%s': %v", haystack, err) + } + + matches := fuzzy.Find(needles, []string{normalizedHay}) if len(matches) == 0 { return defaultStyle.Styled(haystack) } m := matches[0] // only one match exists - for i, rune := range haystack { + for i, rune := range []rune(haystack) { styled := false for _, mi := range m.MatchedIndexes { if i == mi { From ae4c85e97d4b10350ca52e2ebff14d6982c2c633 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 17 Nov 2020 10:27:57 -0500 Subject: [PATCH 583/911] Maintain positions when renaming documents in a filtered listing --- ui/markdown.go | 11 ++++++++++- ui/stash.go | 29 ++++++++++++++++++----------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/ui/markdown.go b/ui/markdown.go index 9f924bf..1e7e33d 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -20,7 +20,16 @@ const ( // markdown wraps charm.Markdown. type markdown struct { markdownType markdownType - localPath string // only relevant to local files and converted files that are newly stashed + + // Full path of a local markdown file. Only relevant to local documents and + // those that have been stashed in this session. + localPath string + + // Value we filter against. This exists so that we can maintain positions + // of filtered items if notes are edited while a filter is active. This + // field is ephemeral, and should only be referenced during filtering. + filterValue string + charm.Markdown } diff --git a/ui/stash.go b/ui/stash.go index f59df57..3f7c615 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -234,17 +234,7 @@ func (m *stashModel) getNotes() []*markdown { targets := []string{} for _, t := range m.markdowns { - note, err := normalize(t.Note) - if err != nil && debug { - log.Printf("error normalizing '%s': %v", t.Note, err) - note = t.Note - } - - if t.markdownType == newsMarkdown { - note = "News: " + note - } - - targets = append(targets, note) + targets = append(targets, t.filterValue) } ranks := fuzzy.Find(m.filterInput.Value(), targets) @@ -494,6 +484,23 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case "/": m.hideStatusMessage() + // Build values we'll filter against + for _, md := range m.markdowns { + note, err := normalize(md.Note) + if err != nil { + if debug { + log.Printf("error normalizing '%s': %v", md.Note, err) + } + md.filterValue = md.Note + continue + } + if md.markdownType == newsMarkdown { + md.filterValue = "News: " + note + continue + } + md.filterValue = note + } + m.paginator.Page = 0 m.index = 0 m.state = stashStateFilterNotes From 4e6460682ef31f9fc8d282c3d12048c373329b92 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 17 Nov 2020 17:37:52 -0500 Subject: [PATCH 584/911] Consolidate common model properties to reduce duplication --- ui/ignore_darwin.go | 4 +-- ui/ignore_general.go | 2 +- ui/pager.go | 55 +++++++++++++---------------- ui/stash.go | 52 ++++++++++++--------------- ui/stashitem.go | 2 +- ui/ui.go | 83 ++++++++++++++++++++++---------------------- 6 files changed, 93 insertions(+), 105 deletions(-) diff --git a/ui/ignore_darwin.go b/ui/ignore_darwin.go index 51cdac3..6a0b4ef 100644 --- a/ui/ignore_darwin.go +++ b/ui/ignore_darwin.go @@ -6,8 +6,8 @@ import "path/filepath" func ignorePatterns(m model) []string { return []string{ - filepath.Join(m.cfg.HomeDir, "Library"), - m.cfg.Gopath, + filepath.Join(m.general.cfg.HomeDir, "Library"), + m.general.cfg.Gopath, "node_modules", ".*", } diff --git a/ui/ignore_general.go b/ui/ignore_general.go index 7f1da74..838cea7 100644 --- a/ui/ignore_general.go +++ b/ui/ignore_general.go @@ -4,7 +4,7 @@ package ui func ignorePatterns(m model) []string { return []string{ - m.cfg.Gopath, + m.general.cfg.Gopath, "node_modules", ".*", } diff --git a/ui/pager.go b/ui/pager.go index 0141b1c..bef151f 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -65,16 +65,12 @@ const ( ) type pagerModel struct { - cfg *Config - cc *charm.Client - authStatus authStatus - viewport viewport.Model - state pagerState - width int - height int - showHelp bool - textInput textinput.Model - spinner spinner.Model + general *general + viewport viewport.Model + state pagerState + showHelp bool + textInput textinput.Model + spinner spinner.Model statusMessage string statusMessageTimer *time.Timer @@ -88,7 +84,7 @@ type pagerModel struct { stashedDocument *markdown } -func newPagerModel(cfg *Config, as authStatus) pagerModel { +func newPagerModel(general *general) pagerModel { // Init viewport vp := viewport.Model{} vp.YPosition = 0 @@ -114,18 +110,15 @@ func newPagerModel(cfg *Config, as authStatus) pagerModel { sp.MinimumLifetime = time.Millisecond * 180 return pagerModel{ - cfg: cfg, - state: pagerStateBrowse, - authStatus: as, - textInput: ti, - viewport: vp, - spinner: sp, + general: general, + state: pagerStateBrowse, + textInput: ti, + viewport: vp, + spinner: sp, } } func (m *pagerModel) setSize(w, h int) { - m.width = w - m.height = h m.viewport.Width = w m.viewport.Height = h - statusBarHeight m.textInput.Width = w - @@ -146,7 +139,7 @@ func (m *pagerModel) setContent(s string) { func (m *pagerModel) toggleHelp() { m.showHelp = !m.showHelp - m.setSize(m.width, m.height) + m.setSize(m.general.width, m.general.height) if m.viewport.PastBottom() { m.viewport.GotoBottom() } @@ -198,7 +191,7 @@ func (m pagerModel) Update(msg tea.Msg) (pagerModel, tea.Cmd) { var cmd tea.Cmd if m.textInput.Value() != m.currentDocument.Note { // don't update if the note didn't change m.currentDocument.Note = m.textInput.Value() // update optimistically - cmd = saveDocumentNote(m.cc, m.currentDocument.ID, m.currentDocument.Note) + cmd = saveDocumentNote(m.general.cc, m.currentDocument.ID, m.currentDocument.Note) } m.state = pagerStateBrowse m.textInput.Reset() @@ -246,7 +239,7 @@ func (m pagerModel) Update(msg tea.Msg) (pagerModel, tea.Cmd) { return m, textinput.Blink case "s": - if m.authStatus != authOK { + if m.general.authStatus != authOK { break } @@ -256,7 +249,7 @@ func (m pagerModel) Update(msg tea.Msg) (pagerModel, tea.Cmd) { m.spinner.Start() cmds = append( cmds, - stashDocument(m.cc, m.currentDocument), + stashDocument(m.general.cc, m.currentDocument), spinner.Tick, ) } @@ -402,7 +395,7 @@ func (m pagerModel) statusBarView(b *strings.Builder) { } } note = truncate(" "+note+" ", max(0, - m.width- + m.general.width- ansi.PrintableRuneWidth(logo)- ansi.PrintableRuneWidth(statusIndicator)- ansi.PrintableRuneWidth(scrollPercent)- @@ -416,7 +409,7 @@ func (m pagerModel) statusBarView(b *strings.Builder) { // Empty space padding := max(0, - m.width- + m.general.width- ansi.PrintableRuneWidth(logo)- ansi.PrintableRuneWidth(statusIndicator)- ansi.PrintableRuneWidth(note)- @@ -447,7 +440,7 @@ func (m pagerModel) setNoteView(b *strings.Builder) { func (m pagerModel) helpView() (s string) { memoOrStash := "m set memo" - if m.authStatus == authOK && m.currentDocument.markdownType == localMarkdown { + if m.general.authStatus == authOK && m.currentDocument.markdownType == localMarkdown { memoOrStash = "s stash this document" } @@ -479,11 +472,11 @@ func (m pagerModel) helpView() (s string) { s = indent(s, 2) // Fill up empty cells with spaces for background coloring - if m.width > 0 { + if m.general.width > 0 { lines := strings.Split(s, "\n") for i := 0; i < len(lines); i++ { l := runewidth.StringWidth(lines[i]) - n := max(m.width-l, 0) + n := max(m.general.width-l, 0) lines[i] += strings.Repeat(" ", n) } @@ -516,13 +509,13 @@ func glamourRender(m pagerModel, markdown string) (string, error) { // initialize glamour var gs glamour.TermRendererOption - if m.cfg.GlamourStyle == "auto" { + if m.general.cfg.GlamourStyle == "auto" { gs = glamour.WithAutoStyle() } else { - gs = glamour.WithStylePath(m.cfg.GlamourStyle) + gs = glamour.WithStylePath(m.general.cfg.GlamourStyle) } - width := max(0, min(int(m.cfg.GlamourMaxWidth), m.viewport.Width)) + width := max(0, min(int(m.general.cfg.GlamourMaxWidth), m.viewport.Width)) r, err := glamour.NewTermRenderer( gs, glamour.WithWordWrap(width), diff --git a/ui/stash.go b/ui/stash.go index 3f7c615..724d550 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -69,18 +69,13 @@ const ( ) type stashModel struct { - cc *charm.Client - cfg *Config - cwd string - authStatus authStatus + general *general state stashState err error markdowns []*markdown spinner spinner.Model noteInput textinput.Model filterInput textinput.Model - terminalWidth int - terminalHeight int stashFullyLoaded bool // have we loaded all available stashed documents from the server? loadingFromNetwork bool // are we currently loading something from the network? loaded DocumentType // load status for news, stash and local files loading; we find out exactly with bitmasking @@ -110,33 +105,33 @@ type stashModel struct { } func (m stashModel) localOnly() bool { - return m.cfg.DocumentTypes == LocalDocuments + return m.general.cfg.DocumentTypes == LocalDocuments } func (m stashModel) stashedOnly() bool { - return m.cfg.DocumentTypes&LocalDocuments == 0 + return m.general.cfg.DocumentTypes&LocalDocuments == 0 } func (m stashModel) loadingDone() bool { // Do the types loaded match the types we want to have? - return m.loaded == m.cfg.DocumentTypes + return m.loaded == m.general.cfg.DocumentTypes } func (m *stashModel) setSize(width, height int) { - m.terminalWidth = width - m.terminalHeight = height + m.general.width = width + m.general.height = height // Update the paginator m.setTotalPages() - m.noteInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.noteInput.Prompt) - m.filterInput.Width = m.terminalWidth - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.filterInput.Prompt) + m.noteInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.noteInput.Prompt) + m.filterInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.filterInput.Prompt) } // Sets the total paginator pages according to the amount of markdowns for the // current state. func (m *stashModel) setTotalPages() { - m.paginator.PerPage = max(1, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)/stashViewItemHeight) + m.paginator.PerPage = max(1, (m.general.height-stashViewTopPadding-stashViewBottomPadding)/stashViewItemHeight) if pages := len(m.getNotes()); pages < 1 { m.paginator.SetTotalPages(1) @@ -298,7 +293,7 @@ func (m *stashModel) moveCursorDown() { // INIT -func newStashModel(cfg *Config, as authStatus) stashModel { +func newStashModel(general *general) stashModel { sp := spinner.NewModel() sp.Spinner = spinner.Line sp.ForegroundColor = common.SpinnerColor.String() @@ -323,8 +318,7 @@ func newStashModel(cfg *Config, as authStatus) stashModel { si.Focus() m := stashModel{ - cfg: cfg, - authStatus: as, + general: general, spinner: sp, noteInput: ni, filterInput: si, @@ -475,7 +469,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { if md.markdownType == localMarkdown { cmds = append(cmds, loadLocalMarkdown(md)) } else { - cmds = append(cmds, loadRemoteMarkdown(m.cc, md.ID, md.markdownType)) + cmds = append(cmds, loadRemoteMarkdown(m.general.cc, md.ID, md.markdownType)) } cmds = append(cmds, spinner.Tick) @@ -530,7 +524,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Stash case "s": - if pages == 0 || m.authStatus != authOK || m.selectedMarkdown() == nil { + if pages == 0 || m.general.authStatus != authOK || m.selectedMarkdown() == nil { break } @@ -553,7 +547,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Checks passed; perform the stash m.filesStashing[md.localPath] = struct{}{} - cmds = append(cmds, stashDocument(m.cc, *md)) + cmds = append(cmds, stashDocument(m.general.cc, *md)) if m.loadingDone() && !m.spinner.Visible() { m.spinner.Start() @@ -635,7 +629,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // If document was stashed during this session, convert it // back to a local file. md.markdownType = localMarkdown - md.Note = stripAbsolutePath(m.markdowns[i].localPath, m.cwd) + md.Note = stripAbsolutePath(m.markdowns[i].localPath, m.general.cwd) } else { // Delete optimistically and remove the stashed item // before we've received a success response. @@ -651,7 +645,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Update pagination m.setTotalPages() - return m, deleteStashedItem(m.cc, smd.ID) + return m, deleteStashedItem(m.general.cc, smd.ID) default: m.state = stashStateReady @@ -729,7 +723,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Set new note md := m.selectedMarkdown() newNote := m.noteInput.Value() - cmd := saveDocumentNote(m.cc, md.ID, newNote) + cmd := saveDocumentNote(m.general.cc, md.ID, newNote) md.Note = newNote m.noteInput.Reset() m.state = stashStateReady @@ -775,7 +769,7 @@ func stashView(m stashModel) string { // We need to fill any empty height with newlines so the footer reaches // the bottom. - numBlankLines := max(0, (m.terminalHeight-stashViewTopPadding-stashViewBottomPadding)%stashViewItemHeight) + numBlankLines := max(0, (m.general.height-stashViewTopPadding-stashViewBottomPadding)%stashViewItemHeight) blankLines := "" if numBlankLines > 0 { blankLines = strings.Repeat("\n", numBlankLines) @@ -812,7 +806,7 @@ func stashView(m stashModel) string { // If the dot pagination is wider than the width of the window // switch to the arabic paginator. - if ansi.PrintableRuneWidth(pagination) > m.terminalWidth-stashViewHorizontalPadding { + if ansi.PrintableRuneWidth(pagination) > m.general.width-stashViewHorizontalPadding { m.paginator.Type = paginator.Arabic pagination = common.Subtle(m.paginator.View()) } @@ -848,12 +842,12 @@ func stashHeaderView(m stashModel) string { loading := !m.loadingDone() noMarkdowns := len(m.markdowns) == 0 - if m.authStatus == authFailed && m.stashedOnly() { + if m.general.authStatus == authFailed && m.stashedOnly() { return common.Subtle("Can’t load stash. Are you offline?") } var maybeOffline string - if m.authStatus == authFailed { + if m.general.authStatus == authFailed { maybeOffline = " " + offlineHeaderNote } @@ -976,7 +970,7 @@ func stashHelpView(m stashModel) string { } if isStashed { h = append(h, "x: delete", "m: set memo") - } else if isLocal && m.authStatus == authOK { + } else if isLocal && m.general.authStatus == authOK { h = append(h, "s: stash") } if m.err != nil { @@ -985,7 +979,7 @@ func stashHelpView(m stashModel) string { h = append(h, "/: filter") h = append(h, "q: quit") } - return stashHelpViewBuilder(m.terminalWidth, h...) + return stashHelpViewBuilder(m.general.width, h...) } // builds the help view from various sections pieces, truncating it if the view diff --git a/ui/stashitem.go b/ui/stashitem.go index f74ed17..8c26fee 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -20,7 +20,7 @@ const ( func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { var ( - truncateTo = m.terminalWidth - stashViewHorizontalPadding*2 + truncateTo = m.general.width - stashViewHorizontalPadding*2 gutter string title = md.Note date = relativeTime(md.CreatedAt) diff --git a/ui/ui.go b/ui/ui.go index b8a83c8..683dff2 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -134,18 +134,25 @@ const ( keygenFinished ) +// General stuff we'll need to access in all models +type general struct { + cfg Config + cc *charm.Client + cwd string + authStatus authStatus + width int + height int +} + type model struct { - cfg *Config - cc *charm.Client - authStatus authStatus - keygenState keygenState - state state - fatalErr error - stash stashModel - pager pagerModel - terminalWidth int - terminalHeight int - cwd string // directory from which we're running Glow + general *general + keygenState keygenState + state state + fatalErr error + + // Sub-models + stash stashModel + pager pagerModel // Channel that receives paths to local markdown files // (via the github.com/muesli/gitcha package) @@ -176,12 +183,6 @@ func (m *model) unloadDocument() []tea.Cmd { return batch } -func (m *model) setAuthStatus(as authStatus) { - m.authStatus = as - m.stash.authStatus = as - m.pager.authStatus = as -} - func newModel(cfg Config) tea.Model { if cfg.GlamourStyle == "auto" { dbg := te.HasDarkBackground() @@ -196,28 +197,31 @@ func newModel(cfg Config) tea.Model { cfg.DocumentTypes = LocalDocuments | StashedDocuments | NewsDocuments } - as := authConnecting + general := general{ + cfg: cfg, + authStatus: authConnecting, + } + return model{ - cfg: &cfg, + general: &general, state: stateShowStash, - authStatus: as, keygenState: keygenUnstarted, - pager: newPagerModel(&cfg, as), - stash: newStashModel(&cfg, as), + pager: newPagerModel(&general), + stash: newStashModel(&general), } } func (m model) Init() tea.Cmd { var cmds []tea.Cmd - if m.cfg.DocumentTypes&StashedDocuments != 0 || m.cfg.DocumentTypes&NewsDocuments != 0 { + if m.general.cfg.DocumentTypes&StashedDocuments != 0 || m.general.cfg.DocumentTypes&NewsDocuments != 0 { cmds = append(cmds, newCharmClient, spinner.Tick, ) } - if m.cfg.DocumentTypes&LocalDocuments != 0 { + if m.general.cfg.DocumentTypes&LocalDocuments != 0 { cmds = append(cmds, findLocalFiles(m)) } @@ -306,8 +310,8 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Window size is received when starting up and on every resize case tea.WindowSizeMsg: - m.terminalWidth = msg.Width - m.terminalHeight = msg.Height + m.general.width = msg.Width + m.general.height = msg.Height m.stash.setSize(msg.Width, msg.Height) m.pager.setSize(msg.Width, msg.Height) @@ -316,12 +320,11 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case initLocalFileSearchMsg: m.localFileFinder = msg.ch - m.cwd = msg.cwd - m.stash.cwd = msg.cwd + m.general.cwd = msg.cwd cmds = append(cmds, findNextLocalFile(m)) case foundLocalFileMsg: - newMd := localFileToMarkdown(m.cwd, gitcha.SearchResult(msg)) + newMd := localFileToMarkdown(m.general.cwd, gitcha.SearchResult(msg)) m.stash.addMarkdowns(newMd) cmds = append(cmds, findNextLocalFile(m)) @@ -331,7 +334,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmds = append(cmds, generateSSHKeys) } else { // The keygen ran but things still didn't work and we can't auth - m.setAuthStatus(authFailed) + m.general.authStatus = authFailed m.stash.err = errors.New("SSH authentication failed; we tried ssh-agent, loading keys from disk, and generating SSH keys") if debug { log.Println("entering offline mode;", m.stash.err) @@ -344,7 +347,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case keygenFailedMsg: // Keygen failed. That sucks. - m.setAuthStatus(authFailed) + m.general.authStatus = authFailed m.stash.err = errors.New("could not authenticate; could not generate SSH keys") if debug { log.Println("entering offline mode;", m.stash.err) @@ -362,14 +365,12 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmds = append(cmds, newCharmClient) case newCharmClientMsg: - m.cc = msg - m.setAuthStatus(authOK) - m.stash.cc = msg - m.pager.cc = msg + m.general.cc = msg + m.general.authStatus = authOK cmds = append(cmds, loadStash(m.stash), loadNews(m.stash)) case stashLoadErrMsg: - m.setAuthStatus(authFailed) + m.general.authStatus = authFailed case fetchedMarkdownMsg: m.pager.currentDocument = *msg @@ -465,7 +466,7 @@ func findLocalFiles(m model) tea.Cmd { } var ignore []string - if !m.cfg.ShowAllFiles { + if !m.general.cfg.ShowAllFiles { ignore = ignorePatterns(m) } @@ -521,14 +522,14 @@ func newCharmClient() tea.Msg { func loadStash(m stashModel) tea.Cmd { return func() tea.Msg { - if m.cc == nil { + if m.general.cc == nil { err := errors.New("no charm client") if debug { log.Println("error loading stash:", err) } return stashLoadErrMsg{err} } - stash, err := m.cc.GetStash(m.page) + stash, err := m.general.cc.GetStash(m.page) if err != nil { if debug { if _, ok := err.(charm.ErrAuthFailed); ok { @@ -545,14 +546,14 @@ func loadStash(m stashModel) tea.Cmd { func loadNews(m stashModel) tea.Cmd { return func() tea.Msg { - if m.cc == nil { + if m.general.cc == nil { err := errors.New("no charm client") if debug { log.Println("error loading news:", err) } return newsLoadErrMsg{err} } - news, err := m.cc.GetNews(1) // just fetch the first page + news, err := m.general.cc.GetNews(1) // just fetch the first page if err != nil { if debug { log.Println("error loading news:", err) From 929b1ed3b3d57cd6916610767d0efdf8a557d1a6 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 17 Nov 2020 18:37:11 -0500 Subject: [PATCH 585/911] Remove pointer reference from stashModel.getNotes() It's not altering the model, so removing the pointer reference to reflect that. --- ui/stash.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 724d550..13492ef 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -215,7 +215,7 @@ func (m stashModel) countMarkdowns(t markdownType) (found int) { // Returns the stashed markdown notes. When the model state indicates that // filtering is desired, this also filters and ranks the notes by the filter // term in the filterInput field. -func (m *stashModel) getNotes() []*markdown { +func (m stashModel) getNotes() []*markdown { if m.filterInput.Value() == "" { return m.markdowns } From 53b9c7ee627138dd7005c14df896bb37d3e425b5 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 17 Nov 2020 20:46:26 -0500 Subject: [PATCH 586/911] Open correct document when filtered down to one item --- ui/stash.go | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 13492ef..d96844b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -84,9 +84,9 @@ type stashModel struct { // value portion with an empty struct. filesStashing map[string]struct{} - // This is just the index of the current page in view. To get the index - // of the selected item as it relates to the full set of documents we've - // fetched use the mardownIndex() method of this struct. + // This is just the selected item in relation to the current page in view. + // To get the index of the selected item as it relates to the full set of + // documents we've fetched use the markdownIndex() method on this struct. index int // This handles the local pagination, which is different than the page @@ -212,6 +212,21 @@ func (m stashModel) countMarkdowns(t markdownType) (found int) { return } +// Command for opening a markdown document in the pager. Note that this also +// alters the model. +func (m *stashModel) openMarkdown(md *markdown) tea.Cmd { + var cmd tea.Cmd + m.state = stashStateLoadingDocument + + if md.markdownType == localMarkdown { + cmd = loadLocalMarkdown(md) + } else { + cmd = loadRemoteMarkdown(m.general.cc, md.ID, md.markdownType) + } + + return tea.Batch(cmd, spinner.Tick) +} + // Returns the stashed markdown notes. When the model state indicates that // filtering is desired, this also filters and ranks the notes by the filter // term in the filterInput field. @@ -281,7 +296,7 @@ func (m *stashModel) moveCursorDown() { return } - // during filtering the cursor position can exceed the number of + // During filtering the cursor position can exceed the number of // itemsOnPage. It's more intuitive to start the cursor at the // topmost position when moving it down in this scenario. if m.index > itemsOnPage { @@ -464,15 +479,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Load the document from the server. We'll handle the message // that comes back in the main update function. md := m.selectedMarkdown() - m.state = stashStateLoadingDocument - - if md.markdownType == localMarkdown { - cmds = append(cmds, loadLocalMarkdown(md)) - } else { - cmds = append(cmds, loadRemoteMarkdown(m.general.cc, md.ID, md.markdownType)) - } - - cmds = append(cmds, spinner.Tick) + cmds = append(cmds, m.openMarkdown(md)) // Filter your notes case "/": @@ -678,16 +685,12 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { break } - // When there's only one filtered markdown left and the cursor - // is placed on it we can diretly "enter" it and change to the - // markdown view - if len(h) == 1 && h[0].ID == m.selectedMarkdown().ID { + // When there's only one filtered markdown left we can just + // "open" it directly + if len(h) == 1 { m.state = stashStateReady m.filterInput.Reset() - - var cmd tea.Cmd - m, cmd = stashUpdate(msg, m) - cmds = append(cmds, cmd) + cmds = append(cmds, m.openMarkdown(h[0])) break } From 86e581c79ca7069b3884dd0d72a30f4ae3f90fd6 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 19 Nov 2020 22:26:31 -0500 Subject: [PATCH 587/911] Add matching stash/news documents to filter results as they're loaded --- ui/markdown.go | 18 ++++++++++++++++++ ui/stash.go | 41 ++++++++++++++++++++++++----------------- ui/ui.go | 1 + 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/ui/markdown.go b/ui/markdown.go index 1e7e33d..8e249c9 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -1,6 +1,7 @@ package ui import ( + "log" "strings" "github.com/charmbracelet/charm" @@ -33,6 +34,23 @@ type markdown struct { charm.Markdown } +func (m *markdown) buildFilterValue() { + note, err := normalize(m.Note) + if err != nil { + if debug { + log.Printf("error normalizing '%s': %v", m.Note, err) + } + m.filterValue = m.Note + } + + if m.markdownType == newsMarkdown { + m.filterValue = "News: " + note + return + } + + m.filterValue = note +} + // sortAsLocal returns whether or not this markdown should be sorted as though // it's a local markdown document. func (m markdown) sortAsLocal() bool { diff --git a/ui/stash.go b/ui/stash.go index d96844b..dcaf507 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -365,17 +365,17 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.err = msg.err m.loaded |= NewsDocuments // still done, albeit unsuccessfully - // We're finished searching for local files case localFileSearchFinished: + // We're finished searching for local files m.loaded |= LocalDocuments - // Stash results have come in from the server case gotStashMsg: + // Stash results have come in from the server. + // // This doesn't mean the whole stash listing is loaded, but some we've // finished checking for the stash, at least, so mark the stash as // loaded here. m.loaded |= StashedDocuments - m.loadingFromNetwork = false if len(msg) == 0 { @@ -383,14 +383,33 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.stashFullyLoaded = true } else { docs := wrapMarkdowns(stashedMarkdown, msg) + + // If we're filtering build filter indexes immediately so any + // matching results will show up in the filter. + if m.state == stashStateFilterNotes || m.state == stashStateShowFiltered { + for _, md := range docs { + md.buildFilterValue() + } + } + m.addMarkdowns(docs...) } - // News has come in from the server case gotNewsMsg: + // News has come in from the server m.loaded |= NewsDocuments + if len(msg) > 0 { docs := wrapMarkdowns(newsMarkdown, msg) + + // If we're filtering build filter indexes immediately so any + // matching results will show up in the filter. + if m.state == stashStateFilterNotes || m.state == stashStateShowFiltered { + for _, md := range docs { + md.buildFilterValue() + } + } + m.addMarkdowns(docs...) } @@ -487,19 +506,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Build values we'll filter against for _, md := range m.markdowns { - note, err := normalize(md.Note) - if err != nil { - if debug { - log.Printf("error normalizing '%s': %v", md.Note, err) - } - md.filterValue = md.Note - continue - } - if md.markdownType == newsMarkdown { - md.filterValue = "News: " + note - continue - } - md.filterValue = note + md.buildFilterValue() } m.paginator.Page = 0 diff --git a/ui/ui.go b/ui/ui.go index 683dff2..ce432b0 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -373,6 +373,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.general.authStatus = authFailed case fetchedMarkdownMsg: + // We've loaded a markdown file's contents for rendering m.pager.currentDocument = *msg msg.Body = string(utils.RemoveFrontmatter([]byte(msg.Body))) cmds = append(cmds, renderWithGlamour(m.pager, msg.Body)) From 5023d4a0be4b399f51e853fad87de70e5fef9b29 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 19 Nov 2020 22:45:02 -0500 Subject: [PATCH 588/911] Remove some code duplication with stash and news message handling --- ui/stash.go | 58 ++++++++++++++++++++++------------------------------- 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index dcaf507..c493089 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -369,50 +369,40 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // We're finished searching for local files m.loaded |= LocalDocuments - case gotStashMsg: - // Stash results have come in from the server. + case gotStashMsg, gotNewsMsg: + // Stash or news results have come in from the server. // - // This doesn't mean the whole stash listing is loaded, but some we've - // finished checking for the stash, at least, so mark the stash as - // loaded here. - m.loaded |= StashedDocuments - m.loadingFromNetwork = false + // With the stash, this doesn't mean the whole stash listing is loaded, + // but some we've finished checking for the stash, at least, so mark + // the stash as loaded here. + var docs []*markdown + + switch msg := msg.(type) { + case gotStashMsg: + m.loaded |= StashedDocuments + m.loadingFromNetwork = false + docs = wrapMarkdowns(stashedMarkdown, msg) - if len(msg) == 0 { // If the server comes back with nothing then we've got everything - m.stashFullyLoaded = true - } else { - docs := wrapMarkdowns(stashedMarkdown, msg) - - // If we're filtering build filter indexes immediately so any - // matching results will show up in the filter. - if m.state == stashStateFilterNotes || m.state == stashStateShowFiltered { - for _, md := range docs { - md.buildFilterValue() - } + if len(msg) == 0 { + m.stashFullyLoaded = true } - m.addMarkdowns(docs...) + case gotNewsMsg: + m.loaded |= NewsDocuments + docs = wrapMarkdowns(newsMarkdown, msg) } - case gotNewsMsg: - // News has come in from the server - m.loaded |= NewsDocuments - - if len(msg) > 0 { - docs := wrapMarkdowns(newsMarkdown, msg) - - // If we're filtering build filter indexes immediately so any - // matching results will show up in the filter. - if m.state == stashStateFilterNotes || m.state == stashStateShowFiltered { - for _, md := range docs { - md.buildFilterValue() - } + // If we're filtering build filter indexes immediately so any + // matching results will show up in the filter. + if m.state == stashStateFilterNotes || m.state == stashStateShowFiltered { + for _, md := range docs { + md.buildFilterValue() } - - m.addMarkdowns(docs...) } + m.addMarkdowns(docs...) + case spinner.TickMsg: condition := !m.loadingDone() || m.loadingFromNetwork || From c16a146c00340654e44ec2dcc061aa5ed6f4a1da Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 20 Nov 2020 12:57:03 -0500 Subject: [PATCH 589/911] Load the whole stash, page by page, automatically --- ui/stash.go | 7 ++++++- ui/ui.go | 3 --- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index c493089..a790460 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -383,9 +383,14 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.loadingFromNetwork = false docs = wrapMarkdowns(stashedMarkdown, msg) - // If the server comes back with nothing then we've got everything if len(msg) == 0 { + // If the server comes back with nothing then we've got + // everything m.stashFullyLoaded = true + } else { + // Load the next page + m.page++ + cmds = append(cmds, loadStash(m)) } case gotNewsMsg: diff --git a/ui/ui.go b/ui/ui.go index ce432b0..d690235 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -315,9 +315,6 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.stash.setSize(msg.Width, msg.Height) m.pager.setSize(msg.Width, msg.Height) - // TODO: load more stash pages if we've resized, are on the last page, - // and haven't loaded more pages yet. - case initLocalFileSearchMsg: m.localFileFinder = msg.ch m.general.cwd = msg.cwd From e9d728cd96ad3ba3a0986231afa70ff2c6162b64 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 20 Nov 2020 15:13:43 -0500 Subject: [PATCH 590/911] Add "hidden" command/config for switching on mouse wheel support See (#206) --- main.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index f540cfc..1584de0 100644 --- a/main.go +++ b/main.go @@ -36,6 +36,7 @@ var ( width uint showAllFiles bool localOnly bool + mouse bool rootCmd = &cobra.Command{ Use: "glow SOURCE", @@ -139,6 +140,7 @@ func validateOptions(cmd *cobra.Command) { style = viper.GetString("style") width = viper.GetUint("width") localOnly = viper.GetBool("local") + mouse = viper.GetBool("mouse") isTerminal := terminal.IsTerminal(int(os.Stdout.Fd())) // We want to use a special no-TTY style, when stdout is not a terminal @@ -287,11 +289,14 @@ func runTUI(stashedOnly bool) error { // Run Bubble Tea program p := ui.NewProgram(cfg) p.EnterAltScreen() + defer p.ExitAltScreen() + if mouse { + p.EnableMouseCellMotion() + defer p.DisableMouseCellMotion() + } if err := p.Start(); err != nil { return err } - p.ExitAltScreen() - p.DisableMouseCellMotion() // Exit message fmt.Printf("\n Thanks for using Glow!\n\n") @@ -324,11 +329,14 @@ func init() { rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") rootCmd.Flags().BoolVarP(&showAllFiles, "all", "a", false, "show system files and directories (TUI-mode only)") rootCmd.Flags().BoolVarP(&localOnly, "local", "l", false, "show local files only; no network (TUI-mode only)") + rootCmd.Flags().BoolVarP(&mouse, "mouse", "m", false, "enable mouse wheel (TUI-mode only)") + rootCmd.Flags().MarkHidden("mouse") // Config bindings _ = viper.BindPFlag("style", rootCmd.Flags().Lookup("style")) _ = viper.BindPFlag("width", rootCmd.Flags().Lookup("width")) _ = viper.BindPFlag("local", rootCmd.Flags().Lookup("local")) + _ = viper.BindPFlag("mouse", rootCmd.Flags().Lookup("mouse")) viper.SetDefault("style", "auto") viper.SetDefault("width", 0) viper.SetDefault("local", "false") From 56a9edd312f067c41f0457b09a4a20fa94867f90 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 23 Nov 2020 16:56:44 -0500 Subject: [PATCH 591/911] Filter markdowns asynchronously so filtering doesn't block --- ui/stash.go | 278 +++++++++++++++++++++++++++++++++--------------- ui/stashitem.go | 3 +- ui/ui.go | 24 +++-- 3 files changed, 209 insertions(+), 96 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index a790460..fd9e4f0 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -45,6 +45,7 @@ var ( type fetchedMarkdownMsg *markdown type deletedStashedItemMsg int +type filteredMarkdownMsg []*markdown // MODEL @@ -72,7 +73,6 @@ type stashModel struct { general *general state stashState err error - markdowns []*markdown spinner spinner.Model noteInput textinput.Model filterInput textinput.Model @@ -80,6 +80,14 @@ type stashModel struct { loadingFromNetwork bool // are we currently loading something from the network? loaded DocumentType // load status for news, stash and local files loading; we find out exactly with bitmasking + // The master set of markdown documents we're working with. + markdowns []*markdown + + // Markdown documents we're currently displaying. Filtering, toggles and so + // on will alter this slice so we can show what is relevant. For that + // reason, this field should be considered ephemeral. + filteredMarkdowns []*markdown + // Paths to files being stashed. We treat this like a set, ignoring the // value portion with an empty struct. filesStashing map[string]struct{} @@ -128,12 +136,38 @@ func (m *stashModel) setSize(width, height int) { m.filterInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.filterInput.Prompt) } +func (m *stashModel) resetFiltering() { + m.filterInput.Reset() + sort.Stable(markdownsByLocalFirst(m.markdowns)) + m.filteredMarkdowns = nil + m.setTotalPages() +} + +// Is a filter currently being applied? +func (m stashModel) isFiltering() bool { + switch m.state { + case stashStateFilterNotes, stashStateShowFiltered: + return true + case stashStatePromptDelete, stashStateSettingNote: + return m.filterInput.Value() != "" + default: + return false + } +} + +// Should we be updating the filter? +func (m stashModel) shouldUpdateFilter() bool { + // If we're in the middle of setting a note don't update the filter so that + // the focus won't jump around. + return m.isFiltering() && m.state != stashStateSettingNote +} + // Sets the total paginator pages according to the amount of markdowns for the // current state. func (m *stashModel) setTotalPages() { m.paginator.PerPage = max(1, (m.general.height-stashViewTopPadding-stashViewBottomPadding)/stashViewItemHeight) - if pages := len(m.getNotes()); pages < 1 { + if pages := len(m.getVisibleMarkdowns()); pages < 1 { m.paginator.SetTotalPages(1) } else { m.paginator.SetTotalPages(pages) @@ -153,38 +187,40 @@ func (m stashModel) markdownIndex() int { // Return the current selected markdown in the stash. func (m stashModel) selectedMarkdown() *markdown { i := m.markdownIndex() - markdowns := m.getNotes() - if i < 0 || len(markdowns) == 0 || len(markdowns) <= i { + mds := m.getVisibleMarkdowns() + if i < 0 || len(mds) == 0 || len(mds) <= i { return nil } - return markdowns[i] + return mds[i] } // Adds markdown documents to the model. func (m *stashModel) addMarkdowns(mds ...*markdown) { if len(mds) > 0 { m.markdowns = append(m.markdowns, mds...) - sort.Sort(markdownsByLocalFirst(m.markdowns)) + if !m.isFiltering() { + sort.Stable(markdownsByLocalFirst(m.markdowns)) + } m.setTotalPages() } } -// Find a local markdown by its path and remove it. -func (m *stashModel) removeLocalMarkdown(localPath string) error { - i := -1 +// Find a local markdown by its path and replace it +func (m *stashModel) replaceLocalMarkdown(localPath string, newMarkdown *markdown) error { + var found bool // Look for local markdown - for j, doc := range m.markdowns { - if doc.localPath == localPath { - i = j + for i, md := range m.markdowns { + if md.localPath == localPath { + m.markdowns[i] = newMarkdown + found = true break } } - // Did we find it? - if i == -1 { + if !found { err := fmt.Errorf("could't find local markdown %s; not removing from stash", localPath) if debug { log.Println(err) @@ -192,26 +228,48 @@ func (m *stashModel) removeLocalMarkdown(localPath string) error { return err } - // Slice out markdown - if i >= 0 { - m.markdowns = append(m.markdowns[:i], m.markdowns[i+1:]...) + if m.isFiltering() { + found = false + for i, md := range m.filteredMarkdowns { + if md.localPath == localPath { + m.filteredMarkdowns[i] = newMarkdown + found = true + break + } + } + if !found { + err := fmt.Errorf("warning: found local markdown %s in the master markdown list, but not in the filter results", localPath) + if debug { + log.Println(err) + } + return err + } } + return nil } // Return the number of markdown documents of a given type. func (m stashModel) countMarkdowns(t markdownType) (found int) { - if len(m.getNotes()) == 0 { + mds := m.getVisibleMarkdowns() + if len(mds) == 0 { return } - for i := 0; i < len(m.getNotes()); i++ { - if m.getNotes()[i].markdownType == t { + for i := 0; i < len(mds); i++ { + if mds[i].markdownType == t { found++ } } return } +func (m stashModel) getVisibleMarkdowns() []*markdown { + if m.isFiltering() { + return m.filteredMarkdowns + } + return m.markdowns +} + // Command for opening a markdown document in the pager. Note that this also // alters the model. func (m *stashModel) openMarkdown(md *markdown) tea.Cmd { @@ -227,37 +285,6 @@ func (m *stashModel) openMarkdown(md *markdown) tea.Cmd { return tea.Batch(cmd, spinner.Tick) } -// Returns the stashed markdown notes. When the model state indicates that -// filtering is desired, this also filters and ranks the notes by the filter -// term in the filterInput field. -func (m stashModel) getNotes() []*markdown { - if m.filterInput.Value() == "" { - return m.markdowns - } - if m.state != stashStateFilterNotes && - m.state != stashStateShowFiltered && - m.state != stashStatePromptDelete && - m.state != stashStateSettingNote { - return m.markdowns - } - - targets := []string{} - - for _, t := range m.markdowns { - targets = append(targets, t.filterValue) - } - - ranks := fuzzy.Find(m.filterInput.Value(), targets) - sort.Sort(ranks) - - filtered := []*markdown{} - for _, r := range ranks { - filtered = append(filtered, m.markdowns[r.Index]) - } - - return filtered -} - func (m *stashModel) hideStatusMessage() { m.showStatusMessage = false if m.statusMessageTimer != nil { @@ -279,11 +306,11 @@ func (m *stashModel) moveCursorUp() { // Go to previous page m.paginator.PrevPage() - m.index = m.paginator.ItemsOnPage(len(m.getNotes())) - 1 + m.index = m.paginator.ItemsOnPage(len(m.getVisibleMarkdowns())) - 1 } func (m *stashModel) moveCursorDown() { - itemsOnPage := m.paginator.ItemsOnPage(len(m.getNotes())) + itemsOnPage := m.paginator.ItemsOnPage(len(m.getVisibleMarkdowns())) m.index++ if m.index < itemsOnPage { @@ -400,14 +427,21 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // If we're filtering build filter indexes immediately so any // matching results will show up in the filter. - if m.state == stashStateFilterNotes || m.state == stashStateShowFiltered { + if m.isFiltering() { for _, md := range docs { md.buildFilterValue() } } + if m.shouldUpdateFilter() { + cmds = append(cmds, filterMarkdowns(m)) + } m.addMarkdowns(docs...) + case filteredMarkdownMsg: + m.filteredMarkdowns = msg + return m, nil + case spinner.TickMsg: condition := !m.loadingDone() || m.loadingFromNetwork || @@ -435,8 +469,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { md := markdown(msg) delete(m.filesStashing, md.localPath) // remove from the things-we're-stashing list - _ = m.removeLocalMarkdown(md.localPath) - m.addMarkdowns(&md) + _ = m.replaceLocalMarkdown(md.localPath, &md) m.showStatusMessage = true m.statusMessage = "Stashed!" @@ -454,7 +487,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { switch m.state { case stashStateReady, stashStateShowFiltered: - pages := len(m.getNotes()) + pages := len(m.getVisibleMarkdowns()) switch msg := msg.(type) { // Handle keys @@ -476,11 +509,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.paginator.Page = m.paginator.TotalPages - 1 m.index = m.paginator.ItemsOnPage(pages) - 1 - // esc only passed trough in stashStateFilterNotes + // Note: esc is only passed trough in stashStateFilterNotes case "esc": m.state = stashStateReady - m.filterInput.SetValue("") // clear the filter input - m.setTotalPages() + m.resetFiltering() // Open document case "enter": @@ -504,6 +536,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { md.buildFilterValue() } + m.filteredMarkdowns = m.markdowns + m.paginator.Page = 0 m.index = 0 m.state = stashStateFilterNotes @@ -539,9 +573,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { md := m.selectedMarkdown() - // is the file in the process of being stashed? _, isBeingStashed := m.filesStashing[md.localPath] - isLocalMarkdown := md.markdownType == localMarkdown markdownPathMissing := md.localPath == "" @@ -606,7 +638,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } // Keep the index in bounds when paginating - itemsOnPage := m.paginator.ItemsOnPage(len(m.getNotes())) + itemsOnPage := m.paginator.ItemsOnPage(len(m.getVisibleMarkdowns())) if m.index > itemsOnPage-1 { m.index = max(0, itemsOnPage-1) } @@ -642,18 +674,25 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } else { // Delete optimistically and remove the stashed item // before we've received a success response. - m.markdowns = append(m.markdowns[:i], m.markdowns[i+1:]...) + if m.isFiltering() { + mds, _ := deleteMarkdown(m.filteredMarkdowns, m.markdowns[i]) + m.filteredMarkdowns = mds + } + mds, _ := deleteMarkdown(m.markdowns, m.markdowns[i]) + m.markdowns = mds } } // Set state and delete - m.state = stashStateReady - if m.filterInput.Value() != "" { + if m.isFiltering() { m.state = stashStateShowFiltered + } else { + m.state = stashStateReady } // Update pagination m.setTotalPages() + return m, deleteStashedItem(m.general.cc, smd.ID) default: @@ -670,7 +709,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case "esc": // Cancel filtering m.state = stashStateReady - m.filterInput.Reset() + m.resetFiltering() case "enter", "tab", "shift+tab", "ctrl+k", "up", "ctrl+j", "down": m.hideStatusMessage() @@ -678,12 +717,12 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { break } - h := m.getNotes() + h := m.getVisibleMarkdowns() // If we've filtered down to nothing, clear the filter if len(h) == 0 { m.state = stashStateReady - m.filterInput.Reset() + m.resetFiltering() break } @@ -691,7 +730,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // "open" it directly if len(h) == 1 { m.state = stashStateReady - m.filterInput.Reset() + m.resetFiltering() cmds = append(cmds, m.openMarkdown(h[0])) break } @@ -700,16 +739,23 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.state = stashStateShowFiltered if m.filterInput.Value() == "" { - m.filterInput.Reset() m.state = stashStateReady + m.resetFiltering() } } } // Update the filter text input component - newFilterInputModel, cmd := m.filterInput.Update(msg) + newFilterInputModel, inputCmd := m.filterInput.Update(msg) + currentFilterVal := m.filterInput.Value() + newFilterVal := newFilterInputModel.Value() m.filterInput = newFilterInputModel - cmds = append(cmds, cmd) + cmds = append(cmds, inputCmd) + + // If the filtering input has changed, request updated filtering + if newFilterVal != currentFilterVal { + cmds = append(cmds, filterMarkdowns(m)) + } // Update pagination m.setTotalPages() @@ -719,9 +765,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { switch msg.String() { case "esc": // Cancel note - m.state = stashStateReady if m.filterInput.Value() != "" { m.state = stashStateShowFiltered + } else { + m.state = stashStateReady } m.noteInput.Reset() case "enter": @@ -731,18 +778,23 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { cmd := saveDocumentNote(m.general.cc, md.ID, newNote) md.Note = newNote m.noteInput.Reset() - m.state = stashStateReady if m.filterInput.Value() != "" { m.state = stashStateShowFiltered + } else { + m.state = stashStateReady } return m, cmd } } + if m.shouldUpdateFilter() { + cmds = append(cmds, filterMarkdowns(m)) + } + // Update the note text input component - newNoteInputModel, cmd := m.noteInput.Update(msg) + newNoteInputModel, noteInputCmd := m.noteInput.Update(msg) m.noteInput = newNoteInputModel - cmds = append(cmds, cmd) + cmds = append(cmds, noteInputCmd) case stashStateShowingError: // Any key exists the error view @@ -906,10 +958,10 @@ func stashHeaderView(m stashModel) string { func stashPopulatedView(m stashModel) string { var b strings.Builder - markdowns := m.getNotes() - if len(markdowns) > 0 { - start, end := m.paginator.GetSliceBounds(len(markdowns)) - docs := markdowns[start:end] + mds := m.getVisibleMarkdowns() + if len(mds) > 0 { + start, end := m.paginator.GetSliceBounds(len(mds)) + docs := mds[start:end] for i, md := range docs { stashItemView(&b, m, i, md) @@ -922,10 +974,10 @@ func stashPopulatedView(m stashModel) string { // If there aren't enough items to fill up this page (always the last page) // then we need to add some newlines to fill up the space where stash items // would have been. - itemsOnPage := m.paginator.ItemsOnPage(len(markdowns)) + itemsOnPage := m.paginator.ItemsOnPage(len(mds)) if itemsOnPage < m.paginator.PerPage { n := (m.paginator.PerPage - itemsOnPage) * stashViewItemHeight - if len(markdowns) == 0 { + if len(mds) == 0 { n -= stashViewItemHeight - 1 } for i := 0; i < n; i++ { @@ -941,7 +993,7 @@ func stashHelpView(m stashModel) string { h []string isStashed bool isLocal bool - numDocs = len(m.getNotes()) + numDocs = len(m.getVisibleMarkdowns()) ) if numDocs > 0 { @@ -1091,10 +1143,64 @@ func deleteStashedItem(cc *charm.Client, id int) tea.Cmd { } } +func filterMarkdowns(m stashModel) tea.Cmd { + return func() tea.Msg { + if m.filterInput.Value() == "" || !m.isFiltering() { + return filteredMarkdownMsg(m.markdowns) // return everything + } + + targets := []string{} + + for _, t := range m.markdowns { + targets = append(targets, t.filterValue) + } + + ranks := fuzzy.Find(m.filterInput.Value(), targets) + sort.Stable(ranks) + + filtered := []*markdown{} + for _, r := range ranks { + filtered = append(filtered, m.markdowns[r.Index]) + } + + return filteredMarkdownMsg(filtered) + } +} + // ETC -// Normalize text to aid in the filtering process. in particular, we remove -// diacritics. +// Delete a markdown from a slice of markdowns +func deleteMarkdown(markdowns []*markdown, target *markdown) ([]*markdown, error) { + index := -1 + + for i, v := range markdowns { + switch target.markdownType { + case localMarkdown, convertedMarkdown: + if v.localPath == target.localPath { + index = i + } + case stashedMarkdown, newsMarkdown: + if v.ID == target.ID { + index = i + } + default: + return nil, errors.New("unknown markdown type") + } + } + + if index == -1 { + err := fmt.Errorf("could not find markdown to delete") + if debug { + log.Println(err) + } + return nil, err + } + + return append(markdowns[:index], markdowns[index+1:]...), nil +} + +// Normalize text to aid in the filtering process. In particular, we remove +// diacritics, "ö" becomes "o". func normalize(in string) (string, error) { t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC) out, _, err := transform.String(t, in) diff --git a/ui/stashitem.go b/ui/stashitem.go index 8c26fee..4ee727e 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -50,7 +50,8 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { // If there are multiple items being filtered we don't highlight a selected // item in the results. If we've filtered down to one item, however, // highlight that first item since pressing return will open it. - singleFilteredItem := m.state == stashStateFilterNotes && len(m.getNotes()) == 1 + singleFilteredItem := + m.state == stashStateFilterNotes && len(m.getVisibleMarkdowns()) == 1 if isSelected && !isFilteringNotes || singleFilteredItem { // Selected item diff --git a/ui/ui.go b/ui/ui.go index d690235..12c31df 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -320,11 +320,6 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.general.cwd = msg.cwd cmds = append(cmds, findNextLocalFile(m)) - case foundLocalFileMsg: - newMd := localFileToMarkdown(m.general.cwd, gitcha.SearchResult(msg)) - m.stash.addMarkdowns(newMd) - cmds = append(cmds, findNextLocalFile(m)) - case sshAuthErrMsg: if m.keygenState != keygenFinished { // if we haven't run the keygen yet, do that m.keygenState = keygenRunning @@ -387,20 +382,31 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, cmd case localFileSearchFinished, gotStashMsg, gotNewsMsg: - // Also pass these messages to the stash so we can keep it updated - // about network activity. + // Always pass these messages to the stash so we can keep it updated + // about network activity, even if the user isn't currently viewing + // the stash. stashModel, cmd := stashUpdate(msg, m.stash) m.stash = stashModel return m, cmd + case foundLocalFileMsg: + newMd := localFileToMarkdown(m.general.cwd, gitcha.SearchResult(msg)) + m.stash.addMarkdowns(newMd) + if m.stash.isFiltering() { + newMd.buildFilterValue() + } + if m.stash.shouldUpdateFilter() { + cmds = append(cmds, filterMarkdowns(m.stash)) + } + cmds = append(cmds, findNextLocalFile(m)) + case stashSuccessMsg: // Something was stashed. Update the stash listing but don't run an // actual update on the stash since we don't want to trigger the status // message and generally don't want any other effects. if m.state == stateShowDocument { md := markdown(msg) - _ = m.stash.removeLocalMarkdown(md.localPath) - m.stash.addMarkdowns(&md) + _ = m.stash.replaceLocalMarkdown(md.localPath, &md) } } From 53592dc04ad195cf25d9fc03ff2f391052d0a46f Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 25 Nov 2020 01:52:04 +0100 Subject: [PATCH 592/911] Add .envrc to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4b20fa2..d3003c1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ glow dist/ +.envrc From d98cda4b2bd53ab9dfc8f5752d1dae516286c1b3 Mon Sep 17 00:00:00 2001 From: shaun mitchell Date: Mon, 7 Dec 2020 08:22:38 -0500 Subject: [PATCH 593/911] fixed showStatusMessage(string) to display passed parameter --- ui/pager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index bef151f..7d4c1d8 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -387,7 +387,7 @@ func (m pagerModel) statusBarView(b *strings.Builder) { // Note var note string if showStatusMessage { - note = "Stashed!" + note = m.statusMessage } else { note = m.currentDocument.Note if len(note) == 0 { From 753a7c69937eae4c4b601e7503b4b0d31f643bb5 Mon Sep 17 00:00:00 2001 From: Selwyn Date: Wed, 9 Dec 2020 17:49:25 +0100 Subject: [PATCH 594/911] Include installation command for Solus Closes #203 --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 55a350d..9826bc5 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,9 @@ nix-env -iA nixpkgs.glow # FreeBSD pkg install glow +# Solus +eopkg install glow + # Windows (with Scoop) scoop install glow ``` From d9242c9a7220e194b1fe4165cf3669d3b642e2e7 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Wed, 16 Dec 2020 16:23:58 +0100 Subject: [PATCH 595/911] Expand the path for a specified style file --- go.mod | 1 + main.go | 19 ++++++++++++++++--- utils/utils.go | 16 +++++++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index a2e7086..fbf0a23 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ require ( github.com/mattn/go-runewidth v0.0.9 github.com/meowgorithm/babyenv v1.3.0 github.com/microcosm-cc/bluemonday v1.0.4 // indirect + github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6 github.com/muesli/go-app-paths v0.2.1 github.com/muesli/reflow v0.2.0 diff --git a/main.go b/main.go index 1584de0..f506f9d 100644 --- a/main.go +++ b/main.go @@ -135,13 +135,23 @@ func sourceFromArg(arg string) (*source, error) { return &source{r, u}, err } -func validateOptions(cmd *cobra.Command) { +func validateOptions(cmd *cobra.Command) error { // grab config values from Viper - style = viper.GetString("style") width = viper.GetUint("width") localOnly = viper.GetBool("local") mouse = viper.GetBool("mouse") + // validate the glamour style + style = viper.GetString("style") + if style != "auto" && glamour.DefaultStyles[style] == nil { + style = utils.ExpandPath(style) + if _, err := os.Stat(style); os.IsNotExist(err) { + return fmt.Errorf("Specified style does not exist: %s", style) + } else if err != nil { + return err + } + } + isTerminal := terminal.IsTerminal(int(os.Stdout.Fd())) // We want to use a special no-TTY style, when stdout is not a terminal // and there was no specific style passed by arg @@ -163,11 +173,14 @@ func validateOptions(cmd *cobra.Command) { if width == 0 { width = 80 } + return nil } func execute(cmd *cobra.Command, args []string) error { initConfig() - validateOptions(cmd) + if err := validateOptions(cmd); err != nil { + return err + } if len(args) == 0 { return executeArg(cmd, "", os.Stdout) diff --git a/utils/utils.go b/utils/utils.go index e03298c..8146f82 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -1,6 +1,11 @@ package utils -import "regexp" +import ( + "os" + "regexp" + + "github.com/mitchellh/go-homedir" +) func RemoveFrontmatter(content []byte) []byte { if frontmatterBoundaries := detectFrontmatter(content); frontmatterBoundaries[0] == 0 { @@ -17,3 +22,12 @@ func detectFrontmatter(c []byte) []int { } return []int{-1, -1} } + +// Expands tilde and all environment variables from the given path. +func ExpandPath(path string) string { + s, err := homedir.Expand(path) + if err == nil { + return os.ExpandEnv(s) + } + return os.ExpandEnv(path) +} From 537ef308d29dfe8a37b3b3d105e1302cfa0b6082 Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Fri, 20 Nov 2020 00:56:46 +0100 Subject: [PATCH 596/911] Add a menu item for only display news --- ui/stash.go | 34 +++++++++++++++++++++++++++++++--- ui/ui.go | 6 +++++- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index fd9e4f0..25c4b21 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -67,6 +67,7 @@ const ( stashStateShowingError stashStateFilterNotes stashStateShowFiltered + stashStateShowNews ) type stashModel struct { @@ -264,6 +265,16 @@ func (m stashModel) countMarkdowns(t markdownType) (found int) { } func (m stashModel) getVisibleMarkdowns() []*markdown { + if m.state == stashStateShowNews { + news := []*markdown{} + for _, md := range m.markdowns { + // TODO: Sort news according to their CreatedAt date + if md.markdownType == newsMarkdown { + news = append(news, md) + } + } + return news + } if m.isFiltering() { return m.filteredMarkdowns } @@ -486,7 +497,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } switch m.state { - case stashStateReady, stashStateShowFiltered: + case stashStateReady, stashStateShowFiltered, stashStateShowNews: pages := len(m.getVisibleMarkdowns()) switch msg := msg.(type) { @@ -509,7 +520,7 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { m.paginator.Page = m.paginator.TotalPages - 1 m.index = m.paginator.ItemsOnPage(pages) - 1 - // Note: esc is only passed trough in stashStateFilterNotes + // Note: esc is only passed trough in stashStateFilterNotes and stashStateShowNews case "esc": m.state = stashStateReady m.resetFiltering() @@ -529,6 +540,10 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // Filter your notes case "/": + if m.state == stashStateShowNews { + break + } + m.hideStatusMessage() // Build values we'll filter against @@ -565,6 +580,15 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { return m, textinput.Blink } + // News + case "n": + m.hideStatusMessage() + m.paginator.Page = 0 + m.index = 0 + m.state = stashStateShowNews + m.setTotalPages() + return m, nil + // Stash case "s": if pages == 0 || m.general.authStatus != authOK || m.selectedMarkdown() == nil { @@ -817,7 +841,7 @@ func stashView(m stashModel) string { return errorView(m.err, false) case stashStateLoadingDocument: s += " " + m.spinner.View() + " Loading document..." - case stashStateReady, stashStateSettingNote, stashStatePromptDelete, stashStateFilterNotes, stashStateShowFiltered: + case stashStateReady, stashStateSettingNote, stashStatePromptDelete, stashStateFilterNotes, stashStateShowFiltered, stashStateShowNews: loadingIndicator := " " if !m.localOnly() && (!m.loadingDone() || m.loadingFromNetwork || m.spinner.Visible()) { @@ -855,6 +879,8 @@ func stashView(m stashModel) string { // If we're filtering we replace the logo with the filter field if m.state == stashStateFilterNotes || m.state == stashStateShowFiltered { logoOrFilter = m.filterInput.View() + } else if m.state == stashStateShowNews { + logoOrFilter = glowLogoView(" Newsfeed ") } var pagination string @@ -1012,6 +1038,8 @@ func stashHelpView(m stashModel) string { h = append(h, "enter/esc: cancel") } else if m.state == stashStateFilterNotes { h = append(h, "enter: confirm", "esc: cancel", "ctrl+j/ctrl+k, ↑/↓: choose") + } else if m.state == stashStateShowNews { + h = append(h, "enter: open", "esc: return", "j/k, ↑/↓: choose", "q: quit") } else { if len(m.markdowns) > 0 { h = append(h, "enter: open") diff --git a/ui/ui.go b/ui/ui.go index 12c31df..d46a112 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -253,13 +253,17 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Send q/esc through in these cases case stashStateSettingNote, stashStatePromptDelete, stashStateShowingError, stashStateFilterNotes, - stashStateShowFiltered: + stashStateShowFiltered, stashStateShowNews: // If we're fitering, only send esc through so we can clear // the filter results. Q quits as normal. if m.stash.state == stashStateShowFiltered && msg.String() == "q" { return m, tea.Quit } + // Q also quits glow when displaying only newsitems + if m.stash.state == stashStateShowNews && msg.String() == "q" { + return m, tea.Quit + } m.stash, cmd = stashUpdate(msg, m.stash) return m, cmd From 2d10fb874931cbc4d7bc05ebad2eb24c38822cd2 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 24 Nov 2020 18:24:31 -0500 Subject: [PATCH 597/911] Adjust news header syle --- ui/pager.go | 18 +++++++++--------- ui/stash.go | 2 +- ui/styles.go | 14 ++++++++++++-- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 7d4c1d8..c47c940 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -36,15 +36,15 @@ var ( statusBarBg = common.NewColorPair("#242424", "#E6E6E6") // Styling funcs - statusBarScrollPosStyle = newStyle(common.NewColorPair("#5A5A5A", "#949494"), statusBarBg) - statusBarNoteStyle = newStyle(statusBarNoteFg, statusBarBg) - statusBarHelpStyle = newStyle(statusBarNoteFg, common.NewColorPair("#323232", "#DCDCDC")) - statusBarStashDotStyle = newStyle(common.Green, statusBarBg) - statusBarMessageStyle = newStyle(mintGreen, darkGreen) - statusBarMessageStashIconStyle = newStyle(mintGreen, darkGreen) - statusBarMessageScrollPosStyle = newStyle(mintGreen, darkGreen) - statusBarMessageHelpStyle = newStyle(common.NewColorPair("#B6FFE4", "#B6FFE4"), common.Green) - helpViewStyle = newStyle(statusBarNoteFg, common.NewColorPair("#1B1B1B", "#f2f2f2")) + statusBarScrollPosStyle = newStyle(common.NewColorPair("#5A5A5A", "#949494"), statusBarBg, false) + statusBarNoteStyle = newStyle(statusBarNoteFg, statusBarBg, false) + statusBarHelpStyle = newStyle(statusBarNoteFg, common.NewColorPair("#323232", "#DCDCDC"), false) + statusBarStashDotStyle = newStyle(common.Green, statusBarBg, false) + statusBarMessageStyle = newStyle(mintGreen, darkGreen, false) + statusBarMessageStashIconStyle = newStyle(mintGreen, darkGreen, false) + statusBarMessageScrollPosStyle = newStyle(mintGreen, darkGreen, false) + statusBarMessageHelpStyle = newStyle(common.NewColorPair("#B6FFE4", "#B6FFE4"), common.Green, false) + helpViewStyle = newStyle(statusBarNoteFg, common.NewColorPair("#1B1B1B", "#f2f2f2"), false) ) type contentRenderedMsg string diff --git a/ui/stash.go b/ui/stash.go index 25c4b21..3a128eb 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -880,7 +880,7 @@ func stashView(m stashModel) string { if m.state == stashStateFilterNotes || m.state == stashStateShowFiltered { logoOrFilter = m.filterInput.View() } else if m.state == stashStateShowNews { - logoOrFilter = glowLogoView(" Newsfeed ") + logoOrFilter += newsTitleStyle(" News ") } var pagination string diff --git a/ui/styles.go b/ui/styles.go index d8b4971..d30a24e 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -40,11 +40,21 @@ var ( dullYellowFg = newFgStyle(common.NewColorPair("#9BA92F", "#6BCB94")) // renders light green on light backgrounds redFg = newFgStyle(common.Red) faintRedFg = newFgStyle(common.FaintRed) + + newsTitleStyle = newStyle( + common.NewColorPair(common.Indigo.String(), common.Cream.String()), + common.NewColorPair(common.Cream.String(), common.Indigo.String()), + true, + ) ) // Returns a termenv style with foreground and background options. -func newStyle(fg, bg common.ColorPair) func(string) string { - return te.Style{}.Foreground(fg.Color()).Background(bg.Color()).Styled +func newStyle(fg, bg common.ColorPair, bold bool) func(string) string { + s := te.Style{}.Foreground(fg.Color()).Background(bg.Color()) + if bold { + s = s.Bold() + } + return s.Styled } // Returns a new termenv style with background options only. From dfeb60770eef24113ac64a85e92891bb87190d69 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 24 Nov 2020 18:31:12 -0500 Subject: [PATCH 598/911] The n key also exits news --- ui/stash.go | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 3a128eb..a0bc433 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -582,11 +582,19 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { // News case "n": - m.hideStatusMessage() - m.paginator.Page = 0 - m.index = 0 - m.state = stashStateShowNews - m.setTotalPages() + if m.state == stashStateShowNews { + // Exit news + m.state = stashStateReady + m.resetFiltering() + } else { + // Show news + m.hideStatusMessage() + m.paginator.Page = 0 + m.index = 0 + m.state = stashStateShowNews + m.setTotalPages() + } + return m, nil // Stash From c10a84adc10a7ce3ccb826f1f135c761c61f7895 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 25 Nov 2020 11:40:12 -0500 Subject: [PATCH 599/911] Sort news by date --- ui/stash.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index a0bc433..880f4cc 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -268,13 +268,14 @@ func (m stashModel) getVisibleMarkdowns() []*markdown { if m.state == stashStateShowNews { news := []*markdown{} for _, md := range m.markdowns { - // TODO: Sort news according to their CreatedAt date if md.markdownType == newsMarkdown { news = append(news, md) } } + sort.Sort(markdownsByLocalFirst(news)) // also sorts by date return news } + if m.isFiltering() { return m.filteredMarkdowns } From 40a02259fc01311bc0bb975ba08f2305d5b804bb Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 25 Nov 2020 11:40:24 -0500 Subject: [PATCH 600/911] Only show news in news section --- main.go | 4 +- ui/markdown.go | 85 ++++- ui/pager.go | 14 +- ui/stash.go | 862 +++++++++++++++++++++++------------------------- ui/stashitem.go | 8 +- ui/ui.go | 34 +- 6 files changed, 529 insertions(+), 478 deletions(-) diff --git a/main.go b/main.go index f506f9d..8617487 100644 --- a/main.go +++ b/main.go @@ -294,9 +294,9 @@ func runTUI(stashedOnly bool) error { cfg.GlamourStyle = style if stashedOnly { - cfg.DocumentTypes = ui.StashedDocuments | ui.NewsDocuments + cfg.DocumentTypes = ui.StashedDocument | ui.NewsDocument } else if localOnly { - cfg.DocumentTypes = ui.LocalDocuments + cfg.DocumentTypes = ui.LocalDocument } // Run Bubble Tea program diff --git a/ui/markdown.go b/ui/markdown.go index 8e249c9..c108b2a 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -2,25 +2,29 @@ package ui import ( "log" + "math" "strings" + "time" + "unicode" "github.com/charmbracelet/charm" + "github.com/dustin/go-humanize" + "golang.org/x/text/transform" + "golang.org/x/text/unicode/norm" ) -// markdownType allows us to differentiate between the types of markdown -// documents we're dealing with. -type markdownType int +type DocumentType byte const ( - stashedMarkdown markdownType = iota - newsMarkdown - localMarkdown - convertedMarkdown // used to be local, now its stashed + LocalDocument DocumentType = 1 << iota + StashedDocument + ConvertedDocument + NewsDocument ) // markdown wraps charm.Markdown. type markdown struct { - markdownType markdownType + markdownType DocumentType // Full path of a local markdown file. Only relevant to local documents and // those that have been stashed in this session. @@ -43,7 +47,7 @@ func (m *markdown) buildFilterValue() { m.filterValue = m.Note } - if m.markdownType == newsMarkdown { + if m.markdownType == NewsDocument { m.filterValue = "News: " + note return } @@ -54,7 +58,7 @@ func (m *markdown) buildFilterValue() { // sortAsLocal returns whether or not this markdown should be sorted as though // it's a local markdown document. func (m markdown) sortAsLocal() bool { - return m.markdownType == localMarkdown || m.markdownType == convertedMarkdown + return m.markdownType == LocalDocument || m.markdownType == ConvertedDocument } // Sort documents with local files first, then by date. @@ -88,3 +92,64 @@ func (m markdownsByLocalFirst) Less(i, j int) bool { // If the timestamps also match, sort by ID. return m[i].ID > m[j].ID } + +func (m markdown) relativeTime() string { + return relativeTime(m.CreatedAt) +} + +// Normalize text to aid in the filtering process. In particular, we remove +// diacritics, "ö" becomes "o". +func normalize(in string) (string, error) { + t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC) + out, _, err := transform.String(t, in) + return out, err +} + +// Returns whether a given rune is a nonspacing mark (Mn is the key for +// nonspacing marks) +func isMn(r rune) bool { + return unicode.Is(unicode.Mn, r) +} + +// wrapMarkdowns wraps a *charm.Markdown with a *markdown in order to add some +// extra metadata. +func wrapMarkdowns(t DocumentType, md []*charm.Markdown) (m []*markdown) { + for _, v := range md { + m = append(m, &markdown{ + markdownType: t, + Markdown: *v, + }) + } + return m +} + +func relativeTime(then time.Time) string { + now := time.Now() + ago := now.Sub(then) + if ago < time.Minute { + return "just now" + } else if ago < humanize.Week { + return humanize.CustomRelTime(then, now, "ago", "from now", magnitudes) + } + return then.Format("02 Jan 2006 15:04 MST") +} + +var magnitudes = []humanize.RelTimeMagnitude{ + {D: time.Second, Format: "now", DivBy: time.Second}, + {D: 2 * time.Second, Format: "1 second %s", DivBy: 1}, + {D: time.Minute, Format: "%d seconds %s", DivBy: time.Second}, + {D: 2 * time.Minute, Format: "1 minute %s", DivBy: 1}, + {D: time.Hour, Format: "%d minutes %s", DivBy: time.Minute}, + {D: 2 * time.Hour, Format: "1 hour %s", DivBy: 1}, + {D: humanize.Day, Format: "%d hours %s", DivBy: time.Hour}, + {D: 2 * humanize.Day, Format: "1 day %s", DivBy: 1}, + {D: humanize.Week, Format: "%d days %s", DivBy: humanize.Day}, + {D: 2 * humanize.Week, Format: "1 week %s", DivBy: 1}, + {D: humanize.Month, Format: "%d weeks %s", DivBy: humanize.Week}, + {D: 2 * humanize.Month, Format: "1 month %s", DivBy: 1}, + {D: humanize.Year, Format: "%d months %s", DivBy: humanize.Month}, + {D: 18 * humanize.Month, Format: "1 year %s", DivBy: 1}, + {D: 2 * humanize.Year, Format: "2 years %s", DivBy: 1}, + {D: humanize.LongTime, Format: "%d years %s", DivBy: humanize.Year}, + {D: math.MaxInt64, Format: "a long while %s", DivBy: 1}, +} diff --git a/ui/pager.go b/ui/pager.go index c47c940..cb16a59 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -173,7 +173,7 @@ func (m *pagerModel) unload() { m.textInput.Reset() } -func (m pagerModel) Update(msg tea.Msg) (pagerModel, tea.Cmd) { +func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { var ( cmd tea.Cmd cmds []tea.Cmd @@ -215,8 +215,8 @@ func (m pagerModel) Update(msg tea.Msg) (pagerModel, tea.Cmd) { cmds = append(cmds, viewport.Sync(m.viewport)) } case "m": - isStashed := m.currentDocument.markdownType == stashedMarkdown || - m.currentDocument.markdownType == convertedMarkdown + isStashed := m.currentDocument.markdownType == StashedDocument || + m.currentDocument.markdownType == ConvertedDocument // Users can only set the note on user-stashed markdown if !isStashed { @@ -244,7 +244,7 @@ func (m pagerModel) Update(msg tea.Msg) (pagerModel, tea.Cmd) { } // Stash a local document - if m.state != pagerStateStashing && m.currentDocument.markdownType == localMarkdown { + if m.state != pagerStateStashing && m.currentDocument.markdownType == LocalDocument { m.state = pagerStateStashing m.spinner.Start() cmds = append( @@ -348,7 +348,7 @@ func (m pagerModel) statusBarView(b *strings.Builder) { percentToStringMagnitude float64 = 100.0 ) var ( - isStashed bool = m.currentDocument.markdownType == stashedMarkdown || m.currentDocument.markdownType == convertedMarkdown + isStashed bool = m.currentDocument.markdownType == StashedDocument || m.currentDocument.markdownType == ConvertedDocument showStatusMessage bool = m.state == pagerStateStatusMessage ) @@ -440,7 +440,7 @@ func (m pagerModel) setNoteView(b *strings.Builder) { func (m pagerModel) helpView() (s string) { memoOrStash := "m set memo" - if m.general.authStatus == authOK && m.currentDocument.markdownType == localMarkdown { + if m.general.authStatus == authOK && m.currentDocument.markdownType == LocalDocument { memoOrStash = "s stash this document" } @@ -453,7 +453,7 @@ func (m pagerModel) helpView() (s string) { "q quit", } - if m.currentDocument.markdownType == newsMarkdown { + if m.currentDocument.markdownType == NewsDocument { deleteFromStringSlice(col1, 3) } diff --git a/ui/stash.go b/ui/stash.go index 880f4cc..e954c57 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -5,11 +5,9 @@ import ( "fmt" "io/ioutil" "log" - "math" "sort" "strings" "time" - "unicode" "github.com/charmbracelet/bubbles/paginator" "github.com/charmbracelet/bubbles/spinner" @@ -17,13 +15,9 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/ui/common" - "github.com/dustin/go-humanize" - runewidth "github.com/mattn/go-runewidth" "github.com/muesli/reflow/ansi" te "github.com/muesli/termenv" "github.com/sahilm/fuzzy" - "golang.org/x/text/transform" - "golang.org/x/text/unicode/norm" ) const ( @@ -49,14 +43,6 @@ type filteredMarkdownMsg []*markdown // MODEL -type DocumentType byte - -const ( - LocalDocuments DocumentType = 1 << iota - StashedDocuments - NewsDocuments -) - type stashState int const ( @@ -114,11 +100,11 @@ type stashModel struct { } func (m stashModel) localOnly() bool { - return m.general.cfg.DocumentTypes == LocalDocuments + return m.general.cfg.DocumentTypes == LocalDocument } func (m stashModel) stashedOnly() bool { - return m.general.cfg.DocumentTypes&LocalDocuments == 0 + return m.general.cfg.DocumentTypes&LocalDocument == 0 } func (m stashModel) loadingDone() bool { @@ -251,7 +237,7 @@ func (m *stashModel) replaceLocalMarkdown(localPath string, newMarkdown *markdow } // Return the number of markdown documents of a given type. -func (m stashModel) countMarkdowns(t markdownType) (found int) { +func (m stashModel) countMarkdowns(t DocumentType) (found int) { mds := m.getVisibleMarkdowns() if len(mds) == 0 { return @@ -264,22 +250,46 @@ func (m stashModel) countMarkdowns(t markdownType) (found int) { return } -func (m stashModel) getVisibleMarkdowns() []*markdown { - if m.state == stashStateShowNews { - news := []*markdown{} - for _, md := range m.markdowns { - if md.markdownType == newsMarkdown { - news = append(news, md) - } - } - sort.Sort(markdownsByLocalFirst(news)) // also sorts by date - return news +// Sift through the master markdown collection for the specified types. +func (m stashModel) getMarkdownByType(types ...DocumentType) []*markdown { + var agg []*markdown + + if len(m.markdowns) == 0 { + return agg } + for _, t := range types { + for _, md := range m.markdowns { + if md.markdownType == t { + agg = append(agg, md) + } + } + } + + sort.Sort(markdownsByLocalFirst(agg)) + return agg +} + +// Returns the markdowns that should be currently shown. +func (m stashModel) getVisibleMarkdowns() []*markdown { if m.isFiltering() { return m.filteredMarkdowns } - return m.markdowns + + if m.state == stashStateShowNews { + return m.getMarkdownByType(NewsDocument) + } + + return m.getMarkdownByType(LocalDocument, StashedDocument, ConvertedDocument) +} + +// Return the markdowns eligible to be filtered. +func (m stashModel) getFilterableMarkdowns() []*markdown { + if m.state == stashStateShowNews { + return m.getMarkdownByType(NewsDocument) + } + + return m.getMarkdownByType(LocalDocument, StashedDocument, ConvertedDocument) } // Command for opening a markdown document in the pager. Note that this also @@ -288,7 +298,7 @@ func (m *stashModel) openMarkdown(md *markdown) tea.Cmd { var cmd tea.Cmd m.state = stashStateLoadingDocument - if md.markdownType == localMarkdown { + if md.markdownType == LocalDocument { cmd = loadLocalMarkdown(md) } else { cmd = loadRemoteMarkdown(m.general.cc, md.ID, md.markdownType) @@ -387,7 +397,7 @@ func newStashModel(general *general) stashModel { // UPDATE -func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { +func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { var cmds []tea.Cmd switch msg := msg.(type) { @@ -396,17 +406,17 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { case stashLoadErrMsg: m.err = msg.err - m.loaded |= StashedDocuments // still done, albeit unsuccessfully + m.loaded |= StashedDocument // still done, albeit unsuccessfully m.stashFullyLoaded = true m.loadingFromNetwork = false case newsLoadErrMsg: m.err = msg.err - m.loaded |= NewsDocuments // still done, albeit unsuccessfully + m.loaded |= NewsDocument // still done, albeit unsuccessfully case localFileSearchFinished: // We're finished searching for local files - m.loaded |= LocalDocuments + m.loaded |= LocalDocument case gotStashMsg, gotNewsMsg: // Stash or news results have come in from the server. @@ -418,9 +428,9 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { switch msg := msg.(type) { case gotStashMsg: - m.loaded |= StashedDocuments + m.loaded |= StashedDocument m.loadingFromNetwork = false - docs = wrapMarkdowns(stashedMarkdown, msg) + docs = wrapMarkdowns(StashedDocument, msg) if len(msg) == 0 { // If the server comes back with nothing then we've got @@ -433,8 +443,8 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } case gotNewsMsg: - m.loaded |= NewsDocuments - docs = wrapMarkdowns(newsMarkdown, msg) + m.loaded |= NewsDocument + docs = wrapMarkdowns(NewsDocument, msg) } // If we're filtering build filter indexes immediately so any @@ -497,338 +507,16 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } } + // Updates per the current state switch m.state { case stashStateReady, stashStateShowFiltered, stashStateShowNews: - pages := len(m.getVisibleMarkdowns()) - - switch msg := msg.(type) { - // Handle keys - case tea.KeyMsg: - switch msg.String() { - case "k", "ctrl+k", "up", "shift+tab": - m.moveCursorUp() - - case "j", "ctrl+j", "down", "tab": - m.moveCursorDown() - - // Go to the very start - case "home", "g": - m.paginator.Page = 0 - m.index = 0 - - // Go to the very end - case "end", "G": - m.paginator.Page = m.paginator.TotalPages - 1 - m.index = m.paginator.ItemsOnPage(pages) - 1 - - // Note: esc is only passed trough in stashStateFilterNotes and stashStateShowNews - case "esc": - m.state = stashStateReady - m.resetFiltering() - - // Open document - case "enter": - m.hideStatusMessage() - - if pages == 0 { - break - } - - // Load the document from the server. We'll handle the message - // that comes back in the main update function. - md := m.selectedMarkdown() - cmds = append(cmds, m.openMarkdown(md)) - - // Filter your notes - case "/": - if m.state == stashStateShowNews { - break - } - - m.hideStatusMessage() - - // Build values we'll filter against - for _, md := range m.markdowns { - md.buildFilterValue() - } - - m.filteredMarkdowns = m.markdowns - - m.paginator.Page = 0 - m.index = 0 - m.state = stashStateFilterNotes - m.filterInput.CursorEnd() - m.filterInput.Focus() - return m, textinput.Blink - - // Set note - case "m": - m.hideStatusMessage() - - if pages == 0 { - break - } - - md := m.selectedMarkdown() - isUserMarkdown := md.markdownType == stashedMarkdown || md.markdownType == convertedMarkdown - isSettingNote := m.state == stashStateSettingNote - isPromptingDelete := m.state == stashStatePromptDelete - - if isUserMarkdown && !isSettingNote && !isPromptingDelete { - m.state = stashStateSettingNote - m.noteInput.SetValue(md.Note) - m.noteInput.CursorEnd() - return m, textinput.Blink - } - - // News - case "n": - if m.state == stashStateShowNews { - // Exit news - m.state = stashStateReady - m.resetFiltering() - } else { - // Show news - m.hideStatusMessage() - m.paginator.Page = 0 - m.index = 0 - m.state = stashStateShowNews - m.setTotalPages() - } - - return m, nil - - // Stash - case "s": - if pages == 0 || m.general.authStatus != authOK || m.selectedMarkdown() == nil { - break - } - - md := m.selectedMarkdown() - - _, isBeingStashed := m.filesStashing[md.localPath] - isLocalMarkdown := md.markdownType == localMarkdown - markdownPathMissing := md.localPath == "" - - if isBeingStashed || !isLocalMarkdown || markdownPathMissing { - if debug && isBeingStashed { - log.Printf("refusing to stash markdown; we're already stashing %s", md.localPath) - } else if debug && isLocalMarkdown && markdownPathMissing { - log.Printf("refusing to stash markdown; local path is empty: %#v", md) - } - break - } - - // Checks passed; perform the stash - m.filesStashing[md.localPath] = struct{}{} - cmds = append(cmds, stashDocument(m.general.cc, *md)) - - if m.loadingDone() && !m.spinner.Visible() { - m.spinner.Start() - cmds = append(cmds, spinner.Tick) - } - - // Prompt for deletion - case "x": - m.hideStatusMessage() - - if pages == 0 { - break - } - - t := m.selectedMarkdown().markdownType - isUserMarkdown := t == stashedMarkdown || t == convertedMarkdown - isValidState := m.state != stashStateSettingNote - - if isUserMarkdown && isValidState { - m.state = stashStatePromptDelete - } - - // Show errors - case "!": - if m.err != nil && m.state == stashStateReady { - m.state = stashStateShowingError - return m, nil - } - } - } - - // Update paginator. Pagination key handling is done here, but it could - // also be moved up to this level, in which case we'd use model methods - // like model.PageUp(). - newPaginatorModel, cmd := m.paginator.Update(msg) - m.paginator = newPaginatorModel - cmds = append(cmds, cmd) - - // Extra paginator keystrokes - if key, ok := msg.(tea.KeyMsg); ok { - switch key.String() { - case "b", "u": - m.paginator.PrevPage() - case "f", "d": - m.paginator.NextPage() - } - } - - // Keep the index in bounds when paginating - itemsOnPage := m.paginator.ItemsOnPage(len(m.getVisibleMarkdowns())) - if m.index > itemsOnPage-1 { - m.index = max(0, itemsOnPage-1) - } - - // If we're on the last page and we haven't loaded everything, get - // more stuff. - if m.paginator.OnLastPage() && !m.loadingFromNetwork && !m.stashFullyLoaded { - m.page++ - m.loadingFromNetwork = true - cmds = append(cmds, loadStash(m)) - } - + cmds = append(cmds, m.handleDocumentBrowsing(msg)) case stashStatePromptDelete: - if msg, ok := msg.(tea.KeyMsg); ok { - switch msg.String() { - // Confirm deletion - case "y": - if m.state != stashStatePromptDelete { - break - } - - smd := m.selectedMarkdown() - for i, md := range m.markdowns { - if md != smd { - continue - } - - if md.markdownType == convertedMarkdown { - // If document was stashed during this session, convert it - // back to a local file. - md.markdownType = localMarkdown - md.Note = stripAbsolutePath(m.markdowns[i].localPath, m.general.cwd) - } else { - // Delete optimistically and remove the stashed item - // before we've received a success response. - if m.isFiltering() { - mds, _ := deleteMarkdown(m.filteredMarkdowns, m.markdowns[i]) - m.filteredMarkdowns = mds - } - mds, _ := deleteMarkdown(m.markdowns, m.markdowns[i]) - m.markdowns = mds - } - } - - // Set state and delete - if m.isFiltering() { - m.state = stashStateShowFiltered - } else { - m.state = stashStateReady - } - - // Update pagination - m.setTotalPages() - - return m, deleteStashedItem(m.general.cc, smd.ID) - - default: - m.state = stashStateReady - if m.filterInput.Value() != "" { - m.state = stashStateShowFiltered - } - } - } - + cmds = append(cmds, m.handleDeleteConfirmation(msg)) case stashStateFilterNotes: - if msg, ok := msg.(tea.KeyMsg); ok { - switch msg.String() { - case "esc": - // Cancel filtering - m.state = stashStateReady - m.resetFiltering() - case "enter", "tab", "shift+tab", "ctrl+k", "up", "ctrl+j", "down": - m.hideStatusMessage() - - if len(m.markdowns) == 0 { - break - } - - h := m.getVisibleMarkdowns() - - // If we've filtered down to nothing, clear the filter - if len(h) == 0 { - m.state = stashStateReady - m.resetFiltering() - break - } - - // When there's only one filtered markdown left we can just - // "open" it directly - if len(h) == 1 { - m.state = stashStateReady - m.resetFiltering() - cmds = append(cmds, m.openMarkdown(h[0])) - break - } - - m.filterInput.Blur() - - m.state = stashStateShowFiltered - if m.filterInput.Value() == "" { - m.state = stashStateReady - m.resetFiltering() - } - } - } - - // Update the filter text input component - newFilterInputModel, inputCmd := m.filterInput.Update(msg) - currentFilterVal := m.filterInput.Value() - newFilterVal := newFilterInputModel.Value() - m.filterInput = newFilterInputModel - cmds = append(cmds, inputCmd) - - // If the filtering input has changed, request updated filtering - if newFilterVal != currentFilterVal { - cmds = append(cmds, filterMarkdowns(m)) - } - - // Update pagination - m.setTotalPages() - + cmds = append(cmds, m.handleFiltering(msg)) case stashStateSettingNote: - if msg, ok := msg.(tea.KeyMsg); ok { - switch msg.String() { - case "esc": - // Cancel note - if m.filterInput.Value() != "" { - m.state = stashStateShowFiltered - } else { - m.state = stashStateReady - } - m.noteInput.Reset() - case "enter": - // Set new note - md := m.selectedMarkdown() - newNote := m.noteInput.Value() - cmd := saveDocumentNote(m.general.cc, md.ID, newNote) - md.Note = newNote - m.noteInput.Reset() - if m.filterInput.Value() != "" { - m.state = stashStateShowFiltered - } else { - m.state = stashStateReady - } - return m, cmd - } - } - - if m.shouldUpdateFilter() { - cmds = append(cmds, filterMarkdowns(m)) - } - - // Update the note text input component - newNoteInputModel, noteInputCmd := m.noteInput.Update(msg) - m.noteInput = newNoteInputModel - cmds = append(cmds, noteInputCmd) - + cmds = append(cmds, m.handleNoteInput(msg)) case stashStateShowingError: // Any key exists the error view if _, ok := msg.(tea.KeyMsg); ok { @@ -836,14 +524,366 @@ func stashUpdate(msg tea.Msg, m stashModel) (stashModel, tea.Cmd) { } } - // If an item is being confirmed for delete, any key (other than the key - // used for confirmation above) cancels the deletion return m, tea.Batch(cmds...) } +// Updates for when a user is browsing the markdown listing +func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { + var cmds []tea.Cmd + + pages := len(m.getVisibleMarkdowns()) + + switch msg := msg.(type) { + // Handle keys + case tea.KeyMsg: + switch msg.String() { + case "k", "ctrl+k", "up", "shift+tab": + m.moveCursorUp() + + case "j", "ctrl+j", "down", "tab": + m.moveCursorDown() + + // Go to the very start + case "home", "g": + m.paginator.Page = 0 + m.index = 0 + + // Go to the very end + case "end", "G": + m.paginator.Page = m.paginator.TotalPages - 1 + m.index = m.paginator.ItemsOnPage(pages) - 1 + + // Note: esc is only passed trough in stashStateFilterNotes and stashStateShowNews + case "esc": + m.state = stashStateReady + m.resetFiltering() + + // Open document + case "enter": + m.hideStatusMessage() + + if pages == 0 { + break + } + + // Load the document from the server. We'll handle the message + // that comes back in the main update function. + md := m.selectedMarkdown() + cmds = append(cmds, m.openMarkdown(md)) + + // Filter your notes + case "/": + m.hideStatusMessage() + + // Build values we'll filter against + for _, md := range m.markdowns { + md.buildFilterValue() + } + + m.filteredMarkdowns = m.getFilterableMarkdowns() + + m.paginator.Page = 0 + m.index = 0 + m.state = stashStateFilterNotes + m.filterInput.CursorEnd() + m.filterInput.Focus() + return textinput.Blink + + // Set note + case "m": + m.hideStatusMessage() + + if pages == 0 { + break + } + + md := m.selectedMarkdown() + isUserMarkdown := md.markdownType == StashedDocument || md.markdownType == ConvertedDocument + isSettingNote := m.state == stashStateSettingNote + isPromptingDelete := m.state == stashStatePromptDelete + + if isUserMarkdown && !isSettingNote && !isPromptingDelete { + m.state = stashStateSettingNote + m.noteInput.SetValue(md.Note) + m.noteInput.CursorEnd() + return textinput.Blink + } + + // Show news + case "n": + if m.state == stashStateShowNews { + // Exit news + m.state = stashStateReady + m.resetFiltering() + } else { + // Show news + m.hideStatusMessage() + m.paginator.Page = 0 + m.index = 0 + m.state = stashStateShowNews + m.setTotalPages() + } + + return nil + + // Stash + case "s": + if pages == 0 || m.general.authStatus != authOK || m.selectedMarkdown() == nil { + break + } + + md := m.selectedMarkdown() + + _, isBeingStashed := m.filesStashing[md.localPath] + isLocalMarkdown := md.markdownType == LocalDocument + markdownPathMissing := md.localPath == "" + + if isBeingStashed || !isLocalMarkdown || markdownPathMissing { + if debug && isBeingStashed { + log.Printf("refusing to stash markdown; we're already stashing %s", md.localPath) + } else if debug && isLocalMarkdown && markdownPathMissing { + log.Printf("refusing to stash markdown; local path is empty: %#v", md) + } + break + } + + // Checks passed; perform the stash + m.filesStashing[md.localPath] = struct{}{} + cmds = append(cmds, stashDocument(m.general.cc, *md)) + + if m.loadingDone() && !m.spinner.Visible() { + m.spinner.Start() + cmds = append(cmds, spinner.Tick) + } + + // Prompt for deletion + case "x": + m.hideStatusMessage() + + if pages == 0 { + break + } + + t := m.selectedMarkdown().markdownType + isUserMarkdown := t == StashedDocument || t == ConvertedDocument + isValidState := m.state != stashStateSettingNote + + if isUserMarkdown && isValidState { + m.state = stashStatePromptDelete + } + + // Show errors + case "!": + if m.err != nil && m.state == stashStateReady { + m.state = stashStateShowingError + return nil + } + } + } + + // Update paginator. Pagination key handling is done here, but it could + // also be moved up to this level, in which case we'd use model methods + // like model.PageUp(). + newPaginatorModel, cmd := m.paginator.Update(msg) + m.paginator = newPaginatorModel + cmds = append(cmds, cmd) + + // Extra paginator keystrokes + if key, ok := msg.(tea.KeyMsg); ok { + switch key.String() { + case "b", "u": + m.paginator.PrevPage() + case "f", "d": + m.paginator.NextPage() + } + } + + // Keep the index in bounds when paginating + itemsOnPage := m.paginator.ItemsOnPage(len(m.getVisibleMarkdowns())) + if m.index > itemsOnPage-1 { + m.index = max(0, itemsOnPage-1) + } + + // If we're on the last page and we haven't loaded everything, get + // more stuff. + if m.paginator.OnLastPage() && !m.loadingFromNetwork && !m.stashFullyLoaded { + m.page++ + m.loadingFromNetwork = true + cmds = append(cmds, loadStash(*m)) + } + + return tea.Batch(cmds...) +} + +// Updates for when a user is being prompted whether or not to delete a +// markdown item. +func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { + if msg, ok := msg.(tea.KeyMsg); ok { + switch msg.String() { + + // Confirm deletion + case "y": + if m.state != stashStatePromptDelete { + break + } + + smd := m.selectedMarkdown() + for i, md := range m.markdowns { + if md != smd { + continue + } + + if md.markdownType == ConvertedDocument { + // If document was stashed during this session, convert it + // back to a local file. + md.markdownType = LocalDocument + md.Note = stripAbsolutePath(m.markdowns[i].localPath, m.general.cwd) + } else { + // Delete optimistically and remove the stashed item + // before we've received a success response. + if m.isFiltering() { + mds, _ := deleteMarkdown(m.filteredMarkdowns, m.markdowns[i]) + m.filteredMarkdowns = mds + } + mds, _ := deleteMarkdown(m.markdowns, m.markdowns[i]) + m.markdowns = mds + } + } + + // Set state and delete + if m.isFiltering() { + m.state = stashStateShowFiltered + } else { + m.state = stashStateReady + } + + // Update pagination + m.setTotalPages() + + return deleteStashedItem(m.general.cc, smd.ID) + + default: + // Any other keys cancels deletion + m.state = stashStateReady + if m.filterInput.Value() != "" { + m.state = stashStateShowFiltered + } + return nil + + } + } + + return nil +} + +// Updates for when a user is in the filter editing interface +func (m *stashModel) handleFiltering(msg tea.Msg) tea.Cmd { + var cmds []tea.Cmd + + // Handle keys + if msg, ok := msg.(tea.KeyMsg); ok { + switch msg.String() { + case "esc": + // Cancel filtering + m.state = stashStateReady + m.resetFiltering() + case "enter", "tab", "shift+tab", "ctrl+k", "up", "ctrl+j", "down": + m.hideStatusMessage() + + if len(m.markdowns) == 0 { + break + } + + h := m.getVisibleMarkdowns() + + // If we've filtered down to nothing, clear the filter + if len(h) == 0 { + m.state = stashStateReady + m.resetFiltering() + break + } + + // When there's only one filtered markdown left we can just + // "open" it directly + if len(h) == 1 { + m.state = stashStateReady + m.resetFiltering() + cmds = append(cmds, m.openMarkdown(h[0])) + break + } + + m.filterInput.Blur() + + m.state = stashStateShowFiltered + if m.filterInput.Value() == "" { + m.state = stashStateReady + m.resetFiltering() + } + } + } + + // Update the filter text input component + newFilterInputModel, inputCmd := m.filterInput.Update(msg) + currentFilterVal := m.filterInput.Value() + newFilterVal := newFilterInputModel.Value() + m.filterInput = newFilterInputModel + cmds = append(cmds, inputCmd) + + // If the filtering input has changed, request updated filtering + if newFilterVal != currentFilterVal { + cmds = append(cmds, filterMarkdowns(*m)) + } + + // Update pagination + m.setTotalPages() + + return tea.Batch(cmds...) +} + +func (m *stashModel) handleNoteInput(msg tea.Msg) tea.Cmd { + var cmds []tea.Cmd + + if msg, ok := msg.(tea.KeyMsg); ok { + switch msg.String() { + case "esc": + // Cancel note + if m.filterInput.Value() != "" { + m.state = stashStateShowFiltered + } else { + m.state = stashStateReady + } + m.noteInput.Reset() + case "enter": + // Set new note + md := m.selectedMarkdown() + newNote := m.noteInput.Value() + cmd := saveDocumentNote(m.general.cc, md.ID, newNote) + md.Note = newNote + m.noteInput.Reset() + if m.filterInput.Value() != "" { + m.state = stashStateShowFiltered + } else { + m.state = stashStateReady + } + return cmd + } + } + + if m.shouldUpdateFilter() { + cmds = append(cmds, filterMarkdowns(*m)) + } + + // Update the note text input component + newNoteInputModel, noteInputCmd := m.noteInput.Update(msg) + m.noteInput = newNoteInputModel + cmds = append(cmds, noteInputCmd) + + return tea.Batch(cmds...) +} + // VIEW -func stashView(m stashModel) string { +func (m stashModel) view() string { var s string switch m.state { case stashStateShowingError: @@ -952,9 +992,9 @@ func stashHeaderView(m stashModel) string { } } - localItems := m.countMarkdowns(localMarkdown) - stashedItems := m.countMarkdowns(stashedMarkdown) + m.countMarkdowns(convertedMarkdown) - newsItems := m.countMarkdowns(newsMarkdown) + localItems := m.countMarkdowns(LocalDocument) + stashedItems := m.countMarkdowns(StashedDocument) + m.countMarkdowns(ConvertedDocument) + newsItems := m.countMarkdowns(NewsDocument) // Loading's finished and all we have is news. if !loading && localItems == 0 && stashedItems == 0 && newsItems == 0 { @@ -1033,8 +1073,8 @@ func stashHelpView(m stashModel) string { if numDocs > 0 { md := m.selectedMarkdown() - isStashed = md != nil && md.markdownType == stashedMarkdown - isLocal = md != nil && md.markdownType == localMarkdown + isStashed = md != nil && md.markdownType == StashedDocument + isLocal = md != nil && md.markdownType == LocalDocument } if m.state == stashStateSettingNote { @@ -1119,14 +1159,14 @@ func stashHelpViewBuilder(windowWidth int, sections ...string) string { // COMMANDS -func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { +func loadRemoteMarkdown(cc *charm.Client, id int, t DocumentType) tea.Cmd { return func() tea.Msg { var ( md *charm.Markdown err error ) - if t == stashedMarkdown || t == convertedMarkdown { + if t == StashedDocument || t == ConvertedDocument { md, err = cc.GetStashMarkdown(id) } else { md, err = cc.GetNewsMarkdown(id) @@ -1148,7 +1188,7 @@ func loadRemoteMarkdown(cc *charm.Client, id int, t markdownType) tea.Cmd { func loadLocalMarkdown(md *markdown) tea.Cmd { return func() tea.Msg { - if md.markdownType != localMarkdown { + if md.markdownType != LocalDocument { return errMsg{errors.New("could not load local file: not a local file")} } if md.localPath == "" { @@ -1183,12 +1223,13 @@ func deleteStashedItem(cc *charm.Client, id int) tea.Cmd { func filterMarkdowns(m stashModel) tea.Cmd { return func() tea.Msg { if m.filterInput.Value() == "" || !m.isFiltering() { - return filteredMarkdownMsg(m.markdowns) // return everything + return filteredMarkdownMsg(m.getFilterableMarkdowns()) // return everything } targets := []string{} + mds := m.getFilterableMarkdowns() - for _, t := range m.markdowns { + for _, t := range mds { targets = append(targets, t.filterValue) } @@ -1197,7 +1238,7 @@ func filterMarkdowns(m stashModel) tea.Cmd { filtered := []*markdown{} for _, r := range ranks { - filtered = append(filtered, m.markdowns[r.Index]) + filtered = append(filtered, mds[r.Index]) } return filteredMarkdownMsg(filtered) @@ -1212,11 +1253,11 @@ func deleteMarkdown(markdowns []*markdown, target *markdown) ([]*markdown, error for i, v := range markdowns { switch target.markdownType { - case localMarkdown, convertedMarkdown: + case LocalDocument, ConvertedDocument: if v.localPath == target.localPath { index = i } - case stashedMarkdown, newsMarkdown: + case StashedDocument, NewsDocument: if v.ID == target.ID { index = i } @@ -1235,64 +1276,3 @@ func deleteMarkdown(markdowns []*markdown, target *markdown) ([]*markdown, error return append(markdowns[:index], markdowns[index+1:]...), nil } - -// Normalize text to aid in the filtering process. In particular, we remove -// diacritics, "ö" becomes "o". -func normalize(in string) (string, error) { - t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC) - out, _, err := transform.String(t, in) - return out, err -} - -// Returns whether a given rune is a nonspacing mark (Mn is the key for -// nonspacing marks) -func isMn(r rune) bool { - return unicode.Is(unicode.Mn, r) -} - -// wrapMarkdowns wraps a *charm.Markdown with a *markdown in order to add some -// extra metadata. -func wrapMarkdowns(t markdownType, md []*charm.Markdown) (m []*markdown) { - for _, v := range md { - m = append(m, &markdown{ - markdownType: t, - Markdown: *v, - }) - } - return m -} - -func truncate(str string, num int) string { - return runewidth.Truncate(str, num, "…") -} - -var magnitudes = []humanize.RelTimeMagnitude{ - {D: time.Second, Format: "now", DivBy: time.Second}, - {D: 2 * time.Second, Format: "1 second %s", DivBy: 1}, - {D: time.Minute, Format: "%d seconds %s", DivBy: time.Second}, - {D: 2 * time.Minute, Format: "1 minute %s", DivBy: 1}, - {D: time.Hour, Format: "%d minutes %s", DivBy: time.Minute}, - {D: 2 * time.Hour, Format: "1 hour %s", DivBy: 1}, - {D: humanize.Day, Format: "%d hours %s", DivBy: time.Hour}, - {D: 2 * humanize.Day, Format: "1 day %s", DivBy: 1}, - {D: humanize.Week, Format: "%d days %s", DivBy: humanize.Day}, - {D: 2 * humanize.Week, Format: "1 week %s", DivBy: 1}, - {D: humanize.Month, Format: "%d weeks %s", DivBy: humanize.Week}, - {D: 2 * humanize.Month, Format: "1 month %s", DivBy: 1}, - {D: humanize.Year, Format: "%d months %s", DivBy: humanize.Month}, - {D: 18 * humanize.Month, Format: "1 year %s", DivBy: 1}, - {D: 2 * humanize.Year, Format: "2 years %s", DivBy: 1}, - {D: humanize.LongTime, Format: "%d years %s", DivBy: humanize.Year}, - {D: math.MaxInt64, Format: "a long while %s", DivBy: 1}, -} - -func relativeTime(then time.Time) string { - now := time.Now() - ago := now.Sub(then) - if ago < time.Minute { - return "just now" - } else if ago < humanize.Week { - return humanize.CustomRelTime(then, now, "ago", "from now", magnitudes) - } - return then.Format("02 Jan 2006 15:04 MST") -} diff --git a/ui/stashitem.go b/ui/stashitem.go index 4ee727e..79a2e47 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -23,18 +23,18 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { truncateTo = m.general.width - stashViewHorizontalPadding*2 gutter string title = md.Note - date = relativeTime(md.CreatedAt) + date = md.relativeTime() icon = "" ) switch md.markdownType { - case newsMarkdown: + case NewsDocument: if title == "" { title = "News" } else { title = newsPrefix + truncate(title, truncateTo-rw.StringWidth(newsPrefix)) } - case stashedMarkdown, convertedMarkdown: + case StashedDocument, ConvertedDocument: icon = fileListingStashIcon if title == "" { title = noMemoTitle @@ -81,7 +81,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { } else { // Regular (non-selected) items - if md.markdownType == newsMarkdown { + if md.markdownType == NewsDocument { gutter = " " if isFilteringNotes && m.filterInput.Value() == "" { diff --git a/ui/ui.go b/ui/ui.go index d46a112..0ab9788 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -16,6 +16,7 @@ import ( "github.com/charmbracelet/charm/keygen" "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glow/utils" + runewidth "github.com/mattn/go-runewidth" "github.com/muesli/gitcha" te "github.com/muesli/termenv" ) @@ -194,7 +195,7 @@ func newModel(cfg Config) tea.Model { } if cfg.DocumentTypes == 0 { - cfg.DocumentTypes = LocalDocuments | StashedDocuments | NewsDocuments + cfg.DocumentTypes = LocalDocument | StashedDocument | NewsDocument } general := general{ @@ -213,15 +214,16 @@ func newModel(cfg Config) tea.Model { func (m model) Init() tea.Cmd { var cmds []tea.Cmd + d := &m.general.cfg.DocumentTypes - if m.general.cfg.DocumentTypes&StashedDocuments != 0 || m.general.cfg.DocumentTypes&NewsDocuments != 0 { + if *d&StashedDocument != 0 || *d&NewsDocument != 0 { cmds = append(cmds, newCharmClient, spinner.Tick, ) } - if m.general.cfg.DocumentTypes&LocalDocuments != 0 { + if *d&LocalDocument != 0 { cmds = append(cmds, findLocalFiles(m)) } @@ -265,7 +267,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, tea.Quit } - m.stash, cmd = stashUpdate(msg, m.stash) + m.stash, cmd = m.stash.update(msg) return m, cmd } @@ -275,7 +277,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // If setting a note send all keys straight through case pagerStateSetNote: var batch []tea.Cmd - newPagerModel, cmd := m.pager.Update(msg) + newPagerModel, cmd := m.pager.update(msg) m.pager = newPagerModel batch = append(batch, cmd) return m, tea.Batch(batch...) @@ -337,7 +339,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } // Even though it failed, news/stash loading is finished - m.stash.loaded |= StashedDocuments | NewsDocuments + m.stash.loaded |= StashedDocument | NewsDocument m.stash.loadingFromNetwork = false } @@ -352,7 +354,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.keygenState = keygenFinished // Even though it failed, news/stash loading is finished - m.stash.loaded |= StashedDocuments | NewsDocuments + m.stash.loaded |= StashedDocument | NewsDocument m.stash.loadingFromNetwork = false case keygenSuccessMsg: @@ -381,7 +383,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // A note was saved to a document. This will have been done in the // pager, so we'll need to find the corresponding note in the stash. // So, pass the message to the stash for processing. - stashModel, cmd := stashUpdate(msg, m.stash) + stashModel, cmd := m.stash.update(msg) m.stash = stashModel return m, cmd @@ -389,7 +391,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Always pass these messages to the stash so we can keep it updated // about network activity, even if the user isn't currently viewing // the stash. - stashModel, cmd := stashUpdate(msg, m.stash) + stashModel, cmd := m.stash.update(msg) m.stash = stashModel return m, cmd @@ -417,12 +419,12 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Process children switch m.state { case stateShowStash: - newStashModel, cmd := stashUpdate(msg, m.stash) + newStashModel, cmd := m.stash.update(msg) m.stash = newStashModel cmds = append(cmds, cmd) case stateShowDocument: - newPagerModel, cmd := m.pager.Update(msg) + newPagerModel, cmd := m.pager.update(msg) m.pager = newPagerModel cmds = append(cmds, cmd) } @@ -439,7 +441,7 @@ func (m model) View() string { case stateShowDocument: return m.pager.View() default: - return stashView(m.stash) + return m.stash.view() } } @@ -637,7 +639,7 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { } // Turn local markdown into a newly stashed (converted) markdown - md.markdownType = convertedMarkdown + md.markdownType = ConvertedDocument md.CreatedAt = time.Now() // Set the note as the filename without the extension @@ -673,7 +675,7 @@ func waitForStatusMessageTimeout(appCtx applicationContext, t *time.Timer) tea.C // already done that. func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { md := &markdown{ - markdownType: localMarkdown, + markdownType: LocalDocument, localPath: res.Path, Markdown: charm.Markdown{ Note: stripAbsolutePath(res.Path, cwd), @@ -702,6 +704,10 @@ func indent(s string, n int) string { return b.String() } +func truncate(str string, num int) string { + return runewidth.Truncate(str, num, "…") +} + func min(a, b int) int { if a < b { return a From fc898831af8beea42794c1f88a5917191f620f05 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 25 Nov 2020 20:15:21 -0500 Subject: [PATCH 601/911] Now you can filter news too Also note that the main stash state and the filter state now operate independently. --- ui/stash.go | 77 +++++++++++++++++++------------------------------ ui/stashitem.go | 12 ++++---- ui/ui.go | 32 ++++++++++---------- 3 files changed, 50 insertions(+), 71 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index e954c57..5aa0379 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -51,14 +51,21 @@ const ( stashStateLoadingDocument stashStateSettingNote stashStateShowingError - stashStateFilterNotes - stashStateShowFiltered stashStateShowNews ) +type filterState int + +const ( + unfiltered filterState = iota + filtering // user is actively setting a filter + filterApplied // a filter is applied and user is not editing filter +) + type stashModel struct { general *general state stashState + filterState filterState err error spinner spinner.Model noteInput textinput.Model @@ -124,6 +131,7 @@ func (m *stashModel) setSize(width, height int) { } func (m *stashModel) resetFiltering() { + m.filterState = unfiltered m.filterInput.Reset() sort.Stable(markdownsByLocalFirst(m.markdowns)) m.filteredMarkdowns = nil @@ -132,14 +140,7 @@ func (m *stashModel) resetFiltering() { // Is a filter currently being applied? func (m stashModel) isFiltering() bool { - switch m.state { - case stashStateFilterNotes, stashStateShowFiltered: - return true - case stashStatePromptDelete, stashStateSettingNote: - return m.filterInput.Value() != "" - default: - return false - } + return m.filterState != unfiltered } // Should we be updating the filter? @@ -422,8 +423,7 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { // Stash or news results have come in from the server. // // With the stash, this doesn't mean the whole stash listing is loaded, - // but some we've finished checking for the stash, at least, so mark - // the stash as loaded here. + // but now know it can load, at least, so mark the stash as loaded here. var docs []*markdown switch msg := msg.(type) { @@ -507,14 +507,17 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { } } + if m.filterState == filtering { + cmds = append(cmds, m.handleFiltering(msg)) + return m, tea.Batch(cmds...) + } + // Updates per the current state switch m.state { - case stashStateReady, stashStateShowFiltered, stashStateShowNews: + case stashStateReady, stashStateShowNews: cmds = append(cmds, m.handleDocumentBrowsing(msg)) case stashStatePromptDelete: cmds = append(cmds, m.handleDeleteConfirmation(msg)) - case stashStateFilterNotes: - cmds = append(cmds, m.handleFiltering(msg)) case stashStateSettingNote: cmds = append(cmds, m.handleNoteInput(msg)) case stashStateShowingError: @@ -553,10 +556,9 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { m.paginator.Page = m.paginator.TotalPages - 1 m.index = m.paginator.ItemsOnPage(pages) - 1 - // Note: esc is only passed trough in stashStateFilterNotes and stashStateShowNews case "esc": - m.state = stashStateReady m.resetFiltering() + m.state = stashStateReady // Open document case "enter": @@ -584,7 +586,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { m.paginator.Page = 0 m.index = 0 - m.state = stashStateFilterNotes + m.filterState = filtering m.filterInput.CursorEnd() m.filterInput.Focus() return textinput.Blink @@ -750,13 +752,6 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { } } - // Set state and delete - if m.isFiltering() { - m.state = stashStateShowFiltered - } else { - m.state = stashStateReady - } - // Update pagination m.setTotalPages() @@ -765,10 +760,6 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { default: // Any other keys cancels deletion m.state = stashStateReady - if m.filterInput.Value() != "" { - m.state = stashStateShowFiltered - } - return nil } } @@ -785,7 +776,6 @@ func (m *stashModel) handleFiltering(msg tea.Msg) tea.Cmd { switch msg.String() { case "esc": // Cancel filtering - m.state = stashStateReady m.resetFiltering() case "enter", "tab", "shift+tab", "ctrl+k", "up", "ctrl+j", "down": m.hideStatusMessage() @@ -814,9 +804,8 @@ func (m *stashModel) handleFiltering(msg tea.Msg) tea.Cmd { m.filterInput.Blur() - m.state = stashStateShowFiltered + m.filterState = filterApplied if m.filterInput.Value() == "" { - m.state = stashStateReady m.resetFiltering() } } @@ -847,12 +836,8 @@ func (m *stashModel) handleNoteInput(msg tea.Msg) tea.Cmd { switch msg.String() { case "esc": // Cancel note - if m.filterInput.Value() != "" { - m.state = stashStateShowFiltered - } else { - m.state = stashStateReady - } m.noteInput.Reset() + m.state = stashStateReady case "enter": // Set new note md := m.selectedMarkdown() @@ -860,11 +845,7 @@ func (m *stashModel) handleNoteInput(msg tea.Msg) tea.Cmd { cmd := saveDocumentNote(m.general.cc, md.ID, newNote) md.Note = newNote m.noteInput.Reset() - if m.filterInput.Value() != "" { - m.state = stashStateShowFiltered - } else { - m.state = stashStateReady - } + m.state = stashStateReady return cmd } } @@ -890,7 +871,7 @@ func (m stashModel) view() string { return errorView(m.err, false) case stashStateLoadingDocument: s += " " + m.spinner.View() + " Loading document..." - case stashStateReady, stashStateSettingNote, stashStatePromptDelete, stashStateFilterNotes, stashStateShowFiltered, stashStateShowNews: + case stashStateReady, stashStateSettingNote, stashStatePromptDelete, stashStateShowNews: loadingIndicator := " " if !m.localOnly() && (!m.loadingDone() || m.loadingFromNetwork || m.spinner.Visible()) { @@ -926,7 +907,7 @@ func (m stashModel) view() string { logoOrFilter := glowLogoView(" Glow ") // If we're filtering we replace the logo with the filter field - if m.state == stashStateFilterNotes || m.state == stashStateShowFiltered { + if m.isFiltering() { logoOrFilter = m.filterInput.View() } else if m.state == stashStateShowNews { logoOrFilter += newsTitleStyle(" News ") @@ -1081,11 +1062,11 @@ func stashHelpView(m stashModel) string { h = append(h, "enter: confirm", "esc: cancel") } else if m.state == stashStatePromptDelete { h = append(h, "y: delete", "n: cancel") - } else if m.state == stashStateFilterNotes && numDocs == 1 { + } else if m.filterState == filtering && numDocs == 1 { h = append(h, "enter: open", "esc: cancel") - } else if m.state == stashStateFilterNotes && numDocs == 0 { + } else if m.filterState == filtering && numDocs == 0 { h = append(h, "enter/esc: cancel") - } else if m.state == stashStateFilterNotes { + } else if m.filterState == filtering { h = append(h, "enter: confirm", "esc: cancel", "ctrl+j/ctrl+k, ↑/↓: choose") } else if m.state == stashStateShowNews { h = append(h, "enter: open", "esc: return", "j/k, ↑/↓: choose", "q: quit") @@ -1093,7 +1074,7 @@ func stashHelpView(m stashModel) string { if len(m.markdowns) > 0 { h = append(h, "enter: open") } - if m.state == stashStateShowFiltered { + if m.filterState == filterApplied { h = append(h, "esc: clear filter") } if len(m.markdowns) > 1 { diff --git a/ui/stashitem.go b/ui/stashitem.go index 79a2e47..4cd265d 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -45,15 +45,15 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { } isSelected := index == m.index - isFilteringNotes := m.state == stashStateFilterNotes + isFiltering := m.filterState == filtering // If there are multiple items being filtered we don't highlight a selected // item in the results. If we've filtered down to one item, however, // highlight that first item since pressing return will open it. singleFilteredItem := - m.state == stashStateFilterNotes && len(m.getVisibleMarkdowns()) == 1 + isFiltering && len(m.getVisibleMarkdowns()) == 1 - if isSelected && !isFilteringNotes || singleFilteredItem { + if isSelected && !isFiltering || singleFilteredItem { // Selected item switch m.state { @@ -70,7 +70,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { default: gutter = dullFuchsiaFg(verticalLine) icon = dullFuchsiaFg(icon) - if m.state == stashStateShowFiltered || singleFilteredItem { + if m.filterState == filterApplied || singleFilteredItem { s := termenv.Style{}.Foreground(common.Fuschia.Color()) title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) } else { @@ -84,7 +84,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { if md.markdownType == NewsDocument { gutter = " " - if isFilteringNotes && m.filterInput.Value() == "" { + if isFiltering && m.filterInput.Value() == "" { title = dimIndigoFg(title) date = dimSubtleIndigoFg(date) } else { @@ -92,7 +92,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) date = subtleIndigoFg(date) } - } else if isFilteringNotes && m.filterInput.Value() == "" { + } else if isFiltering && m.filterInput.Value() == "" { icon = dimGreenFg(icon) if title == noMemoTitle { title = dimWarmGrayFg(title) diff --git a/ui/ui.go b/ui/ui.go index 0ab9788..213812c 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -164,15 +164,10 @@ type model struct { // method alters the model we also need to send along any commands returned. func (m *model) unloadDocument() []tea.Cmd { m.state = stateShowStash + m.stash.state = stashStateReady m.pager.unload() m.pager.showHelp = false - if m.stash.filterInput.Value() == "" { - m.stash.state = stashStateReady - } else { - m.stash.state = stashStateShowFiltered - } - var batch []tea.Cmd if m.pager.viewport.HighPerformanceRendering { batch = append(batch, tea.ClearScrollArea) @@ -250,19 +245,22 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch m.state { case stateShowStash: - switch m.stash.state { - - // Send q/esc through in these cases - case stashStateSettingNote, stashStatePromptDelete, - stashStateShowingError, stashStateFilterNotes, - stashStateShowFiltered, stashStateShowNews: - - // If we're fitering, only send esc through so we can clear - // the filter results. Q quits as normal. - if m.stash.state == stashStateShowFiltered && msg.String() == "q" { + // Q quits if we're filtering, but we still send esc though. + if m.stash.isFiltering() { + if msg.String() == "q" { return m, tea.Quit } - // Q also quits glow when displaying only newsitems + m.stash, cmd = m.stash.update(msg) + return m, cmd + } + + // Send q/esc through in these cases + switch m.stash.state { + case stashStateSettingNote, stashStatePromptDelete, + stashStateShowingError, stashStateShowNews: + + // Q also quits glow when displaying only newsitems. Esc + // still passes through. if m.stash.state == stashStateShowNews && msg.String() == "q" { return m, tea.Quit } From 2748e75165c04e3bbe15decc66a9216a24b9f2bf Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 25 Nov 2020 21:33:44 -0500 Subject: [PATCH 602/911] If we're offline disable the news section --- ui/stash.go | 4 ++++ ui/ui.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 5aa0379..a58fbd6 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -613,6 +613,10 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Show news case "n": + if m.general.authStatus == authFailed { + // If we're offline disable the news section + return nil + } if m.state == stashStateShowNews { // Exit news m.state = stashStateReady diff --git a/ui/ui.go b/ui/ui.go index 213812c..a4f2c6a 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -147,8 +147,8 @@ type general struct { type model struct { general *general - keygenState keygenState state state + keygenState keygenState fatalErr error // Sub-models From dd9179a9ae323e220da469bef61bcf79ff6a976d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 25 Nov 2020 21:36:29 -0500 Subject: [PATCH 603/911] Remove "News:" prefix from news items --- ui/markdown.go | 5 ----- ui/stashitem.go | 3 +-- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/ui/markdown.go b/ui/markdown.go index c108b2a..91679b4 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -47,11 +47,6 @@ func (m *markdown) buildFilterValue() { m.filterValue = m.Note } - if m.markdownType == NewsDocument { - m.filterValue = "News: " + note - return - } - m.filterValue = note } diff --git a/ui/stashitem.go b/ui/stashitem.go index 4cd265d..24325d1 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -12,7 +12,6 @@ import ( ) const ( - newsPrefix = "News: " verticalLine = "│" noMemoTitle = "No Memo" fileListingStashIcon = "• " @@ -32,7 +31,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { if title == "" { title = "News" } else { - title = newsPrefix + truncate(title, truncateTo-rw.StringWidth(newsPrefix)) + title = truncate(title, truncateTo) } case StashedDocument, ConvertedDocument: icon = fileListingStashIcon From 15494e99b4ec45ec2e990f14da3c189f3429fc26 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 25 Nov 2020 22:08:24 -0500 Subject: [PATCH 604/911] Also disable news if we're in local-only mode --- ui/stash.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index a58fbd6..bc0775b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -107,7 +107,7 @@ type stashModel struct { } func (m stashModel) localOnly() bool { - return m.general.cfg.DocumentTypes == LocalDocument + return m.general.cfg.DocumentTypes^LocalDocument == 0 } func (m stashModel) stashedOnly() bool { @@ -119,6 +119,12 @@ func (m stashModel) loadingDone() bool { return m.loaded == m.general.cfg.DocumentTypes } +// Returns whether or not we're online. That is, when "local-only" mode is +// disabled and we've authenticated successfully. +func (m stashModel) online() bool { + return !m.localOnly() && m.general.authStatus == authOK +} + func (m *stashModel) setSize(width, height int) { m.general.width = width m.general.height = height @@ -613,7 +619,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Show news case "n": - if m.general.authStatus == authFailed { + if !m.online() { // If we're offline disable the news section return nil } From 7fabcea06d817310b73b15aee6232944ef1610a7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 25 Nov 2020 22:49:49 -0500 Subject: [PATCH 605/911] Make stash note editing and deletion independent of main state --- ui/stash.go | 72 ++++++++++++++++++++++++++++--------------------- ui/stashitem.go | 6 ++--- ui/ui.go | 3 +-- 3 files changed, 46 insertions(+), 35 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index bc0775b..8e77caa 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -43,13 +43,11 @@ type filteredMarkdownMsg []*markdown // MODEL -type stashState int +type stashViewState int const ( - stashStateReady stashState = iota - stashStatePromptDelete + stashStateReady stashViewState = iota stashStateLoadingDocument - stashStateSettingNote stashStateShowingError stashStateShowNews ) @@ -62,10 +60,19 @@ const ( filterApplied // a filter is applied and user is not editing filter ) +type selectionState int + +const ( + selectionIdle = iota + selectionSettingNote + selectionPromptingDelete +) + type stashModel struct { general *general - state stashState + state stashViewState filterState filterState + selectionState selectionState err error spinner spinner.Model noteInput textinput.Model @@ -153,7 +160,7 @@ func (m stashModel) isFiltering() bool { func (m stashModel) shouldUpdateFilter() bool { // If we're in the middle of setting a note don't update the filter so that // the focus won't jump around. - return m.isFiltering() && m.state != stashStateSettingNote + return m.isFiltering() && m.selectionState != selectionSettingNote } // Sets the total paginator pages according to the amount of markdowns for the @@ -518,14 +525,19 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { return m, tea.Batch(cmds...) } + switch m.selectionState { + case selectionSettingNote: + cmds = append(cmds, m.handleNoteInput(msg)) + return m, tea.Batch(cmds...) + case selectionPromptingDelete: + cmds = append(cmds, m.handleDeleteConfirmation(msg)) + return m, tea.Batch(cmds...) + } + // Updates per the current state switch m.state { case stashStateReady, stashStateShowNews: cmds = append(cmds, m.handleDocumentBrowsing(msg)) - case stashStatePromptDelete: - cmds = append(cmds, m.handleDeleteConfirmation(msg)) - case stashStateSettingNote: - cmds = append(cmds, m.handleNoteInput(msg)) case stashStateShowingError: // Any key exists the error view if _, ok := msg.(tea.KeyMsg); ok { @@ -607,11 +619,11 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { md := m.selectedMarkdown() isUserMarkdown := md.markdownType == StashedDocument || md.markdownType == ConvertedDocument - isSettingNote := m.state == stashStateSettingNote - isPromptingDelete := m.state == stashStatePromptDelete + isSettingNote := m.selectionState == selectionSettingNote + isPromptingDelete := m.selectionState == selectionPromptingDelete if isUserMarkdown && !isSettingNote && !isPromptingDelete { - m.state = stashStateSettingNote + m.selectionState = selectionSettingNote m.noteInput.SetValue(md.Note) m.noteInput.CursorEnd() return textinput.Blink @@ -672,16 +684,16 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { case "x": m.hideStatusMessage() - if pages == 0 { + validState := m.state == stashStateReady && + m.selectionState == selectionIdle + + if pages == 0 && !validState { break } t := m.selectedMarkdown().markdownType - isUserMarkdown := t == StashedDocument || t == ConvertedDocument - isValidState := m.state != stashStateSettingNote - - if isUserMarkdown && isValidState { - m.state = stashStatePromptDelete + if t == StashedDocument || t == ConvertedDocument { + m.selectionState = selectionPromptingDelete } // Show errors @@ -735,7 +747,7 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { // Confirm deletion case "y": - if m.state != stashStatePromptDelete { + if m.selectionState != selectionPromptingDelete { break } @@ -762,14 +774,14 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { } } - // Update pagination + m.selectionState = selectionIdle m.setTotalPages() return deleteStashedItem(m.general.cc, smd.ID) default: // Any other keys cancels deletion - m.state = stashStateReady + m.selectionState = selectionIdle } } @@ -847,7 +859,7 @@ func (m *stashModel) handleNoteInput(msg tea.Msg) tea.Cmd { case "esc": // Cancel note m.noteInput.Reset() - m.state = stashStateReady + m.selectionState = selectionIdle case "enter": // Set new note md := m.selectedMarkdown() @@ -855,7 +867,7 @@ func (m *stashModel) handleNoteInput(msg tea.Msg) tea.Cmd { cmd := saveDocumentNote(m.general.cc, md.ID, newNote) md.Note = newNote m.noteInput.Reset() - m.state = stashStateReady + m.selectionState = selectionIdle return cmd } } @@ -881,7 +893,7 @@ func (m stashModel) view() string { return errorView(m.err, false) case stashStateLoadingDocument: s += " " + m.spinner.View() + " Loading document..." - case stashStateReady, stashStateSettingNote, stashStatePromptDelete, stashStateShowNews: + case stashStateReady, stashStateShowNews: loadingIndicator := " " if !m.localOnly() && (!m.loadingDone() || m.loadingFromNetwork || m.spinner.Visible()) { @@ -900,10 +912,10 @@ func (m stashModel) view() string { if m.showStatusMessage { header = greenFg(m.statusMessage) } else { - switch m.state { - case stashStatePromptDelete: + switch m.selectionState { + case selectionPromptingDelete: header = redFg("Delete this item from your stash? ") + faintRedFg("(y/N)") - case stashStateSettingNote: + case selectionSettingNote: header = yellowFg("Set the memo for this item?") } } @@ -1068,9 +1080,9 @@ func stashHelpView(m stashModel) string { isLocal = md != nil && md.markdownType == LocalDocument } - if m.state == stashStateSettingNote { + if m.selectionState == selectionSettingNote { h = append(h, "enter: confirm", "esc: cancel") - } else if m.state == stashStatePromptDelete { + } else if m.selectionState == selectionPromptingDelete { h = append(h, "y: delete", "n: cancel") } else if m.filterState == filtering && numDocs == 1 { h = append(h, "enter: open", "esc: cancel") diff --git a/ui/stashitem.go b/ui/stashitem.go index 24325d1..b9e5304 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -55,13 +55,13 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { if isSelected && !isFiltering || singleFilteredItem { // Selected item - switch m.state { - case stashStatePromptDelete: + switch m.selectionState { + case selectionPromptingDelete: gutter = faintRedFg(verticalLine) icon = faintRedFg(icon) title = redFg(title) date = faintRedFg(date) - case stashStateSettingNote: + case selectionSettingNote: gutter = dullYellowFg(verticalLine) icon = "" title = m.noteInput.View() diff --git a/ui/ui.go b/ui/ui.go index a4f2c6a..27a756d 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -256,8 +256,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Send q/esc through in these cases switch m.stash.state { - case stashStateSettingNote, stashStatePromptDelete, - stashStateShowingError, stashStateShowNews: + case stashStateShowingError, stashStateShowNews: // Q also quits glow when displaying only newsitems. Esc // still passes through. From 4c63c62bfa36f70f91c8a0e492b4b7279d8c8562 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 27 Nov 2020 21:52:51 -0500 Subject: [PATCH 606/911] Replace bit-based document type implementation with a set-based one --- main.go | 5 +-- ui/doctypes.go | 78 +++++++++++++++++++++++++++++++++++++++++++++ ui/doctypes_test.go | 48 ++++++++++++++++++++++++++++ ui/markdown.go | 15 ++------- ui/pager.go | 12 +++---- ui/stash.go | 74 +++++++++++++++++++++--------------------- ui/stashitem.go | 6 ++-- ui/ui.go | 20 ++++++------ 8 files changed, 189 insertions(+), 69 deletions(-) create mode 100644 ui/doctypes.go create mode 100644 ui/doctypes_test.go diff --git a/main.go b/main.go index 8617487..aaf5df2 100644 --- a/main.go +++ b/main.go @@ -289,14 +289,15 @@ func runTUI(stashedOnly bool) error { defer f.Close() } + cfg.DocumentTypes = ui.NewDocTypeSet() cfg.ShowAllFiles = showAllFiles cfg.GlamourMaxWidth = width cfg.GlamourStyle = style if stashedOnly { - cfg.DocumentTypes = ui.StashedDocument | ui.NewsDocument + cfg.DocumentTypes.Add(ui.StashedDoc, ui.NewsDoc) } else if localOnly { - cfg.DocumentTypes = ui.LocalDocument + cfg.DocumentTypes.Add(ui.LocalDoc) } // Run Bubble Tea program diff --git a/ui/doctypes.go b/ui/doctypes.go new file mode 100644 index 0000000..ac35476 --- /dev/null +++ b/ui/doctypes.go @@ -0,0 +1,78 @@ +package ui + +// DocType represents a type of markdown document. +type DocType int + +// Available document types. +const ( + LocalDoc DocType = iota + StashedDoc + ConvertedDoc + NewsDoc +) + +// DocTypeSet is a set (in the mathematic sense) of document types. +type DocTypeSet map[DocType]struct{} + +// NewDocTypeSet returns a set of document types. +func NewDocTypeSet(t ...DocType) DocTypeSet { + d := DocTypeSet(make(map[DocType]struct{})) + if len(t) > 0 { + d.Add(t...) + } + return d +} + +// Add adds a document type of the set. +func (d *DocTypeSet) Add(t ...DocType) int { + for _, v := range t { + (*d)[v] = struct{}{} + } + return len(*d) +} + +// Had returns whether or not the set contains the given DocTypes. +func (d DocTypeSet) Contains(m ...DocType) bool { + matches := 0 + for _, t := range m { + if _, found := d[t]; found { + matches++ + } + } + return matches == len(m) +} + +// Difference return a DocumentType set that does not contain the given types. +func (d DocTypeSet) Difference(t ...DocType) DocTypeSet { + c := copyDocumentTypes(d) + for k := range c { + for _, docType := range t { + if k == docType { + delete(c, k) + break + } + } + } + return c +} + +// Equals returns whether or not the two sets are equal. +func (d DocTypeSet) Equals(other DocTypeSet) bool { + return d.Contains(other.asSlice()...) && len(d) == len(other) +} + +func (d DocTypeSet) asSlice() (agg []DocType) { + for k := range d { + agg = append(agg, k) + } + return +} + +// Return a copy of the given DocumentTypes map. +func copyDocumentTypes(d DocTypeSet) DocTypeSet { + c := make(map[DocType]struct{}) + for k, v := range d { + c[k] = v + } + return c +} diff --git a/ui/doctypes_test.go b/ui/doctypes_test.go new file mode 100644 index 0000000..e882b14 --- /dev/null +++ b/ui/doctypes_test.go @@ -0,0 +1,48 @@ +package ui + +import ( + "reflect" + "testing" +) + +func TestDocTypeContains(t *testing.T) { + d := NewDocTypeSet(LocalDoc) + + if !d.Contains(LocalDoc) { + t.Error("Contains reported it doesn't contain a value which it absolutely does contain") + } + + if d.Contains(NewsDoc) { + t.Error("Contains reported the set contains a value it certainly does not") + } +} + +func TestDocTypeDifference(t *testing.T) { + original := NewDocTypeSet(LocalDoc, StashedDoc, ConvertedDoc, NewsDoc) + difference := original.Difference(LocalDoc, NewsDoc) + expected := NewDocTypeSet(StashedDoc, ConvertedDoc) + + // Make sure the difference operation worked + if !reflect.DeepEqual(difference, expected) { + t.Errorf("difference returned %+v; expected %+v", difference, expected) + } + + // Make sure original set was not mutated + if reflect.DeepEqual(original, difference) { + t.Errorf("original set was mutated when it should not have been") + } +} + +func TestDocTypeEquality(t *testing.T) { + a := NewDocTypeSet(LocalDoc, StashedDoc) + b := NewDocTypeSet(LocalDoc, StashedDoc) + c := NewDocTypeSet(LocalDoc) + + if !a.Equals(b) { + t.Errorf("Equality test failed for %+v and %+v; expected true, got false", a, b) + } + + if a.Equals(c) { + t.Errorf("Equality test failed for %+v and %+v; expected false, got true", a, c) + } +} diff --git a/ui/markdown.go b/ui/markdown.go index 91679b4..746523b 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -13,18 +13,9 @@ import ( "golang.org/x/text/unicode/norm" ) -type DocumentType byte - -const ( - LocalDocument DocumentType = 1 << iota - StashedDocument - ConvertedDocument - NewsDocument -) - // markdown wraps charm.Markdown. type markdown struct { - markdownType DocumentType + markdownType DocType // Full path of a local markdown file. Only relevant to local documents and // those that have been stashed in this session. @@ -53,7 +44,7 @@ func (m *markdown) buildFilterValue() { // sortAsLocal returns whether or not this markdown should be sorted as though // it's a local markdown document. func (m markdown) sortAsLocal() bool { - return m.markdownType == LocalDocument || m.markdownType == ConvertedDocument + return m.markdownType == LocalDoc || m.markdownType == ConvertedDoc } // Sort documents with local files first, then by date. @@ -108,7 +99,7 @@ func isMn(r rune) bool { // wrapMarkdowns wraps a *charm.Markdown with a *markdown in order to add some // extra metadata. -func wrapMarkdowns(t DocumentType, md []*charm.Markdown) (m []*markdown) { +func wrapMarkdowns(t DocType, md []*charm.Markdown) (m []*markdown) { for _, v := range md { m = append(m, &markdown{ markdownType: t, diff --git a/ui/pager.go b/ui/pager.go index cb16a59..33ea846 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -215,8 +215,8 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { cmds = append(cmds, viewport.Sync(m.viewport)) } case "m": - isStashed := m.currentDocument.markdownType == StashedDocument || - m.currentDocument.markdownType == ConvertedDocument + isStashed := m.currentDocument.markdownType == StashedDoc || + m.currentDocument.markdownType == ConvertedDoc // Users can only set the note on user-stashed markdown if !isStashed { @@ -244,7 +244,7 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { } // Stash a local document - if m.state != pagerStateStashing && m.currentDocument.markdownType == LocalDocument { + if m.state != pagerStateStashing && m.currentDocument.markdownType == LocalDoc { m.state = pagerStateStashing m.spinner.Start() cmds = append( @@ -348,7 +348,7 @@ func (m pagerModel) statusBarView(b *strings.Builder) { percentToStringMagnitude float64 = 100.0 ) var ( - isStashed bool = m.currentDocument.markdownType == StashedDocument || m.currentDocument.markdownType == ConvertedDocument + isStashed bool = m.currentDocument.markdownType == StashedDoc || m.currentDocument.markdownType == ConvertedDoc showStatusMessage bool = m.state == pagerStateStatusMessage ) @@ -440,7 +440,7 @@ func (m pagerModel) setNoteView(b *strings.Builder) { func (m pagerModel) helpView() (s string) { memoOrStash := "m set memo" - if m.general.authStatus == authOK && m.currentDocument.markdownType == LocalDocument { + if m.general.authStatus == authOK && m.currentDocument.markdownType == LocalDoc { memoOrStash = "s stash this document" } @@ -453,7 +453,7 @@ func (m pagerModel) helpView() (s string) { "q quit", } - if m.currentDocument.markdownType == NewsDocument { + if m.currentDocument.markdownType == NewsDoc { deleteFromStringSlice(col1, 3) } diff --git a/ui/stash.go b/ui/stash.go index 8e77caa..27b7f43 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -77,9 +77,11 @@ type stashModel struct { spinner spinner.Model noteInput textinput.Model filterInput textinput.Model - stashFullyLoaded bool // have we loaded all available stashed documents from the server? - loadingFromNetwork bool // are we currently loading something from the network? - loaded DocumentType // load status for news, stash and local files loading; we find out exactly with bitmasking + stashFullyLoaded bool // have we loaded all available stashed documents from the server? + loadingFromNetwork bool // are we currently loading something from the network? + + // Tracks what exactly is loaded between the stash, news and local files + loaded DocTypeSet // The master set of markdown documents we're working with. markdowns []*markdown @@ -114,16 +116,15 @@ type stashModel struct { } func (m stashModel) localOnly() bool { - return m.general.cfg.DocumentTypes^LocalDocument == 0 + return m.general.cfg.DocumentTypes.Equals(NewDocTypeSet(LocalDoc)) } func (m stashModel) stashedOnly() bool { - return m.general.cfg.DocumentTypes&LocalDocument == 0 + return m.general.cfg.DocumentTypes.Equals(NewDocTypeSet(StashedDoc)) } func (m stashModel) loadingDone() bool { - // Do the types loaded match the types we want to have? - return m.loaded == m.general.cfg.DocumentTypes + return m.loaded.Equals(m.general.cfg.DocumentTypes) } // Returns whether or not we're online. That is, when "local-only" mode is @@ -251,7 +252,7 @@ func (m *stashModel) replaceLocalMarkdown(localPath string, newMarkdown *markdow } // Return the number of markdown documents of a given type. -func (m stashModel) countMarkdowns(t DocumentType) (found int) { +func (m stashModel) countMarkdowns(t DocType) (found int) { mds := m.getVisibleMarkdowns() if len(mds) == 0 { return @@ -265,7 +266,7 @@ func (m stashModel) countMarkdowns(t DocumentType) (found int) { } // Sift through the master markdown collection for the specified types. -func (m stashModel) getMarkdownByType(types ...DocumentType) []*markdown { +func (m stashModel) getMarkdownByType(types ...DocType) []*markdown { var agg []*markdown if len(m.markdowns) == 0 { @@ -291,19 +292,19 @@ func (m stashModel) getVisibleMarkdowns() []*markdown { } if m.state == stashStateShowNews { - return m.getMarkdownByType(NewsDocument) + return m.getMarkdownByType(NewsDoc) } - return m.getMarkdownByType(LocalDocument, StashedDocument, ConvertedDocument) + return m.getMarkdownByType(LocalDoc, StashedDoc, ConvertedDoc) } // Return the markdowns eligible to be filtered. func (m stashModel) getFilterableMarkdowns() []*markdown { if m.state == stashStateShowNews { - return m.getMarkdownByType(NewsDocument) + return m.getMarkdownByType(NewsDoc) } - return m.getMarkdownByType(LocalDocument, StashedDocument, ConvertedDocument) + return m.getMarkdownByType(LocalDoc, StashedDoc, ConvertedDoc) } // Command for opening a markdown document in the pager. Note that this also @@ -312,7 +313,7 @@ func (m *stashModel) openMarkdown(md *markdown) tea.Cmd { var cmd tea.Cmd m.state = stashStateLoadingDocument - if md.markdownType == LocalDocument { + if md.markdownType == LocalDoc { cmd = loadLocalMarkdown(md) } else { cmd = loadRemoteMarkdown(m.general.cc, md.ID, md.markdownType) @@ -402,6 +403,7 @@ func newStashModel(general *general) stashModel { filterInput: si, page: 1, paginator: p, + loaded: NewDocTypeSet(), loadingFromNetwork: true, filesStashing: make(map[string]struct{}), } @@ -420,17 +422,17 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { case stashLoadErrMsg: m.err = msg.err - m.loaded |= StashedDocument // still done, albeit unsuccessfully + m.loaded.Add(StashedDoc) // still done, albeit unsuccessfully m.stashFullyLoaded = true m.loadingFromNetwork = false case newsLoadErrMsg: m.err = msg.err - m.loaded |= NewsDocument // still done, albeit unsuccessfully + m.loaded.Add(NewsDoc) // still done, albeit unsuccessfully case localFileSearchFinished: // We're finished searching for local files - m.loaded |= LocalDocument + m.loaded.Add(LocalDoc) case gotStashMsg, gotNewsMsg: // Stash or news results have come in from the server. @@ -441,9 +443,9 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { switch msg := msg.(type) { case gotStashMsg: - m.loaded |= StashedDocument + m.loaded.Add(StashedDoc) m.loadingFromNetwork = false - docs = wrapMarkdowns(StashedDocument, msg) + docs = wrapMarkdowns(StashedDoc, msg) if len(msg) == 0 { // If the server comes back with nothing then we've got @@ -456,8 +458,8 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { } case gotNewsMsg: - m.loaded |= NewsDocument - docs = wrapMarkdowns(NewsDocument, msg) + m.loaded.Add(NewsDoc) + docs = wrapMarkdowns(NewsDoc, msg) } // If we're filtering build filter indexes immediately so any @@ -618,7 +620,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { } md := m.selectedMarkdown() - isUserMarkdown := md.markdownType == StashedDocument || md.markdownType == ConvertedDocument + isUserMarkdown := md.markdownType == StashedDoc || md.markdownType == ConvertedDoc isSettingNote := m.selectionState == selectionSettingNote isPromptingDelete := m.selectionState == selectionPromptingDelete @@ -659,7 +661,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { md := m.selectedMarkdown() _, isBeingStashed := m.filesStashing[md.localPath] - isLocalMarkdown := md.markdownType == LocalDocument + isLocalMarkdown := md.markdownType == LocalDoc markdownPathMissing := md.localPath == "" if isBeingStashed || !isLocalMarkdown || markdownPathMissing { @@ -692,7 +694,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { } t := m.selectedMarkdown().markdownType - if t == StashedDocument || t == ConvertedDocument { + if t == StashedDoc || t == ConvertedDoc { m.selectionState = selectionPromptingDelete } @@ -757,10 +759,10 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { continue } - if md.markdownType == ConvertedDocument { + if md.markdownType == ConvertedDoc { // If document was stashed during this session, convert it // back to a local file. - md.markdownType = LocalDocument + md.markdownType = LocalDoc md.Note = stripAbsolutePath(m.markdowns[i].localPath, m.general.cwd) } else { // Delete optimistically and remove the stashed item @@ -995,9 +997,9 @@ func stashHeaderView(m stashModel) string { } } - localItems := m.countMarkdowns(LocalDocument) - stashedItems := m.countMarkdowns(StashedDocument) + m.countMarkdowns(ConvertedDocument) - newsItems := m.countMarkdowns(NewsDocument) + localItems := m.countMarkdowns(LocalDoc) + stashedItems := m.countMarkdowns(StashedDoc) + m.countMarkdowns(ConvertedDoc) + newsItems := m.countMarkdowns(NewsDoc) // Loading's finished and all we have is news. if !loading && localItems == 0 && stashedItems == 0 && newsItems == 0 { @@ -1076,8 +1078,8 @@ func stashHelpView(m stashModel) string { if numDocs > 0 { md := m.selectedMarkdown() - isStashed = md != nil && md.markdownType == StashedDocument - isLocal = md != nil && md.markdownType == LocalDocument + isStashed = md != nil && md.markdownType == StashedDoc + isLocal = md != nil && md.markdownType == LocalDoc } if m.selectionState == selectionSettingNote { @@ -1162,14 +1164,14 @@ func stashHelpViewBuilder(windowWidth int, sections ...string) string { // COMMANDS -func loadRemoteMarkdown(cc *charm.Client, id int, t DocumentType) tea.Cmd { +func loadRemoteMarkdown(cc *charm.Client, id int, t DocType) tea.Cmd { return func() tea.Msg { var ( md *charm.Markdown err error ) - if t == StashedDocument || t == ConvertedDocument { + if t == StashedDoc || t == ConvertedDoc { md, err = cc.GetStashMarkdown(id) } else { md, err = cc.GetNewsMarkdown(id) @@ -1191,7 +1193,7 @@ func loadRemoteMarkdown(cc *charm.Client, id int, t DocumentType) tea.Cmd { func loadLocalMarkdown(md *markdown) tea.Cmd { return func() tea.Msg { - if md.markdownType != LocalDocument { + if md.markdownType != LocalDoc { return errMsg{errors.New("could not load local file: not a local file")} } if md.localPath == "" { @@ -1256,11 +1258,11 @@ func deleteMarkdown(markdowns []*markdown, target *markdown) ([]*markdown, error for i, v := range markdowns { switch target.markdownType { - case LocalDocument, ConvertedDocument: + case LocalDoc, ConvertedDoc: if v.localPath == target.localPath { index = i } - case StashedDocument, NewsDocument: + case StashedDoc, NewsDoc: if v.ID == target.ID { index = i } diff --git a/ui/stashitem.go b/ui/stashitem.go index b9e5304..9a9b273 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -27,13 +27,13 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { ) switch md.markdownType { - case NewsDocument: + case NewsDoc: if title == "" { title = "News" } else { title = truncate(title, truncateTo) } - case StashedDocument, ConvertedDocument: + case StashedDoc, ConvertedDoc: icon = fileListingStashIcon if title == "" { title = noMemoTitle @@ -80,7 +80,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { } else { // Regular (non-selected) items - if md.markdownType == NewsDocument { + if md.markdownType == NewsDoc { gutter = " " if isFiltering && m.filterInput.Value() == "" { diff --git a/ui/ui.go b/ui/ui.go index 27a756d..3380bad 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -41,7 +41,7 @@ type Config struct { GlamourStyle string // Which document types shall we show? We work though this with bitmasking. - DocumentTypes DocumentType + DocumentTypes DocTypeSet // For debugging the UI Logfile string `env:"GLOW_LOGFILE"` @@ -189,8 +189,8 @@ func newModel(cfg Config) tea.Model { } } - if cfg.DocumentTypes == 0 { - cfg.DocumentTypes = LocalDocument | StashedDocument | NewsDocument + if len(cfg.DocumentTypes) == 0 { + cfg.DocumentTypes.Add(LocalDoc, StashedDoc, NewsDoc) } general := general{ @@ -209,16 +209,16 @@ func newModel(cfg Config) tea.Model { func (m model) Init() tea.Cmd { var cmds []tea.Cmd - d := &m.general.cfg.DocumentTypes + d := m.general.cfg.DocumentTypes - if *d&StashedDocument != 0 || *d&NewsDocument != 0 { + if d.Contains(StashedDoc) || d.Contains(NewsDoc) { cmds = append(cmds, newCharmClient, spinner.Tick, ) } - if *d&LocalDocument != 0 { + if d.Contains(LocalDoc) { cmds = append(cmds, findLocalFiles(m)) } @@ -336,7 +336,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } // Even though it failed, news/stash loading is finished - m.stash.loaded |= StashedDocument | NewsDocument + m.stash.loaded.Add(StashedDoc, NewsDoc) m.stash.loadingFromNetwork = false } @@ -351,7 +351,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.keygenState = keygenFinished // Even though it failed, news/stash loading is finished - m.stash.loaded |= StashedDocument | NewsDocument + m.stash.loaded.Add(StashedDoc, NewsDoc) m.stash.loadingFromNetwork = false case keygenSuccessMsg: @@ -636,7 +636,7 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { } // Turn local markdown into a newly stashed (converted) markdown - md.markdownType = ConvertedDocument + md.markdownType = ConvertedDoc md.CreatedAt = time.Now() // Set the note as the filename without the extension @@ -672,7 +672,7 @@ func waitForStatusMessageTimeout(appCtx applicationContext, t *time.Timer) tea.C // already done that. func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { md := &markdown{ - markdownType: LocalDocument, + markdownType: LocalDoc, localPath: res.Path, Markdown: charm.Markdown{ Note: stripAbsolutePath(res.Path, cwd), From cffa611dfb347f5f85862276e683697b7c3c7a57 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 28 Nov 2020 18:30:51 -0500 Subject: [PATCH 607/911] When exiting pager or filter, stay in news if we were on news prior --- ui/doctypes.go | 5 ++- ui/markdown.go | 3 ++ ui/stash.go | 111 +++++++++++++++++++++++++++++-------------------- ui/ui.go | 22 +++++----- 4 files changed, 82 insertions(+), 59 deletions(-) diff --git a/ui/doctypes.go b/ui/doctypes.go index ac35476..630ace4 100644 --- a/ui/doctypes.go +++ b/ui/doctypes.go @@ -58,10 +58,11 @@ func (d DocTypeSet) Difference(t ...DocType) DocTypeSet { // Equals returns whether or not the two sets are equal. func (d DocTypeSet) Equals(other DocTypeSet) bool { - return d.Contains(other.asSlice()...) && len(d) == len(other) + return d.Contains(other.AsSlice()...) && len(d) == len(other) } -func (d DocTypeSet) asSlice() (agg []DocType) { +// AsSlice returns the set as a slice of document types. +func (d DocTypeSet) AsSlice() (agg []DocType) { for k := range d { agg = append(agg, k) } diff --git a/ui/markdown.go b/ui/markdown.go index 746523b..8ee40b1 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -29,6 +29,7 @@ type markdown struct { charm.Markdown } +// Generate the value we're doing to filter against. func (m *markdown) buildFilterValue() { note, err := normalize(m.Note) if err != nil { @@ -109,6 +110,7 @@ func wrapMarkdowns(t DocType, md []*charm.Markdown) (m []*markdown) { return m } +// Return the time in a human-readable format relative to the current time. func relativeTime(then time.Time) string { now := time.Now() ago := now.Sub(then) @@ -120,6 +122,7 @@ func relativeTime(then time.Time) string { return then.Format("02 Jan 2006 15:04 MST") } +// Magnitudes for relative time. var magnitudes = []humanize.RelTimeMagnitude{ {D: time.Second, Format: "now", DivBy: time.Second}, {D: 2 * time.Second, Format: "1 second %s", DivBy: 1}, diff --git a/ui/stash.go b/ui/stash.go index 27b7f43..515eaa4 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -43,23 +43,37 @@ type filteredMarkdownMsg []*markdown // MODEL +// High-level state of the application. type stashViewState int const ( stashStateReady stashViewState = iota stashStateLoadingDocument stashStateShowingError - stashStateShowNews ) +// Which types of documents we are showing. We use an int as the underlying +// type both for easy equality testing, and because the default state can have +// different types of docs depending on the user's preferences. For example, +// if the local-only flag is passed, the default state contains only documents +// of type local. Otherwise, it could contain stash, news, and converted types. +type stashDocState int + +const ( + stashShowDefaultDocs stashDocState = iota + stashShowNewsDocs +) + +// The current filtering state. type filterState int const ( - unfiltered filterState = iota - filtering // user is actively setting a filter - filterApplied // a filter is applied and user is not editing filter + unfiltered filterState = iota // no filter set + filtering // user is actively setting a filter + filterApplied // a filter is applied and user is not editing filter ) +// The state of the currently selected document. type selectionState int const ( @@ -70,15 +84,22 @@ const ( type stashModel struct { general *general - state stashViewState - filterState filterState - selectionState selectionState err error spinner spinner.Model noteInput textinput.Model filterInput textinput.Model stashFullyLoaded bool // have we loaded all available stashed documents from the server? loadingFromNetwork bool // are we currently loading something from the network? + viewState stashViewState + filterState filterState + selectionState selectionState + + // The types of documents we are showing + docState stashDocState + + // Maps document states to document types, i.e. the news state contains a + // set of type "news". + docStateMap map[stashDocState]DocTypeSet // Tracks what exactly is loaded between the stash, news and local files loaded DocTypeSet @@ -124,7 +145,7 @@ func (m stashModel) stashedOnly() bool { } func (m stashModel) loadingDone() bool { - return m.loaded.Equals(m.general.cfg.DocumentTypes) + return m.loaded.Equals(m.general.cfg.DocumentTypes.Difference(ConvertedDoc)) } // Returns whether or not we're online. That is, when "local-only" mode is @@ -291,27 +312,19 @@ func (m stashModel) getVisibleMarkdowns() []*markdown { return m.filteredMarkdowns } - if m.state == stashStateShowNews { - return m.getMarkdownByType(NewsDoc) - } - - return m.getMarkdownByType(LocalDoc, StashedDoc, ConvertedDoc) + return m.getMarkdownByType(m.docStateMap[m.docState].AsSlice()...) } // Return the markdowns eligible to be filtered. func (m stashModel) getFilterableMarkdowns() []*markdown { - if m.state == stashStateShowNews { - return m.getMarkdownByType(NewsDoc) - } - - return m.getMarkdownByType(LocalDoc, StashedDoc, ConvertedDoc) + return m.getMarkdownByType(m.docStateMap[m.docState].AsSlice()...) } // Command for opening a markdown document in the pager. Note that this also // alters the model. func (m *stashModel) openMarkdown(md *markdown) tea.Cmd { var cmd tea.Cmd - m.state = stashStateLoadingDocument + m.viewState = stashStateLoadingDocument if md.markdownType == LocalDoc { cmd = loadLocalMarkdown(md) @@ -406,6 +419,11 @@ func newStashModel(general *general) stashModel { loaded: NewDocTypeSet(), loadingFromNetwork: true, filesStashing: make(map[string]struct{}), + docState: stashShowDefaultDocs, + docStateMap: map[stashDocState]DocTypeSet{ + stashShowDefaultDocs: general.cfg.DocumentTypes.Difference(NewsDoc), + stashShowNewsDocs: NewDocTypeSet(NewsDoc), + }, } return m @@ -482,7 +500,7 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { case spinner.TickMsg: condition := !m.loadingDone() || m.loadingFromNetwork || - m.state == stashStateLoadingDocument || + m.viewState == stashStateLoadingDocument || len(m.filesStashing) > 0 || m.spinner.Visible() @@ -537,13 +555,13 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { } // Updates per the current state - switch m.state { - case stashStateReady, stashStateShowNews: + switch m.viewState { + case stashStateReady: cmds = append(cmds, m.handleDocumentBrowsing(msg)) case stashStateShowingError: // Any key exists the error view if _, ok := msg.(tea.KeyMsg); ok { - m.state = stashStateReady + m.viewState = stashStateReady } } @@ -577,8 +595,11 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { m.index = m.paginator.ItemsOnPage(pages) - 1 case "esc": - m.resetFiltering() - m.state = stashStateReady + if m.isFiltering() { + m.resetFiltering() + break + } + m.docState = stashShowDefaultDocs // Open document case "enter": @@ -637,16 +658,16 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // If we're offline disable the news section return nil } - if m.state == stashStateShowNews { + if m.docState == stashShowNewsDocs { // Exit news - m.state = stashStateReady + m.docState = stashShowDefaultDocs m.resetFiltering() } else { // Show news m.hideStatusMessage() m.paginator.Page = 0 m.index = 0 - m.state = stashStateShowNews + m.docState = stashShowNewsDocs m.setTotalPages() } @@ -686,7 +707,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { case "x": m.hideStatusMessage() - validState := m.state == stashStateReady && + validState := m.viewState == stashStateReady && m.selectionState == selectionIdle if pages == 0 && !validState { @@ -700,8 +721,8 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Show errors case "!": - if m.err != nil && m.state == stashStateReady { - m.state = stashStateShowingError + if m.err != nil && m.viewState == stashStateReady { + m.viewState = stashStateShowingError return nil } } @@ -812,7 +833,7 @@ func (m *stashModel) handleFiltering(msg tea.Msg) tea.Cmd { // If we've filtered down to nothing, clear the filter if len(h) == 0 { - m.state = stashStateReady + m.viewState = stashStateReady m.resetFiltering() break } @@ -820,7 +841,7 @@ func (m *stashModel) handleFiltering(msg tea.Msg) tea.Cmd { // When there's only one filtered markdown left we can just // "open" it directly if len(h) == 1 { - m.state = stashStateReady + m.viewState = stashStateReady m.resetFiltering() cmds = append(cmds, m.openMarkdown(h[0])) break @@ -890,12 +911,12 @@ func (m *stashModel) handleNoteInput(msg tea.Msg) tea.Cmd { func (m stashModel) view() string { var s string - switch m.state { + switch m.viewState { case stashStateShowingError: return errorView(m.err, false) case stashStateLoadingDocument: s += " " + m.spinner.View() + " Loading document..." - case stashStateReady, stashStateShowNews: + case stashStateReady: loadingIndicator := " " if !m.localOnly() && (!m.loadingDone() || m.loadingFromNetwork || m.spinner.Visible()) { @@ -925,7 +946,7 @@ func (m stashModel) view() string { // Only draw the normal header if we're not using the header area for // something else (like a prompt or status message) if header == "" { - header = stashHeaderView(m) + header = m.headerView() } logoOrFilter := glowLogoView(" Glow ") @@ -933,7 +954,7 @@ func (m stashModel) view() string { // If we're filtering we replace the logo with the filter field if m.isFiltering() { logoOrFilter = m.filterInput.View() - } else if m.state == stashStateShowNews { + } else if m.docState == stashShowNewsDocs { logoOrFilter += newsTitleStyle(" News ") } @@ -958,10 +979,10 @@ func (m stashModel) view() string { loadingIndicator, logoOrFilter, header, - stashPopulatedView(m), + m.populatedView(), blankLines, pagination, - stashHelpView(m), + m.miniHelpView(), ) } return "\n" + indent(s, stashIndent) @@ -975,7 +996,7 @@ func glowLogoView(text string) string { String() } -func stashHeaderView(m stashModel) string { +func (m stashModel) headerView() string { loading := !m.loadingDone() noMarkdowns := len(m.markdowns) == 0 @@ -1035,7 +1056,7 @@ func stashHeaderView(m stashModel) string { return common.Subtle(s) + maybeOffline } -func stashPopulatedView(m stashModel) string { +func (m stashModel) populatedView() string { var b strings.Builder mds := m.getVisibleMarkdowns() @@ -1068,7 +1089,7 @@ func stashPopulatedView(m stashModel) string { return b.String() } -func stashHelpView(m stashModel) string { +func (m stashModel) miniHelpView() string { var ( h []string isStashed bool @@ -1092,7 +1113,7 @@ func stashHelpView(m stashModel) string { h = append(h, "enter/esc: cancel") } else if m.filterState == filtering { h = append(h, "enter: confirm", "esc: cancel", "ctrl+j/ctrl+k, ↑/↓: choose") - } else if m.state == stashStateShowNews { + } else if m.docState == stashShowNewsDocs { h = append(h, "enter: open", "esc: return", "j/k, ↑/↓: choose", "q: quit") } else { if len(m.markdowns) > 0 { @@ -1118,12 +1139,12 @@ func stashHelpView(m stashModel) string { h = append(h, "/: filter") h = append(h, "q: quit") } - return stashHelpViewBuilder(m.general.width, h...) + return stashMiniHelpViewBuilder(m.general.width, h...) } // builds the help view from various sections pieces, truncating it if the view // would otherwise wrap to two lines. -func stashHelpViewBuilder(windowWidth int, sections ...string) string { +func stashMiniHelpViewBuilder(windowWidth int, sections ...string) string { if len(sections) == 0 { return "" } diff --git a/ui/ui.go b/ui/ui.go index 3380bad..f325f46 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -164,7 +164,7 @@ type model struct { // method alters the model we also need to send along any commands returned. func (m *model) unloadDocument() []tea.Cmd { m.state = stateShowStash - m.stash.state = stashStateReady + m.stash.viewState = stashStateReady m.pager.unload() m.pager.showHelp = false @@ -181,8 +181,7 @@ func (m *model) unloadDocument() []tea.Cmd { func newModel(cfg Config) tea.Model { if cfg.GlamourStyle == "auto" { - dbg := te.HasDarkBackground() - if dbg { + if te.HasDarkBackground() { cfg.GlamourStyle = "dark" } else { cfg.GlamourStyle = "light" @@ -190,7 +189,7 @@ func newModel(cfg Config) tea.Model { } if len(cfg.DocumentTypes) == 0 { - cfg.DocumentTypes.Add(LocalDoc, StashedDoc, NewsDoc) + cfg.DocumentTypes.Add(LocalDoc, StashedDoc, ConvertedDoc, NewsDoc) } general := general{ @@ -255,17 +254,21 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } // Send q/esc through in these cases - switch m.stash.state { - case stashStateShowingError, stashStateShowNews: + switch m.stash.viewState { + case stashStateReady: // Q also quits glow when displaying only newsitems. Esc // still passes through. - if m.stash.state == stashStateShowNews && msg.String() == "q" { + if msg.String() == "q" { return m, tea.Quit } m.stash, cmd = m.stash.update(msg) return m, cmd + + case stashStateShowingError: + m.stash, cmd = m.stash.update(msg) + return m, cmd } // Special cases for the pager @@ -304,11 +307,6 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Ctrl+C always quits no matter where in the application you are. case "ctrl+c": return m, tea.Quit - - // Repaint - case "ctrl+l": - // TODO - return m, nil } // Window size is received when starting up and on every resize From c4230ca3d9168acbfe36ccded78b446021e451b8 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 30 Nov 2020 12:17:30 -0500 Subject: [PATCH 608/911] Rework mini stash help view builder + stub out larger stash help --- ui/stash.go | 91 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 64 insertions(+), 27 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 515eaa4..ecb0ce0 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -24,7 +24,7 @@ const ( stashIndent = 1 stashViewItemHeight = 3 stashViewTopPadding = 5 - stashViewBottomPadding = 4 + stashViewBottomPadding = 3 stashViewHorizontalPadding = 6 ) @@ -93,6 +93,7 @@ type stashModel struct { viewState stashViewState filterState filterState selectionState selectionState + showFullHelp bool // The types of documents we are showing docState stashDocState @@ -188,7 +189,13 @@ func (m stashModel) shouldUpdateFilter() bool { // Sets the total paginator pages according to the amount of markdowns for the // current state. func (m *stashModel) setTotalPages() { - m.paginator.PerPage = max(1, (m.general.height-stashViewTopPadding-stashViewBottomPadding)/stashViewItemHeight) + _, helpHeight := m.helpView() + + availableHeight := m.general.height - + stashViewTopPadding - + stashViewBottomPadding - + helpHeight + m.paginator.PerPage = max(1, availableHeight/stashViewItemHeight) if pages := len(m.getVisibleMarkdowns()); pages < 1 { m.paginator.SetTotalPages(1) @@ -719,6 +726,10 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { m.selectionState = selectionPromptingDelete } + // Toggle full help + case "?": + m.showFullHelp = !m.showFullHelp + // Show errors case "!": if m.err != nil && m.viewState == stashStateReady { @@ -923,9 +934,11 @@ func (m stashModel) view() string { loadingIndicator = m.spinner.View() } + help, helpHeight := m.helpView() + // We need to fill any empty height with newlines so the footer reaches // the bottom. - numBlankLines := max(0, (m.general.height-stashViewTopPadding-stashViewBottomPadding)%stashViewItemHeight) + numBlankLines := max(0, (m.general.height-stashViewTopPadding-stashViewBottomPadding-helpHeight)%stashViewItemHeight) blankLines := "" if numBlankLines > 0 { blankLines = strings.Repeat("\n", numBlankLines) @@ -982,7 +995,7 @@ func (m stashModel) view() string { m.populatedView(), blankLines, pagination, - m.miniHelpView(), + help, ) } return "\n" + indent(s, stashIndent) @@ -1089,6 +1102,17 @@ func (m stashModel) populatedView() string { return b.String() } +func (m stashModel) helpView() (string, int) { + var s string + if m.showFullHelp { + s = m.fullHelpView() + } else { + s = m.miniHelpView() + } + + return s, strings.Count(s, "\n") +} + func (m stashModel) miniHelpView() string { var ( h []string @@ -1104,48 +1128,55 @@ func (m stashModel) miniHelpView() string { } if m.selectionState == selectionSettingNote { - h = append(h, "enter: confirm", "esc: cancel") + h = append(h, "enter", "confirm", "esc", "cancel") } else if m.selectionState == selectionPromptingDelete { - h = append(h, "y: delete", "n: cancel") + h = append(h, "y", "delete", "n", "cancel") } else if m.filterState == filtering && numDocs == 1 { - h = append(h, "enter: open", "esc: cancel") + h = append(h, "enter", "open", "esc", "cancel") } else if m.filterState == filtering && numDocs == 0 { h = append(h, "enter/esc: cancel") } else if m.filterState == filtering { - h = append(h, "enter: confirm", "esc: cancel", "ctrl+j/ctrl+k, ↑/↓: choose") + h = append(h, "enter", "confirm", "esc", "cancel", "ctrl+j/ctrl+k, ↑/↓", "choose") + h = append(h, "?", "help") } else if m.docState == stashShowNewsDocs { - h = append(h, "enter: open", "esc: return", "j/k, ↑/↓: choose", "q: quit") + h = append(h, "enter", "open", "esc", "return", "j/k, ↑/↓", "choose", "q", "quit") + h = append(h, "?", "help") } else { if len(m.markdowns) > 0 { - h = append(h, "enter: open") + h = append(h, "enter", "open") } if m.filterState == filterApplied { - h = append(h, "esc: clear filter") + h = append(h, "esc", "clear filter") } if len(m.markdowns) > 1 { - h = append(h, "j/k, ↑/↓: choose") + h = append(h, "j/k, ↑/↓", "choose") } if m.paginator.TotalPages > 1 { - h = append(h, "h/l, ←/→: page") + h = append(h, "h/l, ←/→", "page") } if isStashed { h = append(h, "x: delete", "m: set memo") } else if isLocal && m.general.authStatus == authOK { - h = append(h, "s: stash") + h = append(h, "s", "stash") } if m.err != nil { - h = append(h, "!: errors") + h = append(h, "!", "errors") } - h = append(h, "/: filter") - h = append(h, "q: quit") + h = append(h, "/", "filter") + h = append(h, "q", "quit") + h = append(h, "?", "help") } return stashMiniHelpViewBuilder(m.general.width, h...) } -// builds the help view from various sections pieces, truncating it if the view -// would otherwise wrap to two lines. -func stashMiniHelpViewBuilder(windowWidth int, sections ...string) string { - if len(sections) == 0 { +// Builds the help view from various sections pieces, truncating it if the view +// would otherwise wrap to two lines. Help view entires should come in as pairs, +// with the first being the key and the second being the help text. +func stashMiniHelpViewBuilder(windowWidth int, entries ...string) string { + if len(entries)%2 != 0 { + panic("mini help view entires must be set in pairs") + } + if len(entries) == 0 { return "" } @@ -1157,17 +1188,19 @@ func stashMiniHelpViewBuilder(windowWidth int, sections ...string) string { maxWidth = windowWidth - stashViewHorizontalPadding - truncationWidth ) - for i := 0; i < len(sections); i++ { + for i := 0; i < len(entries); i = i + 2 { + next = fmt.Sprintf("%s: %s", entries[i], entries[i+1]) + // If we need this more often we'll formalize something rather than // use an if clause/switch here. - switch sections[i] { - case "s: stash": - next = greenFg(sections[i]) + switch entries[i+1] { + case "stash": + next = greenFg(next) default: - next = stashHelpItemStyle(sections[i]) + next = stashHelpItemStyle(next) } - if i < len(sections)-1 { + if i < len(entries)-1 { next += dividerDot } @@ -1183,6 +1216,10 @@ func stashMiniHelpViewBuilder(windowWidth int, sections ...string) string { return s } +func (m stashModel) fullHelpView() string { + return "" +} + // COMMANDS func loadRemoteMarkdown(cc *charm.Client, id int, t DocType) tea.Cmd { From b50614c64cfbc92ff0a591cd412cedc83e6214e7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 30 Nov 2020 12:27:05 -0500 Subject: [PATCH 609/911] Let's try an an emoji for the news header --- ui/consts_unix.go | 1 + ui/consts_windows.go | 1 + ui/stash.go | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/consts_unix.go b/ui/consts_unix.go index fd13ad3..56f264e 100644 --- a/ui/consts_unix.go +++ b/ui/consts_unix.go @@ -4,4 +4,5 @@ package ui const ( pagerStashIcon = "🔒" + newsIcon = "⚡️" ) diff --git a/ui/consts_windows.go b/ui/consts_windows.go index 25f9851..f39c1e4 100644 --- a/ui/consts_windows.go +++ b/ui/consts_windows.go @@ -4,4 +4,5 @@ package ui const ( pagerStashIcon = "•" + newsIcon = "" ) diff --git a/ui/stash.go b/ui/stash.go index ecb0ce0..2c46bd1 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -968,7 +968,7 @@ func (m stashModel) view() string { if m.isFiltering() { logoOrFilter = m.filterInput.View() } else if m.docState == stashShowNewsDocs { - logoOrFilter += newsTitleStyle(" News ") + logoOrFilter += newsTitleStyle(" News ") + " " + newsIcon } var pagination string From 4febcb4bff02531edfbb632613b0599d29126fd1 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 30 Nov 2020 18:44:58 -0500 Subject: [PATCH 610/911] Render larger help view with the ? key --- ui/stash.go | 274 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 215 insertions(+), 59 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 2c46bd1..5ce79ed 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -22,9 +22,9 @@ import ( const ( stashIndent = 1 - stashViewItemHeight = 3 - stashViewTopPadding = 5 - stashViewBottomPadding = 3 + stashViewItemHeight = 3 // height of stash entry, including gap + stashViewTopPadding = 5 // logo, status bar, gaps + stashViewBottomPadding = 3 // pagination and gaps, but not help stashViewHorizontalPadding = 6 ) @@ -161,7 +161,7 @@ func (m *stashModel) setSize(width, height int) { // Update the paginator m.setTotalPages() - + // height of stash entry, including gap m.noteInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.noteInput.Prompt) m.filterInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.filterInput.Prompt) } @@ -193,8 +193,9 @@ func (m *stashModel) setTotalPages() { availableHeight := m.general.height - stashViewTopPadding - - stashViewBottomPadding - - helpHeight + helpHeight - + stashViewBottomPadding + m.paginator.PerPage = max(1, availableHeight/stashViewItemHeight) if pages := len(m.getVisibleMarkdowns()); pages < 1 { @@ -729,6 +730,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Toggle full help case "?": m.showFullHelp = !m.showFullHelp + m.setTotalPages() // Show errors case "!": @@ -938,7 +940,11 @@ func (m stashModel) view() string { // We need to fill any empty height with newlines so the footer reaches // the bottom. - numBlankLines := max(0, (m.general.height-stashViewTopPadding-stashViewBottomPadding-helpHeight)%stashViewItemHeight) + availHeight := m.general.height - + stashViewTopPadding - + helpHeight - + stashViewBottomPadding + numBlankLines := max(0, availHeight%stashViewItemHeight) blankLines := "" if numBlankLines > 0 { blankLines = strings.Repeat("\n", numBlankLines) @@ -988,7 +994,7 @@ func (m stashModel) view() string { } s += fmt.Sprintf( - "%s %s\n\n %s\n\n%s\n\n%s %s\n\n %s", + "%s %s\n\n %s\n\n%s\n\n%s %s\n\n%s", loadingIndicator, logoOrFilter, header, @@ -1103,22 +1109,12 @@ func (m stashModel) populatedView() string { } func (m stashModel) helpView() (string, int) { - var s string - if m.showFullHelp { - s = m.fullHelpView() - } else { - s = m.miniHelpView() - } - - return s, strings.Count(s, "\n") -} - -func (m stashModel) miniHelpView() string { var ( - h []string - isStashed bool - isLocal bool - numDocs = len(m.getVisibleMarkdowns()) + s string + isStashed, isLocal bool + numDocs = len(m.getVisibleMarkdowns()) + + always, navHelp, filterHelp, selectionHelp, sectionHelp, appHelp []string ) if numDocs > 0 { @@ -1128,54 +1124,72 @@ func (m stashModel) miniHelpView() string { } if m.selectionState == selectionSettingNote { - h = append(h, "enter", "confirm", "esc", "cancel") + navHelp = append(navHelp, "enter", "confirm", "esc", "cancel") + appHelp = append(appHelp, "q", "quit") } else if m.selectionState == selectionPromptingDelete { - h = append(h, "y", "delete", "n", "cancel") + selectionHelp = append(selectionHelp, "y", "delete", "n", "cancel") + appHelp = append(appHelp, "q", "quit") } else if m.filterState == filtering && numDocs == 1 { - h = append(h, "enter", "open", "esc", "cancel") + navHelp = append(navHelp, "enter", "open", "esc", "cancel") } else if m.filterState == filtering && numDocs == 0 { - h = append(h, "enter/esc: cancel") + always = append(always, "enter/esc", "cancel") } else if m.filterState == filtering { - h = append(h, "enter", "confirm", "esc", "cancel", "ctrl+j/ctrl+k, ↑/↓", "choose") - h = append(h, "?", "help") - } else if m.docState == stashShowNewsDocs { - h = append(h, "enter", "open", "esc", "return", "j/k, ↑/↓", "choose", "q", "quit") - h = append(h, "?", "help") + always = append(always, "enter", "confirm", "esc", "cancel", "ctrl+j/ctrl+k ↑/↓", "choose") } else { - if len(m.markdowns) > 0 { - h = append(h, "enter", "open") - } - if m.filterState == filterApplied { - h = append(h, "esc", "clear filter") - } - if len(m.markdowns) > 1 { - h = append(h, "j/k, ↑/↓", "choose") + if numDocs > 0 { + navHelp = append(navHelp, "enter", "open", "j/k ↑/↓", "choose") } if m.paginator.TotalPages > 1 { - h = append(h, "h/l, ←/→", "page") + navHelp = append(navHelp, "h/l ←/→", "page") + } + if m.filterState == filterApplied { + filterHelp = append(filterHelp, "/", "edit filter", "esc", "clear filter") + } else { + filterHelp = append(filterHelp, "/", "filter") } if isStashed { - h = append(h, "x: delete", "m: set memo") - } else if isLocal && m.general.authStatus == authOK { - h = append(h, "s", "stash") + selectionHelp = append(selectionHelp, "x", "delete", "m", "set memo") + } else if isLocal && m.online() { + selectionHelp = append(selectionHelp, "s", "stash") + } + if !m.isFiltering() { + if m.docState == stashShowNewsDocs { + sectionHelp = append(sectionHelp, "n", "home") + } else { + sectionHelp = append(sectionHelp, "n", "news") + } } if m.err != nil { - h = append(h, "!", "errors") + appHelp = append(appHelp, "!", "errors") } - h = append(h, "/", "filter") - h = append(h, "q", "quit") - h = append(h, "?", "help") + appHelp = append(appHelp, "q", "quit") } - return stashMiniHelpViewBuilder(m.general.width, h...) + + if m.showFullHelp { + if m.filterState != filtering { + appHelp = append(appHelp, "?", "close help") + } + s = m.fullHelpView(always, navHelp, filterHelp, selectionHelp, sectionHelp, appHelp) + } else { + if m.filterState != filtering { + appHelp = append(appHelp, "?", "help") + } + s = m.miniHelpView(concatStringSlices( + always, + filterHelp, + selectionHelp, + sectionHelp, + appHelp, + )...) + } + + return s, strings.Count(s, "\n") + 1 } // Builds the help view from various sections pieces, truncating it if the view // would otherwise wrap to two lines. Help view entires should come in as pairs, // with the first being the key and the second being the help text. -func stashMiniHelpViewBuilder(windowWidth int, entries ...string) string { - if len(entries)%2 != 0 { - panic("mini help view entires must be set in pairs") - } +func (m stashModel) miniHelpView(entries ...string) string { if len(entries) == 0 { return "" } @@ -1183,9 +1197,13 @@ func stashMiniHelpViewBuilder(windowWidth int, entries ...string) string { const truncationWidth = 1 // width of "…" var ( - s string - next string - maxWidth = windowWidth - stashViewHorizontalPadding - truncationWidth + next string + leftGutter = " " + maxWidth = m.general.width - + stashViewHorizontalPadding - + truncationWidth - + ansi.PrintableRuneWidth(leftGutter) + s = leftGutter ) for i := 0; i < len(entries); i = i + 2 { @@ -1200,7 +1218,7 @@ func stashMiniHelpViewBuilder(windowWidth int, entries ...string) string { next = stashHelpItemStyle(next) } - if i < len(entries)-1 { + if i < len(entries)-2 { next += dividerDot } @@ -1216,8 +1234,146 @@ func stashMiniHelpViewBuilder(windowWidth int, entries ...string) string { return s } -func (m stashModel) fullHelpView() string { - return "" +func (m stashModel) fullHelpView(cols ...[]string) string { + var ( + // Keys and values grouped by column + keys [][]string + vals [][]string + + longestCol int + + // Final rows grouped by column + assembledCols [][]string + ) + + // Get key/value pairs + for _, col := range cols { + if len(col) == 0 { + continue // ignore empty columns + } + + ks, vs := parseHelpTextPairs(col) + keys = append(keys, ks) + vals = append(vals, vs) + } + + // Find the longest column + for _, ks := range keys { + if len(ks) > longestCol { + longestCol = len(ks) + } + } + + // Build columns + for i := range keys { + rows := buildHelpTextColumn(keys[i], vals[i], longestCol) + assembledCols = append(assembledCols, rows) + } + + // Merge columns + return mergeStashHelpColumns(assembledCols...) +} + +// Separate a slice into keys and values. This will panic if it's passed an odd +// number of arguments. +func parseHelpTextPairs(pairs []string) (keys []string, vals []string) { + if len(pairs)%2 != 0 { + panic("help text group must have an even number of items") + } + + for i := 0; i < len(pairs); i = i + 2 { + keys = append(keys, pairs[i]) + vals = append(vals, pairs[i+1]) + } + + return +} + +// Build rows from keys and values. +func buildHelpTextColumn(keys, vals []string, colHeight int) (rows []string) { + if len(keys) != len(vals) { + panic("help text column keys and vals must be of equal lengths") + } + + keyWidth := widestString(keys...) + valWidth := widestString(vals...) + + for i := 0; i < colHeight; i++ { + var ( + b = strings.Builder{} + k, v string + ) + if i < len(keys) { + k = keys[i] + } + if i < len(vals) { + v = vals[i] + } + b.WriteString(k) + b.WriteString(strings.Repeat(" ", keyWidth-ansi.PrintableRuneWidth(k))) // pad keys + b.WriteString(" ") // gap + b.WriteString(v) + b.WriteString(strings.Repeat(" ", valWidth-ansi.PrintableRuneWidth(v))) // pad vals + rows = append(rows, b.String()) + } + + return +} + +// Merge columns together to build the help view. +func mergeStashHelpColumns(cols ...[]string) string { + const minimumHeight = 3 + + var longestCol int + for _, v := range cols { + n := len(v) + if n > longestCol { + longestCol = n + } + } + + if longestCol < minimumHeight { + longestCol = minimumHeight + } + + b := strings.Builder{} + for i := 0; i < longestCol; i++ { + for j, col := range cols { + if i >= len(col) { + // Skip if we're past the length of this column + continue + } + if j == 0 { + b.WriteString(" ") // gutter + } else if j > 0 { + b.WriteString(" ") // gap + } + b.WriteString(col[i]) + } + if i < longestCol-1 { + b.WriteRune('\n') + } + } + + return b.String() +} + +func concatStringSlices(s ...[]string) (agg []string) { + for _, v := range s { + agg = append(agg, v...) + } + return +} + +// Return the cell width of the widest of the given strings. +func widestString(s ...string) (max int) { + for _, v := range s { + n := ansi.PrintableRuneWidth(v) + if n > max { + max = n + } + } + return } // COMMANDS From 92d7696c76bdc0025ec29d050b4d201365a013de Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 30 Nov 2020 18:47:34 -0500 Subject: [PATCH 611/911] Disable news toggling while filtering --- ui/stash.go | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 5ce79ed..68a028f 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -662,7 +662,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Show news case "n": - if !m.online() { + if !m.online() || m.isFiltering() { // If we're offline disable the news section return nil } @@ -1109,12 +1109,33 @@ func (m stashModel) populatedView() string { } func (m stashModel) helpView() (string, int) { + numDocs := len(m.getVisibleMarkdowns()) + + if m.filterState == filtering { + var h []string + + switch numDocs { + case 0: + h = []string{"enter/esc", "cancel"} + case 1: + h = []string{"enter", "open", "esc", "cancel"} + default: + h = []string{"enter", "confirm", "esc", "cancel", "ctrl+j/ctrl+k ↑/↓", "choose"} + } + + if m.showFullHelp { + s := m.fullHelpView(h) + l := strings.Count(s, "\n") + 1 + return s, l + } + return m.miniHelpView(h...), 1 + } + var ( s string isStashed, isLocal bool - numDocs = len(m.getVisibleMarkdowns()) - always, navHelp, filterHelp, selectionHelp, sectionHelp, appHelp []string + navHelp, filterHelp, selectionHelp, sectionHelp, appHelp []string ) if numDocs > 0 { @@ -1129,12 +1150,6 @@ func (m stashModel) helpView() (string, int) { } else if m.selectionState == selectionPromptingDelete { selectionHelp = append(selectionHelp, "y", "delete", "n", "cancel") appHelp = append(appHelp, "q", "quit") - } else if m.filterState == filtering && numDocs == 1 { - navHelp = append(navHelp, "enter", "open", "esc", "cancel") - } else if m.filterState == filtering && numDocs == 0 { - always = append(always, "enter/esc", "cancel") - } else if m.filterState == filtering { - always = append(always, "enter", "confirm", "esc", "cancel", "ctrl+j/ctrl+k ↑/↓", "choose") } else { if numDocs > 0 { navHelp = append(navHelp, "enter", "open", "j/k ↑/↓", "choose") @@ -1169,13 +1184,12 @@ func (m stashModel) helpView() (string, int) { if m.filterState != filtering { appHelp = append(appHelp, "?", "close help") } - s = m.fullHelpView(always, navHelp, filterHelp, selectionHelp, sectionHelp, appHelp) + s = m.fullHelpView(navHelp, filterHelp, selectionHelp, sectionHelp, appHelp) } else { if m.filterState != filtering { appHelp = append(appHelp, "?", "help") } s = m.miniHelpView(concatStringSlices( - always, filterHelp, selectionHelp, sectionHelp, From d21802dbc6526da9c525ce1d38043cca1d67b08f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 30 Nov 2020 20:32:48 -0500 Subject: [PATCH 612/911] Style detailed help view and re-style mini help view --- ui/stash.go | 39 +++++++++++++++++++++++++-------------- ui/stashitem.go | 8 ++++---- ui/styles.go | 11 ++++++----- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 68a028f..91c028d 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -29,10 +29,9 @@ const ( ) var ( - stashHelpItemStyle styleFunc = newFgStyle(common.NewColorPair("#5C5C5C", "#9B9B9B")) stashTextInputPromptStyle styleFunc = newFgStyle(common.YellowGreen) - dividerDot string = te.String(" • ").Foreground(common.NewColorPair("#3C3C3C", "#DDDADA").Color()).String() - offlineHeaderNote string = te.String("(Offline)").Foreground(common.NewColorPair("#3C3C3C", "#DDDADA").Color()).String() + dividerDot string = darkGrayFg(" • ") + offlineHeaderNote string = darkGrayFg("(Offline)") ) // MSG @@ -403,7 +402,8 @@ func newStashModel(general *general) stashModel { p := paginator.NewModel() p.Type = paginator.Dots - p.InactiveDot = common.Subtle("•") + p.ActiveDot = brightGrayFg("•") + p.InactiveDot = darkGrayFg("•") ni := textinput.NewModel() ni.Prompt = stashTextInputPromptStyle("Memo: ") @@ -1181,13 +1181,13 @@ func (m stashModel) helpView() (string, int) { } if m.showFullHelp { - if m.filterState != filtering { + if m.filterState != filtering && m.selectionState == selectionIdle { appHelp = append(appHelp, "?", "close help") } s = m.fullHelpView(navHelp, filterHelp, selectionHelp, sectionHelp, appHelp) } else { - if m.filterState != filtering { - appHelp = append(appHelp, "?", "help") + if m.filterState != filtering && m.selectionState == selectionIdle { + appHelp = append(appHelp, "?", "more") } s = m.miniHelpView(concatStringSlices( filterHelp, @@ -1221,17 +1221,20 @@ func (m stashModel) miniHelpView(entries ...string) string { ) for i := 0; i < len(entries); i = i + 2 { - next = fmt.Sprintf("%s: %s", entries[i], entries[i+1]) + k := entries[i] + v := entries[i+1] - // If we need this more often we'll formalize something rather than - // use an if clause/switch here. - switch entries[i+1] { - case "stash": - next = greenFg(next) + switch k { + case "s": + k = greenFg(k) + v = dimGreenFg(v) default: - next = stashHelpItemStyle(next) + k = grayFg(k) + v = midGrayFg(v) } + next = fmt.Sprintf("%s %s", k, v) + if i < len(entries)-2 { next += dividerDot } @@ -1323,6 +1326,14 @@ func buildHelpTextColumn(keys, vals []string, colHeight int) (rows []string) { if i < len(vals) { v = vals[i] } + switch k { + case "s": + k = greenFg(k) + v = dimGreenFg(v) + default: + k = grayFg(k) + v = midGrayFg(v) + } b.WriteString(k) b.WriteString(strings.Repeat(" ", keyWidth-ansi.PrintableRuneWidth(k))) // pad keys b.WriteString(" ") // gap diff --git a/ui/stashitem.go b/ui/stashitem.go index 9a9b273..2f9894b 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -94,24 +94,24 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { } else if isFiltering && m.filterInput.Value() == "" { icon = dimGreenFg(icon) if title == noMemoTitle { - title = dimWarmGrayFg(title) + title = dimBrightGrayFg(title) } else { title = dimNormalFg(title) } gutter = " " - date = dimWarmGrayFg(date) + date = dimBrightGrayFg(date) } else { icon = greenFg(icon) if title == noMemoTitle { - title = warmGrayFg(title) + title = brightGrayFg(title) } else { s := termenv.Style{}.Foreground(common.NewColorPair("#dddddd", "#1a1a1a").Color()) title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) } gutter = " " - date = warmGrayFg(date) + date = brightGrayFg(date) } } diff --git a/ui/styles.go b/ui/styles.go index d30a24e..eb5cf01 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -15,14 +15,15 @@ var ( normalFg = newFgStyle(common.NewColorPair("#dddddd", "#1a1a1a")) dimNormalFg = newFgStyle(common.NewColorPair("#777777", "#A49FA5")) - warmGrayFg = newFgStyle(common.NewColorPair("#979797", "#847A85")) - dimWarmGrayFg = newFgStyle(common.NewColorPair("#4D4D4D", "#C2B8C2")) + brightGrayFg = newFgStyle(common.NewColorPair("#979797", "#847A85")) + dimBrightGrayFg = newFgStyle(common.NewColorPair("#4D4D4D", "#C2B8C2")) - grayFg = newFgStyle(common.NewColorPair("#626262", "#000")) - dimGrayFg = newFgStyle(common.NewColorPair("#3F3F3F", "#000")) + grayFg = newFgStyle(common.NewColorPair("#626262", "#909090")) + midGrayFg = newFgStyle(common.NewColorPair("#434343", "#BCBCBC")) + darkGrayFg = newFgStyle(common.NewColorPair("#3C3C3C", "#DDDADA")) greenFg = newFgStyle(common.NewColorPair("#04B575", "#04B575")) - dimGreenFg = newFgStyle(common.NewColorPair("#0B5137", "#82E1BF")) + dimGreenFg = newFgStyle(common.NewColorPair("#0B5137", "#72D2B0")) fuchsiaFg = newFgStyle(common.Fuschia) dimFuchsiaFg = newFgStyle(common.NewColorPair("#99519E", "#F1A8FF")) From 20a44c502561911feda6f06eb1a1619808c58d92 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 30 Nov 2020 21:57:26 -0500 Subject: [PATCH 613/911] Replace deprecated transforms.RemoveFunc with runes.Remove --- ui/markdown.go | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/ui/markdown.go b/ui/markdown.go index 8ee40b1..f9f0909 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -9,6 +9,7 @@ import ( "github.com/charmbracelet/charm" "github.com/dustin/go-humanize" + "golang.org/x/text/runes" "golang.org/x/text/transform" "golang.org/x/text/unicode/norm" ) @@ -85,19 +86,14 @@ func (m markdown) relativeTime() string { } // Normalize text to aid in the filtering process. In particular, we remove -// diacritics, "ö" becomes "o". +// diacritics, "ö" becomes "o". Note that Mn is the unicode key for nonspacing +// marks. func normalize(in string) (string, error) { - t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC) + t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC) out, _, err := transform.String(t, in) return out, err } -// Returns whether a given rune is a nonspacing mark (Mn is the key for -// nonspacing marks) -func isMn(r rune) bool { - return unicode.Is(unicode.Mn, r) -} - // wrapMarkdowns wraps a *charm.Markdown with a *markdown in order to add some // extra metadata. func wrapMarkdowns(t DocType, md []*charm.Markdown) (m []*markdown) { From c235780eee48776d7a9309e0a46b6c474f893ef3 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 30 Nov 2020 22:12:05 -0500 Subject: [PATCH 614/911] Appease the linter --- github.go | 4 ++-- gitlab.go | 4 ++-- ui/doctypes.go | 2 +- ui/pager.go | 2 +- ui/stash.go | 13 +++++-------- ui/stashitem.go | 3 --- ui/ui.go | 2 +- 7 files changed, 12 insertions(+), 18 deletions(-) diff --git a/github.go b/github.go index 3b944cc..7cf29bc 100644 --- a/github.go +++ b/github.go @@ -7,7 +7,7 @@ import ( "strings" ) -// isGitHubURL tests a string to determine if it is a well-structured GitHub URL +// isGitHubURL tests a string to determine if it is a well-structured GitHub URL. func isGitHubURL(s string) (string, bool) { if strings.HasPrefix(s, "github.com/") { s = "https://" + s @@ -21,7 +21,7 @@ func isGitHubURL(s string) (string, bool) { return u.String(), strings.ToLower(u.Host) == "github.com" } -// findGitHubREADME tries to find the correct README filename in a repository +// findGitHubREADME tries to find the correct README filename in a repository. func findGitHubREADME(s string) (*source, error) { u, err := url.ParseRequestURI(s) if err != nil { diff --git a/gitlab.go b/gitlab.go index 7bebc93..5ec89c7 100644 --- a/gitlab.go +++ b/gitlab.go @@ -7,7 +7,7 @@ import ( "strings" ) -// isGitLabURL tests a string to determine if it is a well-structured GitLab URL +// isGitLabURL tests a string to determine if it is a well-structured GitLab URL. func isGitLabURL(s string) (string, bool) { if strings.HasPrefix(s, "gitlab.com/") { s = "https://" + s @@ -21,7 +21,7 @@ func isGitLabURL(s string) (string, bool) { return u.String(), strings.ToLower(u.Host) == "gitlab.com" } -// findGitLabREADME tries to find the correct README filename in a repository +// findGitLabREADME tries to find the correct README filename in a repository. func findGitLabREADME(s string) (*source, error) { u, err := url.ParseRequestURI(s) if err != nil { diff --git a/ui/doctypes.go b/ui/doctypes.go index 630ace4..a7dfb0b 100644 --- a/ui/doctypes.go +++ b/ui/doctypes.go @@ -31,7 +31,7 @@ func (d *DocTypeSet) Add(t ...DocType) int { return len(*d) } -// Had returns whether or not the set contains the given DocTypes. +// Contains returns whether or not the set contains the given DocTypes. func (d DocTypeSet) Contains(m ...DocType) bool { matches := 0 for _, t := range m { diff --git a/ui/pager.go b/ui/pager.go index 33ea846..6eaa041 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -35,7 +35,7 @@ var ( statusBarNoteFg = common.NewColorPair("#7D7D7D", "#656565") statusBarBg = common.NewColorPair("#242424", "#E6E6E6") - // Styling funcs + // Styling funcs. statusBarScrollPosStyle = newStyle(common.NewColorPair("#5A5A5A", "#949494"), statusBarBg, false) statusBarNoteStyle = newStyle(statusBarNoteFg, statusBarBg, false) statusBarHelpStyle = newStyle(statusBarNoteFg, common.NewColorPair("#323232", "#DCDCDC"), false) diff --git a/ui/stash.go b/ui/stash.go index 91c028d..d464b22 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -237,7 +237,7 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) { } } -// Find a local markdown by its path and replace it +// Find a local markdown by its path and replace it. func (m *stashModel) replaceLocalMarkdown(localPath string, newMarkdown *markdown) error { var found bool @@ -576,7 +576,7 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { return m, tea.Batch(cmds...) } -// Updates for when a user is browsing the markdown listing +// Updates for when a user is browsing the markdown listing. func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { var cmds []tea.Cmd @@ -780,7 +780,6 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { - // Confirm deletion case "y": if m.selectionState != selectionPromptingDelete { @@ -818,14 +817,13 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { default: // Any other keys cancels deletion m.selectionState = selectionIdle - } } return nil } -// Updates for when a user is in the filter editing interface +// Updates for when a user is in the filter editing interface. func (m *stashModel) handleFiltering(msg tea.Msg) tea.Cmd { var cmds []tea.Cmd @@ -1032,9 +1030,8 @@ func (m stashModel) headerView() string { if loading && noMarkdowns { if m.stashedOnly() { return common.Subtle("Loading your stash...") - } else { - return common.Subtle("Looking for stuff...") + maybeOffline } + return common.Subtle("Looking for stuff...") + maybeOffline } localItems := m.countMarkdowns(LocalDoc) @@ -1491,7 +1488,7 @@ func filterMarkdowns(m stashModel) tea.Cmd { // ETC -// Delete a markdown from a slice of markdowns +// Delete a markdown from a slice of markdowns. func deleteMarkdown(markdowns []*markdown, target *markdown) ([]*markdown, error) { index := -1 diff --git a/ui/stashitem.go b/ui/stashitem.go index 2f9894b..8bfbea8 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -100,9 +100,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { } gutter = " " date = dimBrightGrayFg(date) - } else { - icon = greenFg(icon) if title == noMemoTitle { title = brightGrayFg(title) @@ -113,7 +111,6 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { gutter = " " date = brightGrayFg(date) } - } fmt.Fprintf(b, "%s %s%s\n", gutter, icon, title) diff --git a/ui/ui.go b/ui/ui.go index f325f46..e8d74f9 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -135,7 +135,7 @@ const ( keygenFinished ) -// General stuff we'll need to access in all models +// General stuff we'll need to access in all models. type general struct { cfg Config cc *charm.Client From 2eb5f46b01eee431c934c61ec3c4f6bde437ff01 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 30 Nov 2020 22:38:00 -0500 Subject: [PATCH 615/911] Make help renderer a little less functional and more structured --- ui/doctypes.go | 2 +- ui/stash.go | 293 -------------------------------------------- ui/stashhelp.go | 320 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 321 insertions(+), 294 deletions(-) create mode 100644 ui/stashhelp.go diff --git a/ui/doctypes.go b/ui/doctypes.go index a7dfb0b..a142985 100644 --- a/ui/doctypes.go +++ b/ui/doctypes.go @@ -69,7 +69,7 @@ func (d DocTypeSet) AsSlice() (agg []DocType) { return } -// Return a copy of the given DocumentTypes map. +// Return a copy of the given DoctTypes map. func copyDocumentTypes(d DocTypeSet) DocTypeSet { c := make(map[DocType]struct{}) for k, v := range d { diff --git a/ui/stash.go b/ui/stash.go index d464b22..61abfa6 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -1105,299 +1105,6 @@ func (m stashModel) populatedView() string { return b.String() } -func (m stashModel) helpView() (string, int) { - numDocs := len(m.getVisibleMarkdowns()) - - if m.filterState == filtering { - var h []string - - switch numDocs { - case 0: - h = []string{"enter/esc", "cancel"} - case 1: - h = []string{"enter", "open", "esc", "cancel"} - default: - h = []string{"enter", "confirm", "esc", "cancel", "ctrl+j/ctrl+k ↑/↓", "choose"} - } - - if m.showFullHelp { - s := m.fullHelpView(h) - l := strings.Count(s, "\n") + 1 - return s, l - } - return m.miniHelpView(h...), 1 - } - - var ( - s string - isStashed, isLocal bool - - navHelp, filterHelp, selectionHelp, sectionHelp, appHelp []string - ) - - if numDocs > 0 { - md := m.selectedMarkdown() - isStashed = md != nil && md.markdownType == StashedDoc - isLocal = md != nil && md.markdownType == LocalDoc - } - - if m.selectionState == selectionSettingNote { - navHelp = append(navHelp, "enter", "confirm", "esc", "cancel") - appHelp = append(appHelp, "q", "quit") - } else if m.selectionState == selectionPromptingDelete { - selectionHelp = append(selectionHelp, "y", "delete", "n", "cancel") - appHelp = append(appHelp, "q", "quit") - } else { - if numDocs > 0 { - navHelp = append(navHelp, "enter", "open", "j/k ↑/↓", "choose") - } - if m.paginator.TotalPages > 1 { - navHelp = append(navHelp, "h/l ←/→", "page") - } - if m.filterState == filterApplied { - filterHelp = append(filterHelp, "/", "edit filter", "esc", "clear filter") - } else { - filterHelp = append(filterHelp, "/", "filter") - } - if isStashed { - selectionHelp = append(selectionHelp, "x", "delete", "m", "set memo") - } else if isLocal && m.online() { - selectionHelp = append(selectionHelp, "s", "stash") - } - if !m.isFiltering() { - if m.docState == stashShowNewsDocs { - sectionHelp = append(sectionHelp, "n", "home") - } else { - sectionHelp = append(sectionHelp, "n", "news") - } - } - if m.err != nil { - appHelp = append(appHelp, "!", "errors") - } - appHelp = append(appHelp, "q", "quit") - } - - if m.showFullHelp { - if m.filterState != filtering && m.selectionState == selectionIdle { - appHelp = append(appHelp, "?", "close help") - } - s = m.fullHelpView(navHelp, filterHelp, selectionHelp, sectionHelp, appHelp) - } else { - if m.filterState != filtering && m.selectionState == selectionIdle { - appHelp = append(appHelp, "?", "more") - } - s = m.miniHelpView(concatStringSlices( - filterHelp, - selectionHelp, - sectionHelp, - appHelp, - )...) - } - - return s, strings.Count(s, "\n") + 1 -} - -// Builds the help view from various sections pieces, truncating it if the view -// would otherwise wrap to two lines. Help view entires should come in as pairs, -// with the first being the key and the second being the help text. -func (m stashModel) miniHelpView(entries ...string) string { - if len(entries) == 0 { - return "" - } - - const truncationWidth = 1 // width of "…" - - var ( - next string - leftGutter = " " - maxWidth = m.general.width - - stashViewHorizontalPadding - - truncationWidth - - ansi.PrintableRuneWidth(leftGutter) - s = leftGutter - ) - - for i := 0; i < len(entries); i = i + 2 { - k := entries[i] - v := entries[i+1] - - switch k { - case "s": - k = greenFg(k) - v = dimGreenFg(v) - default: - k = grayFg(k) - v = midGrayFg(v) - } - - next = fmt.Sprintf("%s %s", k, v) - - if i < len(entries)-2 { - next += dividerDot - } - - // Only this (and the following) help text items if we have the - // horizontal space - if ansi.PrintableRuneWidth(s)+ansi.PrintableRuneWidth(next) >= maxWidth { - s += common.Subtle("…") - break - } - - s += next - } - return s -} - -func (m stashModel) fullHelpView(cols ...[]string) string { - var ( - // Keys and values grouped by column - keys [][]string - vals [][]string - - longestCol int - - // Final rows grouped by column - assembledCols [][]string - ) - - // Get key/value pairs - for _, col := range cols { - if len(col) == 0 { - continue // ignore empty columns - } - - ks, vs := parseHelpTextPairs(col) - keys = append(keys, ks) - vals = append(vals, vs) - } - - // Find the longest column - for _, ks := range keys { - if len(ks) > longestCol { - longestCol = len(ks) - } - } - - // Build columns - for i := range keys { - rows := buildHelpTextColumn(keys[i], vals[i], longestCol) - assembledCols = append(assembledCols, rows) - } - - // Merge columns - return mergeStashHelpColumns(assembledCols...) -} - -// Separate a slice into keys and values. This will panic if it's passed an odd -// number of arguments. -func parseHelpTextPairs(pairs []string) (keys []string, vals []string) { - if len(pairs)%2 != 0 { - panic("help text group must have an even number of items") - } - - for i := 0; i < len(pairs); i = i + 2 { - keys = append(keys, pairs[i]) - vals = append(vals, pairs[i+1]) - } - - return -} - -// Build rows from keys and values. -func buildHelpTextColumn(keys, vals []string, colHeight int) (rows []string) { - if len(keys) != len(vals) { - panic("help text column keys and vals must be of equal lengths") - } - - keyWidth := widestString(keys...) - valWidth := widestString(vals...) - - for i := 0; i < colHeight; i++ { - var ( - b = strings.Builder{} - k, v string - ) - if i < len(keys) { - k = keys[i] - } - if i < len(vals) { - v = vals[i] - } - switch k { - case "s": - k = greenFg(k) - v = dimGreenFg(v) - default: - k = grayFg(k) - v = midGrayFg(v) - } - b.WriteString(k) - b.WriteString(strings.Repeat(" ", keyWidth-ansi.PrintableRuneWidth(k))) // pad keys - b.WriteString(" ") // gap - b.WriteString(v) - b.WriteString(strings.Repeat(" ", valWidth-ansi.PrintableRuneWidth(v))) // pad vals - rows = append(rows, b.String()) - } - - return -} - -// Merge columns together to build the help view. -func mergeStashHelpColumns(cols ...[]string) string { - const minimumHeight = 3 - - var longestCol int - for _, v := range cols { - n := len(v) - if n > longestCol { - longestCol = n - } - } - - if longestCol < minimumHeight { - longestCol = minimumHeight - } - - b := strings.Builder{} - for i := 0; i < longestCol; i++ { - for j, col := range cols { - if i >= len(col) { - // Skip if we're past the length of this column - continue - } - if j == 0 { - b.WriteString(" ") // gutter - } else if j > 0 { - b.WriteString(" ") // gap - } - b.WriteString(col[i]) - } - if i < longestCol-1 { - b.WriteRune('\n') - } - } - - return b.String() -} - -func concatStringSlices(s ...[]string) (agg []string) { - for _, v := range s { - agg = append(agg, v...) - } - return -} - -// Return the cell width of the widest of the given strings. -func widestString(s ...string) (max int) { - for _, v := range s { - n := ansi.PrintableRuneWidth(v) - if n > max { - max = n - } - } - return -} - // COMMANDS func loadRemoteMarkdown(cc *charm.Client, id int, t DocType) tea.Cmd { diff --git a/ui/stashhelp.go b/ui/stashhelp.go new file mode 100644 index 0000000..2ca57dc --- /dev/null +++ b/ui/stashhelp.go @@ -0,0 +1,320 @@ +package ui + +import ( + "fmt" + "strings" + + "github.com/charmbracelet/charm/ui/common" + "github.com/muesli/reflow/ansi" +) + +// helpEntry is a entry in a help menu containing values for a keystroke and +// it's associated action. +type helpEntry struct{ key, val string } + +// helpColumn is a group of helpEntries which will be rendered into a column. +type helpColumn []helpEntry + +// newHelpColumn creates a help column from pairs of string arguments +// represeting keys and values. If the arguements are not even (and therein +// not every key has a matching value) the function will panic. +func newHelpColumn(pairs ...string) (h helpColumn) { + if len(pairs)%2 != 0 { + panic("help text group must have an even number of items") + } + + for i := 0; i < len(pairs); i = i + 2 { + h = append(h, helpEntry{key: pairs[i], val: pairs[i+1]}) + } + + return +} + +// render returns styled and formatted rows from keys and values. +func (h helpColumn) render(height int) (rows []string) { + keyWidth, valWidth := h.maxWidths() + + for i := 0; i < height; i++ { + var ( + b = strings.Builder{} + k, v string + ) + if i < len(h) { + k = h[i].key + v = h[i].val + + switch k { + case "s": + k = greenFg(k) + v = dimGreenFg(v) + default: + k = grayFg(k) + v = midGrayFg(v) + } + } + b.WriteString(k) + b.WriteString(strings.Repeat(" ", keyWidth-ansi.PrintableRuneWidth(k))) // pad keys + b.WriteString(" ") // gap + b.WriteString(v) + b.WriteString(strings.Repeat(" ", valWidth-ansi.PrintableRuneWidth(v))) // pad vals + rows = append(rows, b.String()) + } + + return +} + +// maxWidths returns the widest key and values in the column, respectively. +func (h helpColumn) maxWidths() (maxKey int, maxVal int) { + for _, v := range h { + kw := ansi.PrintableRuneWidth(v.key) + vw := ansi.PrintableRuneWidth(v.val) + if kw > maxKey { + maxKey = kw + } + if vw > maxVal { + maxVal = vw + } + } + + return +} + +// helpView returns either the mini or full help view depending on the state of +// the model, as well as the total height of the help view. +func (m stashModel) helpView() (string, int) { + numDocs := len(m.getVisibleMarkdowns()) + + // Help for when we're filtering + if m.filterState == filtering { + var h []string + + switch numDocs { + case 0: + h = []string{"enter/esc", "cancel"} + case 1: + h = []string{"enter", "open", "esc", "cancel"} + default: + h = []string{"enter", "confirm", "esc", "cancel", "ctrl+j/ctrl+k ↑/↓", "choose"} + } + + return m.renderHelp(h) + } + + // Help for when we're interacting with a single document + switch m.selectionState { + case selectionSettingNote: + return m.renderHelp([]string{"enter", "confirm", "esc", "cancel"}, []string{"q", "quit"}) + case selectionPromptingDelete: + return m.renderHelp([]string{"y", "delete", "n", "cancel"}, []string{"q", "quit"}) + } + + var ( + isStashed bool + isStashable bool + navHelp []string + filterHelp []string + selectionHelp []string + sectionHelp []string + appHelp []string + ) + + if numDocs > 0 { + md := m.selectedMarkdown() + isStashed = md != nil && md.markdownType == StashedDoc + isStashable = md != nil && md.markdownType == LocalDoc && m.online() + } + + if numDocs > 0 { + navHelp = []string{"enter", "open", "j/k ↑/↓", "choose"} + } + + if m.paginator.TotalPages > 1 { + navHelp = append(navHelp, "h/l ←/→", "page") + } + + // If we're browsing a filtered set + if m.filterState == filterApplied { + filterHelp = []string{"/", "edit filter", "esc", "clear filter"} + } else { + filterHelp = []string{"/", "filter"} + } + + if isStashed { + selectionHelp = []string{"x", "delete", "m", "set memo"} + } else if isStashable { + selectionHelp = []string{"s", "stash"} + } + + // If there's no filtering happening + if !m.isFiltering() { + if m.docState == stashShowNewsDocs { + sectionHelp = []string{"n", "home"} + } else { + sectionHelp = []string{"n", "news"} + } + } + + // If there are errors + if m.err != nil { + appHelp = append(appHelp, "!", "errors") + } + + appHelp = append(appHelp, "q", "quit") + + // Detailed help + if m.showFullHelp { + if m.filterState != filtering { + appHelp = append(appHelp, "?", "close help") + } + return m.renderHelp(navHelp, filterHelp, selectionHelp, sectionHelp, appHelp) + } + + // Mini help + if m.filterState != filtering { + appHelp = append(appHelp, "?", "more") + } + return m.renderHelp(filterHelp, selectionHelp, sectionHelp, appHelp) +} + +// renderHelp returns the rendered help view and associated line height for +// the given groups of help items. +func (m stashModel) renderHelp(groups ...[]string) (string, int) { + if m.showFullHelp { + str := m.fullHelpView(groups...) + numLines := strings.Count(str, "\n") + 1 + return str, numLines + } + return m.miniHelpView(concatStringSlices(groups...)...), 1 +} + +// Builds the help view from various sections pieces, truncating it if the view +// would otherwise wrap to two lines. Help view entires should come in as pairs, +// with the first being the key and the second being the help text. +func (m stashModel) miniHelpView(entries ...string) string { + if len(entries) == 0 { + return "" + } + + var ( + truncationChar = common.Subtle("…") + truncationWidth = ansi.PrintableRuneWidth(truncationChar) + ) + + var ( + next string + leftGutter = " " + maxWidth = m.general.width - + stashViewHorizontalPadding - + truncationWidth - + ansi.PrintableRuneWidth(leftGutter) + s = leftGutter + ) + + for i := 0; i < len(entries); i = i + 2 { + k := entries[i] + v := entries[i+1] + + switch k { + case "s": + k = greenFg(k) + v = dimGreenFg(v) + default: + k = grayFg(k) + v = midGrayFg(v) + } + + next = fmt.Sprintf("%s %s", k, v) + + if i < len(entries)-2 { + next += dividerDot + } + + // Only this (and the following) help text items if we have the + // horizontal space + if ansi.PrintableRuneWidth(s)+ansi.PrintableRuneWidth(next) >= maxWidth { + s += truncationChar + break + } + + s += next + } + return s +} + +func (m stashModel) fullHelpView(groups ...[]string) string { + var ( + columns []helpColumn + tallestCol int + renderedCols [][]string // final rows grouped by column + ) + + // Get key/value pairs + for _, g := range groups { + if len(g) == 0 { + continue // ignore empty columns + } + + columns = append(columns, newHelpColumn(g...)) + } + + // Find the tallest column + for _, c := range columns { + if len(c) > tallestCol { + tallestCol = len(c) + } + } + + // Build columns + for _, c := range columns { + renderedCols = append(renderedCols, c.render(tallestCol)) + } + + // Merge columns + return mergeColumns(renderedCols...) +} + +// Merge columns together to build the help view. +func mergeColumns(cols ...[]string) string { + const minimumHeight = 3 + + // Find the tallest column + var tallestCol int + for _, v := range cols { + n := len(v) + if n > tallestCol { + tallestCol = n + } + } + + // Make sure the tallest column meets the minimum height + if tallestCol < minimumHeight { + tallestCol = minimumHeight + } + + b := strings.Builder{} + for i := 0; i < tallestCol; i++ { + for j, col := range cols { + if i >= len(col) { + continue // skip if we're past the length of this column + } + if j == 0 { + b.WriteString(" ") // gutter + } else if j > 0 { + b.WriteString(" ") // gap + } + b.WriteString(col[i]) + } + if i < tallestCol-1 { + b.WriteRune('\n') + } + } + + return b.String() +} + +func concatStringSlices(s ...[]string) (agg []string) { + for _, v := range s { + agg = append(agg, v...) + } + return +} From 1922bfaa68369df363555b67da1ca93f20530625 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 1 Dec 2020 16:31:08 -0500 Subject: [PATCH 616/911] Only show news in help if we're online --- ui/stashhelp.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stashhelp.go b/ui/stashhelp.go index 2ca57dc..a972ce6 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -146,7 +146,7 @@ func (m stashModel) helpView() (string, int) { } // If there's no filtering happening - if !m.isFiltering() { + if !m.isFiltering() && m.online() { if m.docState == stashShowNewsDocs { sectionHelp = []string{"n", "home"} } else { From fa6952ea8879d1d47ea761a1570a67e14320a655 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 1 Dec 2020 16:56:29 -0500 Subject: [PATCH 617/911] Simplify news header --- ui/consts_unix.go | 1 - ui/consts_windows.go | 1 - ui/stash.go | 2 +- ui/styles.go | 6 ------ 4 files changed, 1 insertion(+), 9 deletions(-) diff --git a/ui/consts_unix.go b/ui/consts_unix.go index 56f264e..fd13ad3 100644 --- a/ui/consts_unix.go +++ b/ui/consts_unix.go @@ -4,5 +4,4 @@ package ui const ( pagerStashIcon = "🔒" - newsIcon = "⚡️" ) diff --git a/ui/consts_windows.go b/ui/consts_windows.go index f39c1e4..25f9851 100644 --- a/ui/consts_windows.go +++ b/ui/consts_windows.go @@ -4,5 +4,4 @@ package ui const ( pagerStashIcon = "•" - newsIcon = "" ) diff --git a/ui/stash.go b/ui/stash.go index 61abfa6..16530b9 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -972,7 +972,7 @@ func (m stashModel) view() string { if m.isFiltering() { logoOrFilter = m.filterInput.View() } else if m.docState == stashShowNewsDocs { - logoOrFilter += newsTitleStyle(" News ") + " " + newsIcon + logoOrFilter += normalFg(" News ") } var pagination string diff --git a/ui/styles.go b/ui/styles.go index eb5cf01..479013f 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -41,12 +41,6 @@ var ( dullYellowFg = newFgStyle(common.NewColorPair("#9BA92F", "#6BCB94")) // renders light green on light backgrounds redFg = newFgStyle(common.Red) faintRedFg = newFgStyle(common.FaintRed) - - newsTitleStyle = newStyle( - common.NewColorPair(common.Indigo.String(), common.Cream.String()), - common.NewColorPair(common.Cream.String(), common.Indigo.String()), - true, - ) ) // Returns a termenv style with foreground and background options. From e179741544d393e1cbf08d8a45ef972b6b3fb762 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 3 Dec 2020 16:58:03 -0500 Subject: [PATCH 618/911] Lighten mid-gray color for dark backgrounds --- ui/styles.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/styles.go b/ui/styles.go index 479013f..ea86835 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -19,7 +19,7 @@ var ( dimBrightGrayFg = newFgStyle(common.NewColorPair("#4D4D4D", "#C2B8C2")) grayFg = newFgStyle(common.NewColorPair("#626262", "#909090")) - midGrayFg = newFgStyle(common.NewColorPair("#434343", "#BCBCBC")) + midGrayFg = newFgStyle(common.NewColorPair("#4A4A4A", "#B2B2B2")) darkGrayFg = newFgStyle(common.NewColorPair("#3C3C3C", "#DDDADA")) greenFg = newFgStyle(common.NewColorPair("#04B575", "#04B575")) From f680a9b96aa067a8ed7ae4417e2caf83a55c113d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 3 Dec 2020 17:33:09 -0500 Subject: [PATCH 619/911] Correct logic for checking when we're in stashed-only-mode --- ui/stash.go | 4 ++-- ui/ui.go | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 16530b9..feb5ab5 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -137,11 +137,11 @@ type stashModel struct { } func (m stashModel) localOnly() bool { - return m.general.cfg.DocumentTypes.Equals(NewDocTypeSet(LocalDoc)) + return m.general.cfg.localOnly() } func (m stashModel) stashedOnly() bool { - return m.general.cfg.DocumentTypes.Equals(NewDocTypeSet(StashedDoc)) + return m.general.cfg.stashedOnly() } func (m stashModel) loadingDone() bool { diff --git a/ui/ui.go b/ui/ui.go index e8d74f9..5ed2f87 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -49,6 +49,18 @@ type Config struct { GlamourEnabled bool `env:"GLOW_ENABLE_GLAMOUR" default:"true"` } +func (c Config) showLocalFiles() bool { + return c.DocumentTypes.Contains(LocalDoc) +} + +func (c Config) localOnly() bool { + return c.DocumentTypes.Equals(NewDocTypeSet(LocalDoc)) +} + +func (c Config) stashedOnly() bool { + return c.DocumentTypes.Contains(StashedDoc) && !c.DocumentTypes.Contains(NewsDoc) +} + // NewProgram returns a new Tea program. func NewProgram(cfg Config) *tea.Program { if cfg.Logfile != "" { From f1ede23b3cc5bd8c99b0c6ffd062c6ea9e77fec0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 3 Dec 2020 18:11:06 -0500 Subject: [PATCH 620/911] Add logging for stash/news fetching --- ui/ui.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ui/ui.go b/ui/ui.go index 5ed2f87..2f2602d 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -557,6 +557,9 @@ func loadStash(m stashModel) tea.Cmd { } return stashLoadErrMsg{err} } + if debug { + log.Println("loaded stash page", m.page) + } return gotStashMsg(stash) } } @@ -577,6 +580,9 @@ func loadNews(m stashModel) tea.Cmd { } return newsLoadErrMsg{err} } + if debug { + log.Println("fetched news") + } return gotNewsMsg(news) } } From a67f00a813a6119c9903ba568df322534610cbf5 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 3 Dec 2020 18:15:59 -0500 Subject: [PATCH 621/911] Press tab/shift+tab to switch between local, stash and news --- ui/stash.go | 285 +++++++++++++++++++++++++++++------------------- ui/stashhelp.go | 21 ++-- ui/ui.go | 2 +- 3 files changed, 184 insertions(+), 124 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index feb5ab5..e0db9c1 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -31,6 +31,7 @@ const ( var ( stashTextInputPromptStyle styleFunc = newFgStyle(common.YellowGreen) dividerDot string = darkGrayFg(" • ") + dividerBar string = darkGrayFg(" │ ") offlineHeaderNote string = darkGrayFg("(Offline)") ) @@ -51,18 +52,35 @@ const ( stashStateShowingError ) -// Which types of documents we are showing. We use an int as the underlying -// type both for easy equality testing, and because the default state can have -// different types of docs depending on the user's preferences. For example, -// if the local-only flag is passed, the default state contains only documents -// of type local. Otherwise, it could contain stash, news, and converted types. -type stashDocState int +// The types of documents we are currently showing to the user. +type stashSection int const ( - stashShowDefaultDocs stashDocState = iota - stashShowNewsDocs + stashLocalSection stashSection = iota + stashStashedSection + stashNewsSection ) +// Returns document types for the given document state. +func (d stashSection) docTypes() DocTypeSet { + return stashSections[d] +} + +// Maps sections to their associated types +var stashSections = map[stashSection]DocTypeSet{ + stashLocalSection: NewDocTypeSet(LocalDoc), + stashStashedSection: NewDocTypeSet(StashedDoc, ConvertedDoc), + stashNewsSection: NewDocTypeSet(NewsDoc), +} + +// All available sections; we use an array here instead of the map above +// because order is important. +var allSections = [...]stashSection{ + stashLocalSection, + stashStashedSection, + stashNewsSection, +} + // The current filtering state. type filterState int @@ -94,12 +112,11 @@ type stashModel struct { selectionState selectionState showFullHelp bool - // The types of documents we are showing - docState stashDocState + // Available document sections we can cycle through + sections []stashSection - // Maps document states to document types, i.e. the news state contains a - // set of type "news". - docStateMap map[stashDocState]DocTypeSet + // Index of the section we're currently looking at + currentSection int // Tracks what exactly is loaded between the stash, news and local files loaded DocTypeSet @@ -148,6 +165,15 @@ func (m stashModel) loadingDone() bool { return m.loaded.Equals(m.general.cfg.DocumentTypes.Difference(ConvertedDoc)) } +func (m stashModel) hasSection(name stashSection) bool { + for _, v := range m.sections { + if name == v { + return true + } + } + return false +} + // Returns whether or not we're online. That is, when "local-only" mode is // disabled and we've authenticated successfully. func (m stashModel) online() bool { @@ -281,12 +307,11 @@ func (m *stashModel) replaceLocalMarkdown(localPath string, newMarkdown *markdow // Return the number of markdown documents of a given type. func (m stashModel) countMarkdowns(t DocType) (found int) { - mds := m.getVisibleMarkdowns() - if len(mds) == 0 { + if len(m.markdowns) == 0 { return } - for i := 0; i < len(mds); i++ { - if mds[i].markdownType == t { + for i := 0; i < len(m.markdowns); i++ { + if m.markdowns[i].markdownType == t { found++ } } @@ -319,12 +344,12 @@ func (m stashModel) getVisibleMarkdowns() []*markdown { return m.filteredMarkdowns } - return m.getMarkdownByType(m.docStateMap[m.docState].AsSlice()...) + return m.getMarkdownByType(m.sections[m.currentSection].docTypes().AsSlice()...) } // Return the markdowns eligible to be filtered. func (m stashModel) getFilterableMarkdowns() []*markdown { - return m.getMarkdownByType(m.docStateMap[m.docState].AsSlice()...) + return m.getMarkdownByType(m.sections[m.currentSection].docTypes().AsSlice()...) } // Command for opening a markdown document in the pager. Note that this also @@ -417,6 +442,19 @@ func newStashModel(general *general) stashModel { si.CharLimit = noteCharacterLimit si.Focus() + var ds []stashSection + if general.cfg.localOnly() { + ds = []stashSection{stashLocalSection} + } else if general.cfg.stashedOnly() { + ds = []stashSection{stashStashedSection, stashNewsSection} + } else { + ds = []stashSection{ + stashLocalSection, + stashStashedSection, + stashNewsSection, + } + } + m := stashModel{ general: general, spinner: sp, @@ -427,11 +465,7 @@ func newStashModel(general *general) stashModel { loaded: NewDocTypeSet(), loadingFromNetwork: true, filesStashing: make(map[string]struct{}), - docState: stashShowDefaultDocs, - docStateMap: map[stashDocState]DocTypeSet{ - stashShowDefaultDocs: general.cfg.DocumentTypes.Difference(NewsDoc), - stashShowNewsDocs: NewDocTypeSet(NewsDoc), - }, + sections: ds, } return m @@ -586,10 +620,10 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Handle keys case tea.KeyMsg: switch msg.String() { - case "k", "ctrl+k", "up", "shift+tab": + case "k", "ctrl+k", "up": m.moveCursorUp() - case "j", "ctrl+j", "down", "tab": + case "j", "ctrl+j", "down": m.moveCursorDown() // Go to the very start @@ -607,7 +641,26 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { m.resetFiltering() break } - m.docState = stashShowDefaultDocs + + case "tab": + if len(m.sections) == 0 { + break + } + m.currentSection++ + if m.currentSection >= len(m.sections) { + m.currentSection = 0 + } + m.setTotalPages() + + case "shift+tab": + if len(m.sections) == 0 { + break + } + m.currentSection-- + if m.currentSection < 0 { + m.currentSection = len(m.sections) - 1 + } + m.setTotalPages() // Open document case "enter": @@ -660,27 +713,6 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { return textinput.Blink } - // Show news - case "n": - if !m.online() || m.isFiltering() { - // If we're offline disable the news section - return nil - } - if m.docState == stashShowNewsDocs { - // Exit news - m.docState = stashShowDefaultDocs - m.resetFiltering() - } else { - // Show news - m.hideStatusMessage() - m.paginator.Page = 0 - m.index = 0 - m.docState = stashShowNewsDocs - m.setTotalPages() - } - - return nil - // Stash case "s": if pages == 0 || m.general.authStatus != authOK || m.selectedMarkdown() == nil { @@ -934,20 +966,6 @@ func (m stashModel) view() string { loadingIndicator = m.spinner.View() } - help, helpHeight := m.helpView() - - // We need to fill any empty height with newlines so the footer reaches - // the bottom. - availHeight := m.general.height - - stashViewTopPadding - - helpHeight - - stashViewBottomPadding - numBlankLines := max(0, availHeight%stashViewItemHeight) - blankLines := "" - if numBlankLines > 0 { - blankLines = strings.Repeat("\n", numBlankLines) - } - var header string if m.showStatusMessage { header = greenFg(m.statusMessage) @@ -963,7 +981,7 @@ func (m stashModel) view() string { // Only draw the normal header if we're not using the header area for // something else (like a prompt or status message) if header == "" { - header = m.headerView() + header = m.sectionView() } logoOrFilter := glowLogoView(" Glow ") @@ -971,10 +989,22 @@ func (m stashModel) view() string { // If we're filtering we replace the logo with the filter field if m.isFiltering() { logoOrFilter = m.filterInput.View() - } else if m.docState == stashShowNewsDocs { - logoOrFilter += normalFg(" News ") } + help, helpHeight := m.helpView() + + populatedView := m.populatedView() + populatedViewHeight := strings.Count(populatedView, "\n") + 2 + + // We need to fill any empty height with newlines so the footer reaches + // the bottom. + availHeight := m.general.height - + stashViewTopPadding - + populatedViewHeight - + helpHeight - + stashViewBottomPadding + blankLines := strings.Repeat("\n", max(0, availHeight)) + var pagination string if m.paginator.TotalPages > 1 { pagination = m.paginator.View() @@ -996,7 +1026,7 @@ func (m stashModel) view() string { loadingIndicator, logoOrFilter, header, - m.populatedView(), + populatedView, blankLines, pagination, help, @@ -1013,69 +1043,100 @@ func glowLogoView(text string) string { String() } -func (m stashModel) headerView() string { - loading := !m.loadingDone() - noMarkdowns := len(m.markdowns) == 0 +func (m stashModel) sectionView() string { - if m.general.authStatus == authFailed && m.stashedOnly() { - return common.Subtle("Can’t load stash. Are you offline?") - } - - var maybeOffline string - if m.general.authStatus == authFailed { - maybeOffline = " " + offlineHeaderNote - } - - // Still loading. We haven't found files, stashed items, or news yet. - if loading && noMarkdowns { - if m.stashedOnly() { - return common.Subtle("Loading your stash...") + if m.loadingDone() && len(m.markdowns) == 0 { + var maybeOffline string + if m.general.authStatus == authFailed { + maybeOffline = " " + offlineHeaderNote } - return common.Subtle("Looking for stuff...") + maybeOffline + + if m.stashedOnly() { + return common.Subtle("Can’t load stash") + maybeOffline + } + return common.Subtle("No markdown files found") + maybeOffline } - localItems := m.countMarkdowns(LocalDoc) - stashedItems := m.countMarkdowns(StashedDoc) + m.countMarkdowns(ConvertedDoc) - newsItems := m.countMarkdowns(NewsDoc) + localCount := m.countMarkdowns(LocalDoc) + stashedCount := m.countMarkdowns(StashedDoc) + m.countMarkdowns(ConvertedDoc) + newsCount := m.countMarkdowns(NewsDoc) - // Loading's finished and all we have is news. - if !loading && localItems == 0 && stashedItems == 0 && newsItems == 0 { - if m.stashedOnly() { - return common.Subtle("No stashed markdown files found.") + maybeOffline + var sections []string + + for i, v := range m.sections { + var s string + + switch v { + case stashLocalSection: + if m.stashedOnly() { + continue + } + s = fmt.Sprintf("%d local", localCount) + case stashStashedSection: + if m.localOnly() { + continue + } + s = fmt.Sprintf("%d stashed", stashedCount) + case stashNewsSection: + if m.localOnly() { + continue + } + s = fmt.Sprintf("%d news", newsCount) + } + + if m.currentSection == i && len(m.sections) > 1 { + s = brightGrayFg(s) } else { - return common.Subtle("No local or stashed markdown files found.") + maybeOffline + s = grayFg(s) } + sections = append(sections, s) } - // There are local and/or stashed files, so display counts. - var s string - if localItems > 0 { - s += common.Subtle(fmt.Sprintf("%d Local", localItems)) + s := strings.Join(sections, dividerBar) + if m.general.authStatus == authFailed { + s += dividerDot + offlineHeaderNote } - if stashedItems > 0 { - var divider string - if localItems > 0 { - divider = dividerDot - } - si := common.Subtle(fmt.Sprintf("%d Stashed", stashedItems)) - s += fmt.Sprintf("%s%s", divider, si) - } - if newsItems > 0 { - var divider string - if localItems > 0 || stashedItems > 0 { - divider = dividerDot - } - si := common.Subtle(fmt.Sprintf("%d News", newsItems)) - s += fmt.Sprintf("%s%s", divider, si) - } - return common.Subtle(s) + maybeOffline + return s } func (m stashModel) populatedView() string { var b strings.Builder mds := m.getVisibleMarkdowns() + + // Empty states + if len(mds) == 0 { + f := func(s string) { + b.WriteString(" " + grayFg(s)) + } + + switch m.sections[m.currentSection] { + case stashLocalSection: + if m.loadingDone() { + f("No local files found.") + } else { + f("Looking for local files...") + } + case stashStashedSection: + if m.general.authStatus == authFailed { + f("Can't load your stash. Are you offline?") + } else if m.loadingDone() { + f("Nothing stashed yet.") + } else { + f("Loading your stash...") + } + case stashNewsSection: + if m.general.authStatus == authFailed { + f("Can't load news. Are you offline?") + } else if m.loadingDone() { + f("No stashed files found.") + } else { + f("Loading your stash...") + } + } + } + if len(mds) > 0 { start, end := m.paginator.GetSliceBounds(len(mds)) docs := mds[start:end] diff --git a/ui/stashhelp.go b/ui/stashhelp.go index a972ce6..f4512a9 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -124,10 +124,18 @@ func (m stashModel) helpView() (string, int) { isStashable = md != nil && md.markdownType == LocalDoc && m.online() } - if numDocs > 0 { + if numDocs > 0 && m.showFullHelp { navHelp = []string{"enter", "open", "j/k ↑/↓", "choose"} } + if len(m.sections) > 1 { + if m.showFullHelp { + navHelp = append(navHelp, "tab/shift+tab", "section") + } else { + navHelp = append(navHelp, "tab", "section") + } + } + if m.paginator.TotalPages > 1 { navHelp = append(navHelp, "h/l ←/→", "page") } @@ -145,15 +153,6 @@ func (m stashModel) helpView() (string, int) { selectionHelp = []string{"s", "stash"} } - // If there's no filtering happening - if !m.isFiltering() && m.online() { - if m.docState == stashShowNewsDocs { - sectionHelp = []string{"n", "home"} - } else { - sectionHelp = []string{"n", "news"} - } - } - // If there are errors if m.err != nil { appHelp = append(appHelp, "!", "errors") @@ -173,7 +172,7 @@ func (m stashModel) helpView() (string, int) { if m.filterState != filtering { appHelp = append(appHelp, "?", "more") } - return m.renderHelp(filterHelp, selectionHelp, sectionHelp, appHelp) + return m.renderHelp(navHelp, filterHelp, selectionHelp, sectionHelp, appHelp) } // renderHelp returns the rendered help view and associated line height for diff --git a/ui/ui.go b/ui/ui.go index 2f2602d..2e2b441 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -58,7 +58,7 @@ func (c Config) localOnly() bool { } func (c Config) stashedOnly() bool { - return c.DocumentTypes.Contains(StashedDoc) && !c.DocumentTypes.Contains(NewsDoc) + return c.DocumentTypes.Contains(StashedDoc) && !c.DocumentTypes.Contains(LocalDoc) } // NewProgram returns a new Tea program. From cfba912be6e32bd90869143b98e316acc35e8c77 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 8 Dec 2020 18:38:10 -0500 Subject: [PATCH 622/911] Maintain pagination and cursor on a per-section basis --- ui/stash.go | 278 ++++++++++++++++++++++++++---------------------- ui/stashhelp.go | 2 +- ui/stashitem.go | 2 +- ui/ui.go | 4 +- 4 files changed, 154 insertions(+), 132 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index e0db9c1..a6d463e 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -53,32 +53,35 @@ const ( ) // The types of documents we are currently showing to the user. -type stashSection int +type sectionKey int const ( - stashLocalSection stashSection = iota - stashStashedSection - stashNewsSection + localSection = iota + stashedSection + newsSection ) -// Returns document types for the given document state. -func (d stashSection) docTypes() DocTypeSet { - return stashSections[d] +type section struct { + key sectionKey + docTypes DocTypeSet + paginator paginator.Model + cursor int } // Maps sections to their associated types -var stashSections = map[stashSection]DocTypeSet{ - stashLocalSection: NewDocTypeSet(LocalDoc), - stashStashedSection: NewDocTypeSet(StashedDoc, ConvertedDoc), - stashNewsSection: NewDocTypeSet(NewsDoc), -} - -// All available sections; we use an array here instead of the map above -// because order is important. -var allSections = [...]stashSection{ - stashLocalSection, - stashStashedSection, - stashNewsSection, +var sections = map[sectionKey]section{ + localSection: { + key: localSection, + docTypes: NewDocTypeSet(LocalDoc), + }, + stashedSection: { + key: stashedSection, + docTypes: NewDocTypeSet(StashedDoc, ConvertedDoc), + }, + newsSection: { + key: newsSection, + docTypes: NewDocTypeSet(NewsDoc), + }, } // The current filtering state. @@ -111,12 +114,16 @@ type stashModel struct { filterState filterState selectionState selectionState showFullHelp bool + showStatusMessage bool + statusMessage string + statusMessageTimer *time.Timer - // Available document sections we can cycle through - sections []stashSection + // Available document sections we can cycle through. We use a slice, rather + // than a map, because order is important. + sections []section // Index of the section we're currently looking at - currentSection int + sectionIndex int // Tracks what exactly is loaded between the stash, news and local files loaded DocTypeSet @@ -133,24 +140,11 @@ type stashModel struct { // value portion with an empty struct. filesStashing map[string]struct{} - // This is just the selected item in relation to the current page in view. - // To get the index of the selected item as it relates to the full set of - // documents we've fetched use the markdownIndex() method on this struct. - index int - - // This handles the local pagination, which is different than the page - // we're fetching from on the server side - paginator paginator.Model - // Page we're fetching stash items from on the server, which is different // from the local pagination. Generally, the server will return more items // than we can display at a time so we can paginate locally without having // to fetch every time. - page int - - showStatusMessage bool - statusMessage string - statusMessageTimer *time.Timer + serverPage int } func (m stashModel) localOnly() bool { @@ -165,15 +159,35 @@ func (m stashModel) loadingDone() bool { return m.loaded.Equals(m.general.cfg.DocumentTypes.Difference(ConvertedDoc)) } -func (m stashModel) hasSection(name stashSection) bool { +func (m stashModel) hasSection(key sectionKey) bool { for _, v := range m.sections { - if name == v { + if key == v.key { return true } } return false } +func (m stashModel) currentSection() *section { + return &m.sections[m.sectionIndex] +} + +func (m stashModel) paginator() *paginator.Model { + return &m.currentSection().paginator +} + +func (m *stashModel) setPaginator(p paginator.Model) { + m.currentSection().paginator = p +} + +func (m stashModel) cursor() int { + return m.currentSection().cursor +} + +func (m *stashModel) setCursor(i int) { + m.currentSection().cursor = i +} + // Returns whether or not we're online. That is, when "local-only" mode is // disabled and we've authenticated successfully. func (m stashModel) online() bool { @@ -185,7 +199,7 @@ func (m *stashModel) setSize(width, height int) { m.general.height = height // Update the paginator - m.setTotalPages() + m.updatePagination() // height of stash entry, including gap m.noteInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.noteInput.Prompt) m.filterInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.filterInput.Prompt) @@ -196,7 +210,7 @@ func (m *stashModel) resetFiltering() { m.filterInput.Reset() sort.Stable(markdownsByLocalFirst(m.markdowns)) m.filteredMarkdowns = nil - m.setTotalPages() + m.updatePagination() } // Is a filter currently being applied? @@ -211,9 +225,9 @@ func (m stashModel) shouldUpdateFilter() bool { return m.isFiltering() && m.selectionState != selectionSettingNote } -// Sets the total paginator pages according to the amount of markdowns for the -// current state. -func (m *stashModel) setTotalPages() { +// Update pagination according to the amount of markdowns for the current +// state. +func (m *stashModel) updatePagination() { _, helpHeight := m.helpView() availableHeight := m.general.height - @@ -221,23 +235,23 @@ func (m *stashModel) setTotalPages() { helpHeight - stashViewBottomPadding - m.paginator.PerPage = max(1, availableHeight/stashViewItemHeight) + m.paginator().PerPage = max(1, availableHeight/stashViewItemHeight) if pages := len(m.getVisibleMarkdowns()); pages < 1 { - m.paginator.SetTotalPages(1) + m.paginator().SetTotalPages(1) } else { - m.paginator.SetTotalPages(pages) + m.paginator().SetTotalPages(pages) } // Make sure the page stays in bounds - if m.paginator.Page >= m.paginator.TotalPages-1 { - m.paginator.Page = max(0, m.paginator.TotalPages-1) + if m.paginator().Page >= m.paginator().TotalPages-1 { + m.paginator().Page = max(0, m.paginator().TotalPages-1) } } // MarkdownIndex returns the index of the currently selected markdown item. func (m stashModel) markdownIndex() int { - return m.paginator.Page*m.paginator.PerPage + m.index + return m.paginator().Page*m.paginator().PerPage + m.cursor() } // Return the current selected markdown in the stash. @@ -259,7 +273,7 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) { if !m.isFiltering() { sort.Stable(markdownsByLocalFirst(m.markdowns)) } - m.setTotalPages() + m.updatePagination() } } @@ -344,12 +358,12 @@ func (m stashModel) getVisibleMarkdowns() []*markdown { return m.filteredMarkdowns } - return m.getMarkdownByType(m.sections[m.currentSection].docTypes().AsSlice()...) + return m.getMarkdownByType(m.currentSection().docTypes.AsSlice()...) } // Return the markdowns eligible to be filtered. func (m stashModel) getFilterableMarkdowns() []*markdown { - return m.getMarkdownByType(m.sections[m.currentSection].docTypes().AsSlice()...) + return m.getMarkdownByType(m.currentSection().docTypes.AsSlice()...) } // Command for opening a markdown document in the pager. Note that this also @@ -375,44 +389,44 @@ func (m *stashModel) hideStatusMessage() { } func (m *stashModel) moveCursorUp() { - m.index-- - if m.index < 0 && m.paginator.Page == 0 { + m.setCursor(m.cursor() - 1) + if m.cursor() < 0 && m.paginator().Page == 0 { // Stop - m.index = 0 + m.setCursor(0) return } - if m.index >= 0 { + if m.cursor() >= 0 { return } // Go to previous page - m.paginator.PrevPage() + m.paginator().PrevPage() - m.index = m.paginator.ItemsOnPage(len(m.getVisibleMarkdowns())) - 1 + m.setCursor(m.paginator().ItemsOnPage(len(m.getVisibleMarkdowns())) - 1) } func (m *stashModel) moveCursorDown() { - itemsOnPage := m.paginator.ItemsOnPage(len(m.getVisibleMarkdowns())) + itemsOnPage := m.paginator().ItemsOnPage(len(m.getVisibleMarkdowns())) - m.index++ - if m.index < itemsOnPage { + m.setCursor(m.cursor() + 1) + if m.cursor() < itemsOnPage { return } - if !m.paginator.OnLastPage() { - m.paginator.NextPage() - m.index = 0 + if !m.paginator().OnLastPage() { + m.paginator().NextPage() + m.setCursor(0) return } // During filtering the cursor position can exceed the number of // itemsOnPage. It's more intuitive to start the cursor at the // topmost position when moving it down in this scenario. - if m.index > itemsOnPage { - m.index = 0 + if m.cursor() > itemsOnPage { + m.setCursor(0) return } - m.index = itemsOnPage - 1 + m.setCursor(itemsOnPage - 1) } // INIT @@ -425,11 +439,6 @@ func newStashModel(general *general) stashModel { sp.MinimumLifetime = time.Millisecond * 180 sp.Start() - p := paginator.NewModel() - p.Type = paginator.Dots - p.ActiveDot = brightGrayFg("•") - p.InactiveDot = darkGrayFg("•") - ni := textinput.NewModel() ni.Prompt = stashTextInputPromptStyle("Memo: ") ni.CursorColor = common.Fuschia.String() @@ -442,17 +451,31 @@ func newStashModel(general *general) stashModel { si.CharLimit = noteCharacterLimit si.Focus() - var ds []stashSection + var s []section if general.cfg.localOnly() { - ds = []stashSection{stashLocalSection} - } else if general.cfg.stashedOnly() { - ds = []stashSection{stashStashedSection, stashNewsSection} - } else { - ds = []stashSection{ - stashLocalSection, - stashStashedSection, - stashNewsSection, + s = []section{ + sections[localSection], } + } else if general.cfg.stashedOnly() { + s = []section{ + sections[stashedSection], + sections[newsSection], + } + } else { + s = []section{ + sections[localSection], + sections[stashedSection], + sections[newsSection], + } + } + + p := paginator.NewModel() + p.Type = paginator.Dots + p.ActiveDot = brightGrayFg("•") + p.InactiveDot = darkGrayFg("•") + + for i := range s { + s[i].paginator = p } m := stashModel{ @@ -460,12 +483,11 @@ func newStashModel(general *general) stashModel { spinner: sp, noteInput: ni, filterInput: si, - page: 1, - paginator: p, + serverPage: 1, loaded: NewDocTypeSet(), loadingFromNetwork: true, filesStashing: make(map[string]struct{}), - sections: ds, + sections: s, } return m @@ -513,7 +535,7 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { m.stashFullyLoaded = true } else { // Load the next page - m.page++ + m.serverPage++ cmds = append(cmds, loadStash(m)) } @@ -628,13 +650,13 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Go to the very start case "home", "g": - m.paginator.Page = 0 - m.index = 0 + m.paginator().Page = 0 + m.setCursor(0) // Go to the very end case "end", "G": - m.paginator.Page = m.paginator.TotalPages - 1 - m.index = m.paginator.ItemsOnPage(pages) - 1 + m.paginator().Page = m.paginator().TotalPages - 1 + m.setCursor(m.paginator().ItemsOnPage(pages) - 1) case "esc": if m.isFiltering() { @@ -646,21 +668,21 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { if len(m.sections) == 0 { break } - m.currentSection++ - if m.currentSection >= len(m.sections) { - m.currentSection = 0 + m.sectionIndex++ + if m.sectionIndex >= len(m.sections) { + m.sectionIndex = 0 } - m.setTotalPages() + m.updatePagination() case "shift+tab": if len(m.sections) == 0 { break } - m.currentSection-- - if m.currentSection < 0 { - m.currentSection = len(m.sections) - 1 + m.sectionIndex-- + if m.sectionIndex < 0 { + m.sectionIndex = len(m.sections) - 1 } - m.setTotalPages() + m.updatePagination() // Open document case "enter": @@ -686,8 +708,8 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { m.filteredMarkdowns = m.getFilterableMarkdowns() - m.paginator.Page = 0 - m.index = 0 + m.paginator().Page = 0 + m.setCursor(0) m.filterState = filtering m.filterInput.CursorEnd() m.filterInput.Focus() @@ -762,7 +784,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Toggle full help case "?": m.showFullHelp = !m.showFullHelp - m.setTotalPages() + m.updatePagination() // Show errors case "!": @@ -776,30 +798,30 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Update paginator. Pagination key handling is done here, but it could // also be moved up to this level, in which case we'd use model methods // like model.PageUp(). - newPaginatorModel, cmd := m.paginator.Update(msg) - m.paginator = newPaginatorModel + newPaginatorModel, cmd := m.paginator().Update(msg) + m.setPaginator(newPaginatorModel) cmds = append(cmds, cmd) // Extra paginator keystrokes if key, ok := msg.(tea.KeyMsg); ok { switch key.String() { case "b", "u": - m.paginator.PrevPage() + m.paginator().PrevPage() case "f", "d": - m.paginator.NextPage() + m.paginator().NextPage() } } // Keep the index in bounds when paginating - itemsOnPage := m.paginator.ItemsOnPage(len(m.getVisibleMarkdowns())) - if m.index > itemsOnPage-1 { - m.index = max(0, itemsOnPage-1) + itemsOnPage := m.paginator().ItemsOnPage(len(m.getVisibleMarkdowns())) + if m.cursor() > itemsOnPage-1 { + m.setCursor(max(0, itemsOnPage-1)) } // If we're on the last page and we haven't loaded everything, get // more stuff. - if m.paginator.OnLastPage() && !m.loadingFromNetwork && !m.stashFullyLoaded { - m.page++ + if m.paginator().OnLastPage() && !m.loadingFromNetwork && !m.stashFullyLoaded { + m.serverPage++ m.loadingFromNetwork = true cmds = append(cmds, loadStash(*m)) } @@ -842,7 +864,7 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { } m.selectionState = selectionIdle - m.setTotalPages() + m.updatePagination() return deleteStashedItem(m.general.cc, smd.ID) @@ -912,7 +934,7 @@ func (m *stashModel) handleFiltering(msg tea.Msg) tea.Cmd { } // Update pagination - m.setTotalPages() + m.updatePagination() return tea.Batch(cmds...) } @@ -1006,14 +1028,14 @@ func (m stashModel) view() string { blankLines := strings.Repeat("\n", max(0, availHeight)) var pagination string - if m.paginator.TotalPages > 1 { - pagination = m.paginator.View() + if m.paginator().TotalPages > 1 { + pagination = m.paginator().View() // If the dot pagination is wider than the width of the window // switch to the arabic paginator. if ansi.PrintableRuneWidth(pagination) > m.general.width-stashViewHorizontalPadding { - m.paginator.Type = paginator.Arabic - pagination = common.Subtle(m.paginator.View()) + m.paginator().Type = paginator.Arabic + pagination = common.Subtle(m.paginator().View()) } // We could also look at m.stashFullyLoaded and add an indicator @@ -1066,25 +1088,25 @@ func (m stashModel) sectionView() string { for i, v := range m.sections { var s string - switch v { - case stashLocalSection: + switch v.key { + case localSection: if m.stashedOnly() { continue } s = fmt.Sprintf("%d local", localCount) - case stashStashedSection: + case stashedSection: if m.localOnly() { continue } s = fmt.Sprintf("%d stashed", stashedCount) - case stashNewsSection: + case newsSection: if m.localOnly() { continue } s = fmt.Sprintf("%d news", newsCount) } - if m.currentSection == i && len(m.sections) > 1 { + if m.sectionIndex == i && len(m.sections) > 1 { s = brightGrayFg(s) } else { s = grayFg(s) @@ -1111,14 +1133,14 @@ func (m stashModel) populatedView() string { b.WriteString(" " + grayFg(s)) } - switch m.sections[m.currentSection] { - case stashLocalSection: + switch m.sections[m.sectionIndex].key { + case localSection: if m.loadingDone() { f("No local files found.") } else { f("Looking for local files...") } - case stashStashedSection: + case stashedSection: if m.general.authStatus == authFailed { f("Can't load your stash. Are you offline?") } else if m.loadingDone() { @@ -1126,7 +1148,7 @@ func (m stashModel) populatedView() string { } else { f("Loading your stash...") } - case stashNewsSection: + case newsSection: if m.general.authStatus == authFailed { f("Can't load news. Are you offline?") } else if m.loadingDone() { @@ -1138,7 +1160,7 @@ func (m stashModel) populatedView() string { } if len(mds) > 0 { - start, end := m.paginator.GetSliceBounds(len(mds)) + start, end := m.paginator().GetSliceBounds(len(mds)) docs := mds[start:end] for i, md := range docs { @@ -1152,9 +1174,9 @@ func (m stashModel) populatedView() string { // If there aren't enough items to fill up this page (always the last page) // then we need to add some newlines to fill up the space where stash items // would have been. - itemsOnPage := m.paginator.ItemsOnPage(len(mds)) - if itemsOnPage < m.paginator.PerPage { - n := (m.paginator.PerPage - itemsOnPage) * stashViewItemHeight + itemsOnPage := m.paginator().ItemsOnPage(len(mds)) + if itemsOnPage < m.paginator().PerPage { + n := (m.paginator().PerPage - itemsOnPage) * stashViewItemHeight if len(mds) == 0 { n -= stashViewItemHeight - 1 } diff --git a/ui/stashhelp.go b/ui/stashhelp.go index f4512a9..243ef15 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -136,7 +136,7 @@ func (m stashModel) helpView() (string, int) { } } - if m.paginator.TotalPages > 1 { + if m.paginator().TotalPages > 1 { navHelp = append(navHelp, "h/l ←/→", "page") } diff --git a/ui/stashitem.go b/ui/stashitem.go index 8bfbea8..03d4c5d 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -43,7 +43,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { title = truncate(title, truncateTo) } - isSelected := index == m.index + isSelected := index == m.cursor() isFiltering := m.filterState == filtering // If there are multiple items being filtered we don't highlight a selected diff --git a/ui/ui.go b/ui/ui.go index 2e2b441..ee60cbd 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -546,7 +546,7 @@ func loadStash(m stashModel) tea.Cmd { } return stashLoadErrMsg{err} } - stash, err := m.general.cc.GetStash(m.page) + stash, err := m.general.cc.GetStash(m.serverPage) if err != nil { if debug { if _, ok := err.(charm.ErrAuthFailed); ok { @@ -558,7 +558,7 @@ func loadStash(m stashModel) tea.Cmd { return stashLoadErrMsg{err} } if debug { - log.Println("loaded stash page", m.page) + log.Println("loaded stash page", m.serverPage) } return gotStashMsg(stash) } From 4fcf48f92acae949f3b7dd8bf2e8cb91edce521b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 9 Dec 2020 15:24:24 -0500 Subject: [PATCH 623/911] Filter against local and stashed files, regardless of the current section --- ui/doctypes.go | 9 ++ ui/stash.go | 226 ++++++++++++++++++++++++------------------------- ui/ui.go | 19 ++++- 3 files changed, 134 insertions(+), 120 deletions(-) diff --git a/ui/doctypes.go b/ui/doctypes.go index a142985..0b17d58 100644 --- a/ui/doctypes.go +++ b/ui/doctypes.go @@ -11,6 +11,15 @@ const ( NewsDoc ) +func (d DocType) String() string { + return [...]string{ + "local", + "stashed", + "converted", + "news", + }[d] +} + // DocTypeSet is a set (in the mathematic sense) of document types. type DocTypeSet map[DocType]struct{} diff --git a/ui/stash.go b/ui/stash.go index a6d463e..65b3f6b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -136,9 +136,9 @@ type stashModel struct { // reason, this field should be considered ephemeral. filteredMarkdowns []*markdown - // Paths to files being stashed. We treat this like a set, ignoring the - // value portion with an empty struct. - filesStashing map[string]struct{} + // Paths to files stashed this session. We treat this like a set, ignoring + // the value portion with an empty struct. + filesStashed map[string]struct{} // Page we're fetching stash items from on the server, which is different // from the local pagination. Generally, the server will return more items @@ -198,11 +198,10 @@ func (m *stashModel) setSize(width, height int) { m.general.width = width m.general.height = height - // Update the paginator - m.updatePagination() - // height of stash entry, including gap m.noteInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.noteInput.Prompt) m.filterInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.filterInput.Prompt) + + m.updatePagination() } func (m *stashModel) resetFiltering() { @@ -277,55 +276,21 @@ func (m *stashModel) addMarkdowns(mds ...*markdown) { } } -// Find a local markdown by its path and replace it. -func (m *stashModel) replaceLocalMarkdown(localPath string, newMarkdown *markdown) error { - var found bool - - // Look for local markdown - for i, md := range m.markdowns { - if md.localPath == localPath { - m.markdowns[i] = newMarkdown - found = true - break - } - } - - if !found { - err := fmt.Errorf("could't find local markdown %s; not removing from stash", localPath) - if debug { - log.Println(err) - } - return err - } - - if m.isFiltering() { - found = false - for i, md := range m.filteredMarkdowns { - if md.localPath == localPath { - m.filteredMarkdowns[i] = newMarkdown - found = true - break - } - } - if !found { - err := fmt.Errorf("warning: found local markdown %s in the master markdown list, but not in the filter results", localPath) - if debug { - log.Println(err) - } - return err - } - } - - return nil -} - // Return the number of markdown documents of a given type. func (m stashModel) countMarkdowns(t DocType) (found int) { if len(m.markdowns) == 0 { return } - for i := 0; i < len(m.markdowns); i++ { - if m.markdowns[i].markdownType == t { + + var mds []*markdown + if m.isFiltering() { + mds = m.getVisibleMarkdowns() + } else { + mds = m.markdowns + } + + for i := 0; i < len(mds); i++ { + if mds[i].markdownType == t { found++ } } @@ -363,7 +328,7 @@ func (m stashModel) getVisibleMarkdowns() []*markdown { // Return the markdowns eligible to be filtered. func (m stashModel) getFilterableMarkdowns() []*markdown { - return m.getMarkdownByType(m.currentSection().docTypes.AsSlice()...) + return m.getMarkdownByType(LocalDoc, ConvertedDoc, StashedDoc) } // Command for opening a markdown document in the pager. Note that this also @@ -381,8 +346,19 @@ func (m *stashModel) openMarkdown(md *markdown) tea.Cmd { return tea.Batch(cmd, spinner.Tick) } +func (m *stashModel) newStatusMessage(s string) tea.Cmd { + m.showStatusMessage = true + m.statusMessage = s + if m.statusMessageTimer != nil { + m.statusMessageTimer.Stop() + } + m.statusMessageTimer = time.NewTimer(statusMessageTimeout) + return waitForStatusMessageTimeout(stashContext, m.statusMessageTimer) +} + func (m *stashModel) hideStatusMessage() { m.showStatusMessage = false + m.statusMessage = "" if m.statusMessageTimer != nil { m.statusMessageTimer.Stop() } @@ -486,7 +462,7 @@ func newStashModel(general *general) stashModel { serverPage: 1, loaded: NewDocTypeSet(), loadingFromNetwork: true, - filesStashing: make(map[string]struct{}), + filesStashed: make(map[string]struct{}), sections: s, } @@ -565,7 +541,7 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { condition := !m.loadingDone() || m.loadingFromNetwork || m.viewState == stashStateLoadingDocument || - len(m.filesStashing) > 0 || + len(m.filesStashed) > 0 || m.spinner.Visible() if condition { @@ -586,17 +562,12 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { // Something was stashed. Add it to the stash listing. case stashSuccessMsg: md := markdown(msg) - delete(m.filesStashing, md.localPath) // remove from the things-we're-stashing list + m.addMarkdowns(&md) - _ = m.replaceLocalMarkdown(md.localPath, &md) - - m.showStatusMessage = true - m.statusMessage = "Stashed!" - if m.statusMessageTimer != nil { - m.statusMessageTimer.Stop() + if m.isFiltering() { + cmds = append(cmds, filterMarkdowns(m)) } - m.statusMessageTimer = time.NewTimer(statusMessageTimeout) - cmds = append(cmds, waitForStatusMessageTimeout(stashContext, m.statusMessageTimer)) + cmds = append(cmds, m.newStatusMessage("Stashed!")) case statusMessageTimeoutMsg: if applicationContext(msg) == stashContext { @@ -636,7 +607,7 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { var cmds []tea.Cmd - pages := len(m.getVisibleMarkdowns()) + numDocs := len(m.getVisibleMarkdowns()) switch msg := msg.(type) { // Handle keys @@ -656,7 +627,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Go to the very end case "end", "G": m.paginator().Page = m.paginator().TotalPages - 1 - m.setCursor(m.paginator().ItemsOnPage(pages) - 1) + m.setCursor(m.paginator().ItemsOnPage(numDocs) - 1) case "esc": if m.isFiltering() { @@ -665,7 +636,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { } case "tab": - if len(m.sections) == 0 { + if len(m.sections) == 0 || m.isFiltering() { break } m.sectionIndex++ @@ -688,7 +659,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { case "enter": m.hideStatusMessage() - if pages == 0 { + if numDocs == 0 { break } @@ -719,7 +690,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { case "m": m.hideStatusMessage() - if pages == 0 { + if numDocs == 0 { break } @@ -737,27 +708,29 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Stash case "s": - if pages == 0 || m.general.authStatus != authOK || m.selectedMarkdown() == nil { + if numDocs == 0 || !m.online() || m.selectedMarkdown() == nil { break } md := m.selectedMarkdown() - _, isBeingStashed := m.filesStashing[md.localPath] + if _, alreadyStashed := m.filesStashed[md.localPath]; alreadyStashed { + cmds = append(cmds, m.newStatusMessage("Already stashed")) + break + } + isLocalMarkdown := md.markdownType == LocalDoc markdownPathMissing := md.localPath == "" - if isBeingStashed || !isLocalMarkdown || markdownPathMissing { - if debug && isBeingStashed { - log.Printf("refusing to stash markdown; we're already stashing %s", md.localPath) - } else if debug && isLocalMarkdown && markdownPathMissing { + if !isLocalMarkdown || markdownPathMissing { + if debug && isLocalMarkdown && markdownPathMissing { log.Printf("refusing to stash markdown; local path is empty: %#v", md) } break } // Checks passed; perform the stash - m.filesStashing[md.localPath] = struct{}{} + m.filesStashed[md.localPath] = struct{}{} cmds = append(cmds, stashDocument(m.general.cc, *md)) if m.loadingDone() && !m.spinner.Visible() { @@ -772,7 +745,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { validState := m.viewState == stashStateReady && m.selectionState == selectionIdle - if pages == 0 && !validState { + if numDocs == 0 && !validState { break } @@ -847,20 +820,18 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { } if md.markdownType == ConvertedDoc { - // If document was stashed during this session, convert it - // back to a local file. - md.markdownType = LocalDoc - md.Note = stripAbsolutePath(m.markdowns[i].localPath, m.general.cwd) - } else { - // Delete optimistically and remove the stashed item - // before we've received a success response. - if m.isFiltering() { - mds, _ := deleteMarkdown(m.filteredMarkdowns, m.markdowns[i]) - m.filteredMarkdowns = mds - } - mds, _ := deleteMarkdown(m.markdowns, m.markdowns[i]) - m.markdowns = mds + // Remove from the things-we-stashed-this-session set + delete(m.filesStashed, md.localPath) } + + // Delete optimistically and remove the stashed item before + // we've received a success response. + if m.isFiltering() { + mds, _ := deleteMarkdown(m.filteredMarkdowns, m.markdowns[i]) + m.filteredMarkdowns = mds + } + mds, _ := deleteMarkdown(m.markdowns, m.markdowns[i]) + m.markdowns = mds } m.selectionState = selectionIdle @@ -989,28 +960,27 @@ func (m stashModel) view() string { } var header string - if m.showStatusMessage { - header = greenFg(m.statusMessage) - } else { - switch m.selectionState { - case selectionPromptingDelete: - header = redFg("Delete this item from your stash? ") + faintRedFg("(y/N)") - case selectionSettingNote: - header = yellowFg("Set the memo for this item?") - } + switch m.selectionState { + case selectionPromptingDelete: + header = redFg("Delete this item from your stash? ") + faintRedFg("(y/N)") + case selectionSettingNote: + header = yellowFg("Set the memo for this item?") } // Only draw the normal header if we're not using the header area for - // something else (like a prompt or status message) + // something else (like a note or delete prompt). if header == "" { - header = m.sectionView() + header = m.headerView() } - logoOrFilter := glowLogoView(" Glow ") - - // If we're filtering we replace the logo with the filter field - if m.isFiltering() { + // Rules for the logo, filter and status message. + var logoOrFilter string + if m.showStatusMessage { + logoOrFilter = greenFg(m.statusMessage) + } else if m.isFiltering() { logoOrFilter = m.filterInput.View() + } else { + logoOrFilter = glowLogoView(" Glow ") } help, helpHeight := m.helpView() @@ -1065,7 +1035,32 @@ func glowLogoView(text string) string { String() } -func (m stashModel) sectionView() string { +func (m stashModel) headerView() string { + localCount := m.countMarkdowns(LocalDoc) + stashedCount := m.countMarkdowns(StashedDoc) + m.countMarkdowns(ConvertedDoc) + newsCount := m.countMarkdowns(NewsDoc) + + var sections []string + + // Filter results + if m.isFiltering() { + if localCount+stashedCount+newsCount == 0 { + return grayFg("Nothing found.") + } else { + if localCount > 0 { + sections = append(sections, fmt.Sprintf("%d local", localCount)) + } + if stashedCount > 0 { + sections = append(sections, fmt.Sprintf("%d stashed", stashedCount)) + } + } + + for i := range sections { + sections[i] = grayFg(sections[i]) + } + + return strings.Join(sections, dividerDot) + } if m.loadingDone() && len(m.markdowns) == 0 { var maybeOffline string @@ -1079,12 +1074,7 @@ func (m stashModel) sectionView() string { return common.Subtle("No markdown files found") + maybeOffline } - localCount := m.countMarkdowns(LocalDoc) - stashedCount := m.countMarkdowns(StashedDoc) + m.countMarkdowns(ConvertedDoc) - newsCount := m.countMarkdowns(NewsDoc) - - var sections []string - + // Tabs for i, v := range m.sections { var s string @@ -1123,10 +1113,14 @@ func (m stashModel) sectionView() string { } func (m stashModel) populatedView() string { - var b strings.Builder - mds := m.getVisibleMarkdowns() + if len(mds) == 0 && m.isFiltering() { + return "" + } + + var b strings.Builder + // Empty states if len(mds) == 0 { f := func(s string) { @@ -1284,16 +1278,16 @@ func deleteMarkdown(markdowns []*markdown, target *markdown) ([]*markdown, error for i, v := range markdowns { switch target.markdownType { - case LocalDoc, ConvertedDoc: - if v.localPath == target.localPath { + case ConvertedDoc: + if v.markdownType == ConvertedDoc && v.localPath == target.localPath { index = i } - case StashedDoc, NewsDoc: + case StashedDoc: if v.ID == target.ID { index = i } default: - return nil, errors.New("unknown markdown type") + return nil, fmt.Errorf("%s documents cannot be deleted", target.markdownType.String()) } } diff --git a/ui/ui.go b/ui/ui.go index ee60cbd..9160c30 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -419,7 +419,18 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // message and generally don't want any other effects. if m.state == stateShowDocument { md := markdown(msg) - _ = m.stash.replaceLocalMarkdown(md.localPath, &md) + m.stash.addMarkdowns(&md) + + if m.stash.isFiltering() { + cmds = append(cmds, filterMarkdowns(m.stash)) + } + } + + case filteredMarkdownMsg: + if m.state == stateShowDocument { + newStashModel, cmd := m.stash.update(msg) + m.stash = newStashModel + cmds = append(cmds, cmd) } } @@ -683,9 +694,9 @@ func waitForStatusMessageTimeout(appCtx applicationContext, t *time.Timer) tea.C // ETC -// Convert local file path to Markdown. Note that we could be doing things -// like checking if the file is a directory, but we trust that gitcha has -// already done that. +// Convert a Gitcha result to an internal representation of a markdown +// document. Note that we could be doing things like checking if the file is +// a directory, but we trust that gitcha has already done that. func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { md := &markdown{ markdownType: LocalDoc, From 88806c8abcbad176499ef54fd6c09e7a2df3ff11 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 9 Dec 2020 20:12:01 -0500 Subject: [PATCH 624/911] Make news stashable --- go.mod | 1 + go.sum | 4 ++ ui/markdown.go | 12 ++++++ ui/stash.go | 106 +++++++++++++++++++++++++++++++------------------ ui/ui.go | 57 ++++++++++++++++++-------- 5 files changed, 126 insertions(+), 54 deletions(-) diff --git a/go.mod b/go.mod index fbf0a23..6172ba0 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,7 @@ require ( github.com/muesli/reflow v0.2.0 github.com/muesli/termenv v0.7.4 github.com/sahilm/fuzzy v0.1.0 + github.com/segmentio/ksuid v1.0.3 github.com/spf13/cobra v1.1.1 github.com/spf13/viper v1.7.0 golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 diff --git a/go.sum b/go.sum index ed099fb..024a2d0 100644 --- a/go.sum +++ b/go.sum @@ -241,7 +241,11 @@ github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkA github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/segmentio/ksuid v1.0.3 h1:FoResxvleQwYiPAVKe1tMUlEirodZqlqglIuFsdDntY= +github.com/segmentio/ksuid v1.0.3/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= diff --git a/ui/markdown.go b/ui/markdown.go index f9f0909..9b82de9 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -9,6 +9,7 @@ import ( "github.com/charmbracelet/charm" "github.com/dustin/go-humanize" + "github.com/segmentio/ksuid" "golang.org/x/text/runes" "golang.org/x/text/transform" "golang.org/x/text/unicode/norm" @@ -18,6 +19,11 @@ import ( type markdown struct { markdownType DocType + // Local identifier. This allows us to precisely determine the stashed + // state of a markdown, regardless of whether it exists locally or on the + // network. + localID ksuid.KSUID + // Full path of a local markdown file. Only relevant to local documents and // those that have been stashed in this session. localPath string @@ -30,6 +36,12 @@ type markdown struct { charm.Markdown } +func (m *markdown) generateLocalID() { + if m.localID.IsNil() { + m.localID = ksuid.New() + } +} + // Generate the value we're doing to filter against. func (m *markdown) buildFilterValue() { note, err := normalize(m.Note) diff --git a/ui/stash.go b/ui/stash.go index 65b3f6b..b001d8e 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -18,6 +18,7 @@ import ( "github.com/muesli/reflow/ansi" te "github.com/muesli/termenv" "github.com/sahilm/fuzzy" + "github.com/segmentio/ksuid" ) const ( @@ -37,9 +38,15 @@ var ( // MSG -type fetchedMarkdownMsg *markdown type deletedStashedItemMsg int type filteredMarkdownMsg []*markdown +type fetchedMarkdownMsg *markdown + +type markdownFetchFailedMsg struct { + err error + id int + note string +} // MODEL @@ -138,7 +145,7 @@ type stashModel struct { // Paths to files stashed this session. We treat this like a set, ignoring // the value portion with an empty struct. - filesStashed map[string]struct{} + filesStashed map[ksuid.KSUID]struct{} // Page we're fetching stash items from on the server, which is different // from the local pagination. Generally, the server will return more items @@ -268,6 +275,10 @@ func (m stashModel) selectedMarkdown() *markdown { // Adds markdown documents to the model. func (m *stashModel) addMarkdowns(mds ...*markdown) { if len(mds) > 0 { + for _, md := range mds { + md.generateLocalID() + } + m.markdowns = append(m.markdowns, mds...) if !m.isFiltering() { sort.Stable(markdownsByLocalFirst(m.markdowns)) @@ -340,7 +351,7 @@ func (m *stashModel) openMarkdown(md *markdown) tea.Cmd { if md.markdownType == LocalDoc { cmd = loadLocalMarkdown(md) } else { - cmd = loadRemoteMarkdown(m.general.cc, md.ID, md.markdownType) + cmd = loadRemoteMarkdown(m.general.cc, md) } return tea.Batch(cmd, spinner.Tick) @@ -462,7 +473,7 @@ func newStashModel(general *general) stashModel { serverPage: 1, loaded: NewDocTypeSet(), loadingFromNetwork: true, - filesStashed: make(map[string]struct{}), + filesStashed: make(map[ksuid.KSUID]struct{}), sections: s, } @@ -533,6 +544,14 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { m.addMarkdowns(docs...) + case markdownFetchFailedMsg: + s := "Couldn't load markdown" + if msg.note != "" { + s += ": " + msg.note + } + cmd := m.newStatusMessage(s) + return m, cmd + case filteredMarkdownMsg: m.filteredMarkdowns = msg return m, nil @@ -714,23 +733,20 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { md := m.selectedMarkdown() - if _, alreadyStashed := m.filesStashed[md.localPath]; alreadyStashed { + if _, alreadyStashed := m.filesStashed[md.localID]; alreadyStashed { cmds = append(cmds, m.newStatusMessage("Already stashed")) break } - isLocalMarkdown := md.markdownType == LocalDoc - markdownPathMissing := md.localPath == "" - - if !isLocalMarkdown || markdownPathMissing { - if debug && isLocalMarkdown && markdownPathMissing { - log.Printf("refusing to stash markdown; local path is empty: %#v", md) + if !stashableDocTypes.Contains(md.markdownType) || md.localID.IsNil() { + if debug && md.localID.IsNil() { + log.Printf("refusing to stash markdown; local ID path is nil: %#v", md) } break } // Checks passed; perform the stash - m.filesStashed[md.localPath] = struct{}{} + m.filesStashed[md.localID] = struct{}{} cmds = append(cmds, stashDocument(m.general.cc, *md)) if m.loadingDone() && !m.spinner.Visible() { @@ -807,7 +823,6 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { - // Confirm deletion case "y": if m.selectionState != selectionPromptingDelete { break @@ -819,10 +834,8 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { continue } - if md.markdownType == ConvertedDoc { - // Remove from the things-we-stashed-this-session set - delete(m.filesStashed, md.localPath) - } + // Remove from the things-we-stashed-this-session set + delete(m.filesStashed, md.localID) // Delete optimistically and remove the stashed item before // we've received a success response. @@ -976,7 +989,8 @@ func (m stashModel) view() string { // Rules for the logo, filter and status message. var logoOrFilter string if m.showStatusMessage { - logoOrFilter = greenFg(m.statusMessage) + const gutter = 3 + logoOrFilter = greenFg(truncate(m.statusMessage, m.general.width-gutter)) } else if m.isFiltering() { logoOrFilter = m.filterInput.View() } else { @@ -1184,33 +1198,49 @@ func (m stashModel) populatedView() string { // COMMANDS -func loadRemoteMarkdown(cc *charm.Client, id int, t DocType) tea.Cmd { +// loadRemoteMarkdown is a command for loading markdown from the server. +func loadRemoteMarkdown(cc *charm.Client, md *markdown) tea.Cmd { return func() tea.Msg { - var ( - md *charm.Markdown - err error - ) - - if t == StashedDoc || t == ConvertedDoc { - md, err = cc.GetStashMarkdown(id) - } else { - md, err = cc.GetNewsMarkdown(id) - } - + md, err := loadMarkdownFromCharm(cc, md.ID, md.markdownType) if err != nil { if debug { - log.Println("error loading remote markdown:", err) + log.Printf("error loading %s markdown (ID %d, Note: '%s'): %v", md.markdownType, md.ID, md.Note, err) + } + return markdownFetchFailedMsg{ + err: err, + id: md.ID, + note: md.Note, } - return errMsg{err} } - - return fetchedMarkdownMsg(&markdown{ - markdownType: t, - Markdown: *md, - }) + return fetchedMarkdownMsg(md) } } +// loadMarkdownFromCharm performs the actual I/O for loading markdown from the +// sever. +func loadMarkdownFromCharm(cc *charm.Client, id int, t DocType) (*markdown, error) { + var md *charm.Markdown + var err error + + switch t { + case StashedDoc, ConvertedDoc: + md, err = cc.GetStashMarkdown(id) + case NewsDoc: + md, err = cc.GetNewsMarkdown(id) + default: + err = fmt.Errorf("unknown markdown type: %s", t) + } + + if err != nil { + return nil, err + } + + return &markdown{ + markdownType: t, + Markdown: *md, + }, nil +} + func loadLocalMarkdown(md *markdown) tea.Cmd { return func() tea.Msg { if md.markdownType != LocalDoc { @@ -1287,7 +1317,7 @@ func deleteMarkdown(markdowns []*markdown, target *markdown) ([]*markdown, error index = i } default: - return nil, fmt.Errorf("%s documents cannot be deleted", target.markdownType.String()) + return nil, fmt.Errorf("%s documents cannot be deleted", target.markdownType) } } diff --git a/ui/ui.go b/ui/ui.go index 9160c30..cf76d1a 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -30,6 +30,8 @@ var ( config Config glowLogoTextColor = common.Color("#ECFD65") debug = false // true if we're logging to a file, in which case we'll log more stuff + + stashableDocTypes = NewDocTypeSet(LocalDoc, NewsDoc) ) // Config contains TUI-specific configuration. @@ -649,26 +651,40 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { } // Is the document missing a body? If so, it likely means it needs to - // be loaded. If the document body is really empty then we'll still - // stash it. + // be loaded. But...if it turnsout the document body really is empty + // then we'll stash it anyway. if len(md.Body) == 0 { - data, err := ioutil.ReadFile(md.localPath) - if err != nil { - if debug { - log.Println("error loading doucument body for stashing:", err) + switch md.markdownType { + + case LocalDoc: + data, err := ioutil.ReadFile(md.localPath) + if err != nil { + if debug { + log.Println("error loading document body for stashing:", err) + } + return stashErrMsg{err} + } + md.Body = string(data) + + case NewsDoc: + newMD, err := loadMarkdownFromCharm(cc, md.ID, md.markdownType) + if err != nil { + return stashErrMsg{err} + } + md.Body = newMD.Body + + default: + if debug { + log.Printf("user is attempting to stash an unsupported markdown type: %s", md.markdownType) } - return stashErrMsg{err} } - md.Body = string(data) } - // Turn local markdown into a newly stashed (converted) markdown - md.markdownType = ConvertedDoc - md.CreatedAt = time.Now() - // Set the note as the filename without the extension - p := md.localPath - md.Note = strings.Replace(path.Base(p), path.Ext(p), "", 1) + if md.markdownType == LocalDoc { + p := md.localPath + md.Note = strings.Replace(path.Base(p), path.Ext(p), "", 1) + } newMd, err := cc.StashMarkdown(md.Note, md.Body) if err != nil { @@ -678,9 +694,15 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { return stashErrMsg{err} } - // We really just need to know the ID so we can operate on this newly - // stashed markdown. + // The server sends the whole stashed document back, but we really just + // need to know the ID so we can operate on this newly stashed + // markdown. md.ID = newMd.ID + + // Turn the markdown into a newly stashed (converted) markdown + md.markdownType = ConvertedDoc + md.CreatedAt = time.Now() + return stashSuccessMsg(md) } } @@ -729,6 +751,9 @@ func indent(s string, n int) string { } func truncate(str string, num int) string { + if num < 1 { + return str + } return runewidth.Truncate(str, num, "…") } From 03d93169f2f15699b1465c95eef992d72475829c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 10 Dec 2020 11:26:26 -0500 Subject: [PATCH 625/911] Also make news stashable from the pager --- ui/pager.go | 27 ++++++++++++++++++++------- ui/stash.go | 19 +++++++------------ ui/ui.go | 11 +++++++++-- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 6eaa041..b243cc5 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -243,13 +243,21 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { break } + md := m.currentDocument + + _, alreadyStashed := m.general.filesStashed[md.localID] + if alreadyStashed { + cmds = append(cmds, m.showStatusMessage("Already stashed")) + break + } + // Stash a local document - if m.state != pagerStateStashing && m.currentDocument.markdownType == LocalDoc { + if m.state != pagerStateStashing && stashableDocTypes.Contains(md.markdownType) { m.state = pagerStateStashing m.spinner.Start() cmds = append( cmds, - stashDocument(m.general.cc, m.currentDocument), + stashDocument(m.general.cc, md), spinner.Tick, ) } @@ -263,15 +271,18 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { case spinner.TickMsg: if m.state == pagerStateStashing || m.spinner.Visible() { + // If we're still stashing, or if the spinner still needs to + // finish, spin it along. newSpinnerModel, cmd := m.spinner.Update(msg) m.spinner = newSpinnerModel cmds = append(cmds, cmd) } else if m.state == pagerStateStashSuccess && !m.spinner.Visible() { + // If the spinner's finished and we haven't told the user the + // stash was successful, do that. m.state = pagerStateBrowse m.currentDocument = *m.stashedDocument m.stashedDocument = nil - cmd := m.showStatusMessage("Stashed!") - cmds = append(cmds, cmd) + cmds = append(cmds, m.showStatusMessage("Stashed!")) } // Glow has rendered the content @@ -293,11 +304,14 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { // item to the stash listing. m.state = pagerStateStashSuccess if !m.spinner.Visible() { + // The spinner has finished spinning, so tell the user the stash + // was successful. m.state = pagerStateBrowse m.currentDocument = markdown(msg) - cmd := m.showStatusMessage("Stashed!") - cmds = append(cmds, cmd) + cmds = append(cmds, m.showStatusMessage("Stashed!")) } else { + // The spinner is still spinning, so just take note of the newly + // stashed document for now. md := markdown(msg) m.stashedDocument = &md } @@ -306,7 +320,6 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { // TODO case statusMessageTimeoutMsg: - // Hide the status message bar m.state = pagerStateBrowse } diff --git a/ui/stash.go b/ui/stash.go index b001d8e..9d4cd51 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -18,7 +18,6 @@ import ( "github.com/muesli/reflow/ansi" te "github.com/muesli/termenv" "github.com/sahilm/fuzzy" - "github.com/segmentio/ksuid" ) const ( @@ -143,10 +142,6 @@ type stashModel struct { // reason, this field should be considered ephemeral. filteredMarkdowns []*markdown - // Paths to files stashed this session. We treat this like a set, ignoring - // the value portion with an empty struct. - filesStashed map[ksuid.KSUID]struct{} - // Page we're fetching stash items from on the server, which is different // from the local pagination. Generally, the server will return more items // than we can display at a time so we can paginate locally without having @@ -473,7 +468,6 @@ func newStashModel(general *general) stashModel { serverPage: 1, loaded: NewDocTypeSet(), loadingFromNetwork: true, - filesStashed: make(map[ksuid.KSUID]struct{}), sections: s, } @@ -560,7 +554,7 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { condition := !m.loadingDone() || m.loadingFromNetwork || m.viewState == stashStateLoadingDocument || - len(m.filesStashed) > 0 || + len(m.general.filesStashed) > 0 || m.spinner.Visible() if condition { @@ -733,7 +727,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { md := m.selectedMarkdown() - if _, alreadyStashed := m.filesStashed[md.localID]; alreadyStashed { + if _, alreadyStashed := m.general.filesStashed[md.localID]; alreadyStashed { cmds = append(cmds, m.newStatusMessage("Already stashed")) break } @@ -746,7 +740,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { } // Checks passed; perform the stash - m.filesStashed[md.localID] = struct{}{} + m.general.filesStashed[md.localID] = struct{}{} cmds = append(cmds, stashDocument(m.general.cc, *md)) if m.loadingDone() && !m.spinner.Visible() { @@ -835,7 +829,7 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { } // Remove from the things-we-stashed-this-session set - delete(m.filesStashed, md.localID) + delete(m.general.filesStashed, md.localID) // Delete optimistically and remove the stashed item before // we've received a success response. @@ -1201,7 +1195,7 @@ func (m stashModel) populatedView() string { // loadRemoteMarkdown is a command for loading markdown from the server. func loadRemoteMarkdown(cc *charm.Client, md *markdown) tea.Cmd { return func() tea.Msg { - md, err := loadMarkdownFromCharm(cc, md.ID, md.markdownType) + newMD, err := loadMarkdownFromCharm(cc, md.ID, md.markdownType) if err != nil { if debug { log.Printf("error loading %s markdown (ID %d, Note: '%s'): %v", md.markdownType, md.ID, md.Note, err) @@ -1212,7 +1206,8 @@ func loadRemoteMarkdown(cc *charm.Client, md *markdown) tea.Cmd { note: md.Note, } } - return fetchedMarkdownMsg(md) + newMD.localID = md.localID + return fetchedMarkdownMsg(newMD) } } diff --git a/ui/ui.go b/ui/ui.go index cf76d1a..a417d3a 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -19,6 +19,7 @@ import ( runewidth "github.com/mattn/go-runewidth" "github.com/muesli/gitcha" te "github.com/muesli/termenv" + "github.com/segmentio/ksuid" ) const ( @@ -157,6 +158,10 @@ type general struct { authStatus authStatus width int height int + + // Local IDs of files stashed this session. We treat this like a set, + // ignoring the value portion with an empty struct. + filesStashed map[ksuid.KSUID]struct{} } type model struct { @@ -207,8 +212,9 @@ func newModel(cfg Config) tea.Model { } general := general{ - cfg: cfg, - authStatus: authConnecting, + cfg: cfg, + authStatus: authConnecting, + filesStashed: make(map[ksuid.KSUID]struct{}), } return model{ @@ -422,6 +428,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if m.state == stateShowDocument { md := markdown(msg) m.stash.addMarkdowns(&md) + m.general.filesStashed[msg.localID] = struct{}{} if m.stash.isFiltering() { cmds = append(cmds, filterMarkdowns(m.stash)) From 426f4787e516f70f5583aa0bc3b17c623ebee8e7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 10 Dec 2020 17:06:01 -0500 Subject: [PATCH 626/911] Fix panic that could happen when deleting stuff really fast --- ui/stash.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 9d4cd51..cc6102b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -759,7 +759,12 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { break } - t := m.selectedMarkdown().markdownType + md := m.selectedMarkdown() + if md == nil { + break + } + + t := md.markdownType if t == StashedDoc || t == ConvertedDoc { m.selectionState = selectionPromptingDelete } From 617f0980d81f7de78ccdef273d030ea66561bcfa Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 10 Dec 2020 19:26:24 -0500 Subject: [PATCH 627/911] Handle stash failures --- ui/pager.go | 8 ++------ ui/stash.go | 8 +++++++- ui/ui.go | 29 +++++++++++++++++++++-------- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index b243cc5..0f4a9c6 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -49,10 +49,6 @@ var ( type contentRenderedMsg string type noteSavedMsg *charm.Markdown -type stashSuccessMsg markdown -type stashErrMsg struct{ err error } - -func (s stashErrMsg) Error() string { return s.err.Error() } type pagerState int @@ -316,8 +312,8 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { m.stashedDocument = &md } - case stashErrMsg: - // TODO + case stashFailMsg: + delete(m.general.filesStashed, msg.markdown.localID) case statusMessageTimeoutMsg: m.state = pagerStateBrowse diff --git a/ui/stash.go b/ui/stash.go index cc6102b..eb41753 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -572,7 +572,6 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { } } - // Something was stashed. Add it to the stash listing. case stashSuccessMsg: md := markdown(msg) m.addMarkdowns(&md) @@ -582,6 +581,9 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { } cmds = append(cmds, m.newStatusMessage("Stashed!")) + case stashFailMsg: + cmds = append(cmds, m.newStatusMessage("Couldn’t stash :(")) + case statusMessageTimeoutMsg: if applicationContext(msg) == stashContext { m.hideStatusMessage() @@ -727,6 +729,10 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { md := m.selectedMarkdown() + if !stashableDocTypes.Contains(md.markdownType) { + break + } + if _, alreadyStashed := m.general.filesStashed[md.localID]; alreadyStashed { cmds = append(cmds, m.newStatusMessage("Already stashed")) break diff --git a/ui/ui.go b/ui/ui.go index a417d3a..b5542af 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -93,6 +93,13 @@ type stashLoadErrMsg struct{ err error } type gotNewsMsg []*charm.Markdown type statusMessageTimeoutMsg applicationContext type newsLoadErrMsg struct{ err error } +type stashSuccessMsg markdown +type stashFailMsg struct { + err error + markdown markdown +} + +//type stashErrMsg struct{ err error } func (e errMsg) Error() string { return e.err.Error() } func (e errMsg) Unwrap() error { return e.err } @@ -422,9 +429,10 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmds = append(cmds, findNextLocalFile(m)) case stashSuccessMsg: - // Something was stashed. Update the stash listing but don't run an - // actual update on the stash since we don't want to trigger the status - // message and generally don't want any other effects. + // Something was stashed outside the file listing view. Update the + // stash listing but don't run an actual update on the stash since we + // don't want to trigger the status message and generally don't want + // any other effects. if m.state == stateShowDocument { md := markdown(msg) m.stash.addMarkdowns(&md) @@ -435,6 +443,9 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } } + case stashFailMsg: + delete(m.general.filesStashed, msg.markdown.localID) + case filteredMarkdownMsg: if m.state == stateShowDocument { newStashModel, cmd := m.stash.update(msg) @@ -653,7 +664,7 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { if debug { log.Println("error stashing document:", err) } - return stashErrMsg{err} + return stashFailMsg{err, md} } } @@ -669,21 +680,23 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { if debug { log.Println("error loading document body for stashing:", err) } - return stashErrMsg{err} + return stashFailMsg{err, md} } md.Body = string(data) case NewsDoc: newMD, err := loadMarkdownFromCharm(cc, md.ID, md.markdownType) if err != nil { - return stashErrMsg{err} + return stashFailMsg{err, md} } md.Body = newMD.Body default: + err := fmt.Errorf("user is attempting to stash an unsupported markdown type: %s", md.markdownType) if debug { - log.Printf("user is attempting to stash an unsupported markdown type: %s", md.markdownType) + log.Println(err) } + return stashFailMsg{err, md} } } @@ -698,7 +711,7 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { if debug { log.Println("error stashing document:", err) } - return stashErrMsg{err} + return stashFailMsg{err, md} } // The server sends the whole stashed document back, but we really just From 6953c06b465136eb987992ecbd62fa834dac45ef Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 10 Dec 2020 20:20:43 -0500 Subject: [PATCH 628/911] Improve markdown stashing and spinner logic in file listing --- ui/stash.go | 50 ++++++++++++++++++-------------------------------- ui/ui.go | 39 ++++++++++++++++++++++----------------- 2 files changed, 40 insertions(+), 49 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index eb41753..2d8e26b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -115,7 +115,6 @@ type stashModel struct { noteInput textinput.Model filterInput textinput.Model stashFullyLoaded bool // have we loaded all available stashed documents from the server? - loadingFromNetwork bool // are we currently loading something from the network? viewState stashViewState filterState filterState selectionState selectionState @@ -461,14 +460,13 @@ func newStashModel(general *general) stashModel { } m := stashModel{ - general: general, - spinner: sp, - noteInput: ni, - filterInput: si, - serverPage: 1, - loaded: NewDocTypeSet(), - loadingFromNetwork: true, - sections: s, + general: general, + spinner: sp, + noteInput: ni, + filterInput: si, + serverPage: 1, + loaded: NewDocTypeSet(), + sections: s, } return m @@ -487,7 +485,6 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { m.err = msg.err m.loaded.Add(StashedDoc) // still done, albeit unsuccessfully m.stashFullyLoaded = true - m.loadingFromNetwork = false case newsLoadErrMsg: m.err = msg.err @@ -507,7 +504,6 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { switch msg := msg.(type) { case gotStashMsg: m.loaded.Add(StashedDoc) - m.loadingFromNetwork = false docs = wrapMarkdowns(StashedDoc, msg) if len(msg) == 0 { @@ -551,13 +547,12 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { return m, nil case spinner.TickMsg: - condition := !m.loadingDone() || - m.loadingFromNetwork || - m.viewState == stashStateLoadingDocument || - len(m.general.filesStashed) > 0 || - m.spinner.Visible() + loading := !m.loadingDone() + stashing := m.general.isStashing() + openingDocument := m.viewState == stashStateLoadingDocument + spinnerVisible := m.spinner.Visible() - if condition { + if loading || stashing || openingDocument || spinnerVisible { newSpinnerModel, cmd := m.spinner.Update(msg) m.spinner = newSpinnerModel cmds = append(cmds, cmd) @@ -572,15 +567,13 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { } } + // Note: mechanical stuff related to stash success is handled in the parent + // update function. case stashSuccessMsg: - md := markdown(msg) - m.addMarkdowns(&md) - - if m.isFiltering() { - cmds = append(cmds, filterMarkdowns(m)) - } cmds = append(cmds, m.newStatusMessage("Stashed!")) + // Note: mechanical stuff related to stash failure is handled in the parent + // update function. case stashFailMsg: cmds = append(cmds, m.newStatusMessage("Couldn’t stash :(")) @@ -747,6 +740,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Checks passed; perform the stash m.general.filesStashed[md.localID] = struct{}{} + m.general.filesStashing[md.localID] = struct{}{} cmds = append(cmds, stashDocument(m.general.cc, *md)) if m.loadingDone() && !m.spinner.Visible() { @@ -812,14 +806,6 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { m.setCursor(max(0, itemsOnPage-1)) } - // If we're on the last page and we haven't loaded everything, get - // more stuff. - if m.paginator().OnLastPage() && !m.loadingFromNetwork && !m.stashFullyLoaded { - m.serverPage++ - m.loadingFromNetwork = true - cmds = append(cmds, loadStash(*m)) - } - return tea.Batch(cmds...) } @@ -973,7 +959,7 @@ func (m stashModel) view() string { case stashStateReady: loadingIndicator := " " - if !m.localOnly() && (!m.loadingDone() || m.loadingFromNetwork || m.spinner.Visible()) { + if !m.localOnly() && (!m.loadingDone() || m.spinner.Visible()) { loadingIndicator = m.spinner.View() } diff --git a/ui/ui.go b/ui/ui.go index b5542af..384b380 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -169,6 +169,14 @@ type general struct { // Local IDs of files stashed this session. We treat this like a set, // ignoring the value portion with an empty struct. filesStashed map[ksuid.KSUID]struct{} + + // Files currently being stashed. We remove files from this set once + // a stash operation has either succeeded or failed. + filesStashing map[ksuid.KSUID]struct{} +} + +func (g general) isStashing() bool { + return len(g.filesStashing) > 0 } type model struct { @@ -199,7 +207,7 @@ func (m *model) unloadDocument() []tea.Cmd { batch = append(batch, tea.ClearScrollArea) } - if !m.stash.loadingDone() || m.stash.loadingFromNetwork { + if !m.stash.loadingDone() { batch = append(batch, spinner.Tick) } return batch @@ -219,9 +227,10 @@ func newModel(cfg Config) tea.Model { } general := general{ - cfg: cfg, - authStatus: authConnecting, - filesStashed: make(map[ksuid.KSUID]struct{}), + cfg: cfg, + authStatus: authConnecting, + filesStashed: make(map[ksuid.KSUID]struct{}), + filesStashing: make(map[ksuid.KSUID]struct{}), } return model{ @@ -362,7 +371,6 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Even though it failed, news/stash loading is finished m.stash.loaded.Add(StashedDoc, NewsDoc) - m.stash.loadingFromNetwork = false } case keygenFailedMsg: @@ -377,7 +385,6 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Even though it failed, news/stash loading is finished m.stash.loaded.Add(StashedDoc, NewsDoc) - m.stash.loadingFromNetwork = false case keygenSuccessMsg: // The keygen's done, so let's try initializing the charm client again @@ -429,22 +436,20 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmds = append(cmds, findNextLocalFile(m)) case stashSuccessMsg: - // Something was stashed outside the file listing view. Update the - // stash listing but don't run an actual update on the stash since we - // don't want to trigger the status message and generally don't want - // any other effects. - if m.state == stateShowDocument { - md := markdown(msg) - m.stash.addMarkdowns(&md) - m.general.filesStashed[msg.localID] = struct{}{} + // Common handling that should happen regardless of application state + md := markdown(msg) + m.stash.addMarkdowns(&md) + m.general.filesStashed[msg.localID] = struct{}{} + delete(m.general.filesStashing, md.localID) - if m.stash.isFiltering() { - cmds = append(cmds, filterMarkdowns(m.stash)) - } + if m.stash.isFiltering() { + cmds = append(cmds, filterMarkdowns(m.stash)) } case stashFailMsg: + // Common handling that should happen regardless of application state delete(m.general.filesStashed, msg.markdown.localID) + delete(m.general.filesStashing, msg.markdown.localID) case filteredMarkdownMsg: if m.state == stateShowDocument { From 8a6c6ef85d97a733a33c2c84834c990def50c365 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 10 Dec 2020 20:24:51 -0500 Subject: [PATCH 629/911] Remove extraneous error interface implementations --- ui/ui.go | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 384b380..038c4a2 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -78,6 +78,9 @@ func NewProgram(cfg Config) *tea.Program { } type errMsg struct{ err error } + +func (e errMsg) Error() string { return e.err.Error() } + type newCharmClientMsg *charm.Client type sshAuthErrMsg struct{} type keygenFailedMsg struct{ err error } @@ -99,17 +102,6 @@ type stashFailMsg struct { markdown markdown } -//type stashErrMsg struct{ err error } - -func (e errMsg) Error() string { return e.err.Error() } -func (e errMsg) Unwrap() error { return e.err } -func (k keygenFailedMsg) Error() string { return k.err.Error() } -func (k keygenFailedMsg) Unwrap() error { return k.err } -func (s stashLoadErrMsg) Error() string { return s.err.Error() } -func (s stashLoadErrMsg) Unwrap() error { return s.err } -func (s newsLoadErrMsg) Error() string { return s.err.Error() } -func (s newsLoadErrMsg) Unwrap() error { return s.err } - // Which part of the application something appies to. Occasionally used as an // argument to commands and messages. type applicationContext int From 683d2c0cf6af2eea74de218228f5d69c02a45240 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 10 Dec 2020 20:35:00 -0500 Subject: [PATCH 630/911] Move TUI config into its own file --- ui/config.go | 30 ++++++++++++++++++++++++++++++ ui/ui.go | 45 ++++++++++----------------------------------- 2 files changed, 40 insertions(+), 35 deletions(-) create mode 100644 ui/config.go diff --git a/ui/config.go b/ui/config.go new file mode 100644 index 0000000..8fafec5 --- /dev/null +++ b/ui/config.go @@ -0,0 +1,30 @@ +package ui + +// Config contains TUI-specific configuration. +type Config struct { + ShowAllFiles bool + Gopath string `env:"GOPATH"` + HomeDir string `env:"HOME"` + GlamourMaxWidth uint + GlamourStyle string + + // Which document types shall we show? We work though this with bitmasking. + DocumentTypes DocTypeSet + + // For debugging the UI + Logfile string `env:"GLOW_LOGFILE"` + HighPerformancePager bool `env:"GLOW_HIGH_PERFORMANCE_PAGER" default:"true"` + GlamourEnabled bool `env:"GLOW_ENABLE_GLAMOUR" default:"true"` +} + +func (c Config) showLocalFiles() bool { + return c.DocumentTypes.Contains(LocalDoc) +} + +func (c Config) localOnly() bool { + return c.DocumentTypes.Equals(NewDocTypeSet(LocalDoc)) +} + +func (c Config) stashedOnly() bool { + return c.DocumentTypes.Contains(StashedDoc) && !c.DocumentTypes.Contains(LocalDoc) +} diff --git a/ui/ui.go b/ui/ui.go index 038c4a2..3fb71c6 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -30,40 +30,14 @@ const ( var ( config Config glowLogoTextColor = common.Color("#ECFD65") - debug = false // true if we're logging to a file, in which case we'll log more stuff + // True if we're logging to a file, in which case we'll log more stuff. + debug = false + + // Types of documents we allow the user to stash. stashableDocTypes = NewDocTypeSet(LocalDoc, NewsDoc) ) -// Config contains TUI-specific configuration. -type Config struct { - ShowAllFiles bool - Gopath string `env:"GOPATH"` - HomeDir string `env:"HOME"` - GlamourMaxWidth uint - GlamourStyle string - - // Which document types shall we show? We work though this with bitmasking. - DocumentTypes DocTypeSet - - // For debugging the UI - Logfile string `env:"GLOW_LOGFILE"` - HighPerformancePager bool `env:"GLOW_HIGH_PERFORMANCE_PAGER" default:"true"` - GlamourEnabled bool `env:"GLOW_ENABLE_GLAMOUR" default:"true"` -} - -func (c Config) showLocalFiles() bool { - return c.DocumentTypes.Contains(LocalDoc) -} - -func (c Config) localOnly() bool { - return c.DocumentTypes.Equals(NewDocTypeSet(LocalDoc)) -} - -func (c Config) stashedOnly() bool { - return c.DocumentTypes.Contains(StashedDoc) && !c.DocumentTypes.Contains(LocalDoc) -} - // NewProgram returns a new Tea program. func NewProgram(cfg Config) *tea.Program { if cfg.Logfile != "" { @@ -102,8 +76,8 @@ type stashFailMsg struct { markdown markdown } -// Which part of the application something appies to. Occasionally used as an -// argument to commands and messages. +// applicationContext indicates the area of the application something appies +// to. Occasionally used as an argument to commands and messages. type applicationContext int const ( @@ -111,6 +85,7 @@ const ( pagerContext ) +// state is the top-level application state. type state int const ( @@ -119,9 +94,9 @@ const ( ) func (s state) String() string { - return [...]string{ - "showing stash", - "showing document", + return map[state]string{ + stateShowStash: "showing file listing", + stateShowDocument: "showing document", }[s] } From 6946f7e581e56a8541b50d91cc6de3ee4e6b33f7 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 10 Dec 2020 20:43:31 -0500 Subject: [PATCH 631/911] Rename 'common' model and associated keys for sake of clarity --- ui/ignore_darwin.go | 4 +-- ui/ignore_general.go | 2 +- ui/pager.go | 66 +++++++++++++++++++-------------------- ui/stash.go | 74 ++++++++++++++++++++++---------------------- ui/stashhelp.go | 6 ++-- ui/stashitem.go | 10 +++--- ui/styles.go | 48 ++++++++++++++-------------- ui/ui.go | 63 ++++++++++++++++++------------------- 8 files changed, 137 insertions(+), 136 deletions(-) diff --git a/ui/ignore_darwin.go b/ui/ignore_darwin.go index 6a0b4ef..cccd305 100644 --- a/ui/ignore_darwin.go +++ b/ui/ignore_darwin.go @@ -6,8 +6,8 @@ import "path/filepath" func ignorePatterns(m model) []string { return []string{ - filepath.Join(m.general.cfg.HomeDir, "Library"), - m.general.cfg.Gopath, + filepath.Join(m.common.cfg.HomeDir, "Library"), + m.common.cfg.Gopath, "node_modules", ".*", } diff --git a/ui/ignore_general.go b/ui/ignore_general.go index 838cea7..21f4734 100644 --- a/ui/ignore_general.go +++ b/ui/ignore_general.go @@ -4,7 +4,7 @@ package ui func ignorePatterns(m model) []string { return []string{ - m.general.cfg.Gopath, + m.common.cfg.Gopath, "node_modules", ".*", } diff --git a/ui/pager.go b/ui/pager.go index 0f4a9c6..262d54e 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -12,7 +12,7 @@ import ( "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" - "github.com/charmbracelet/charm/ui/common" + lib "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glamour" runewidth "github.com/mattn/go-runewidth" "github.com/muesli/reflow/ansi" @@ -24,27 +24,27 @@ const statusBarHeight = 1 var ( pagerHelpHeight int - mintGreen = common.NewColorPair("#89F0CB", "#89F0CB") - darkGreen = common.NewColorPair("#1C8760", "#1C8760") + mintGreen = lib.NewColorPair("#89F0CB", "#89F0CB") + darkGreen = lib.NewColorPair("#1C8760", "#1C8760") noteHeading = te.String(" Set Memo "). - Foreground(common.Cream.Color()). - Background(common.Green.Color()). + Foreground(lib.Cream.Color()). + Background(lib.Green.Color()). String() - statusBarNoteFg = common.NewColorPair("#7D7D7D", "#656565") - statusBarBg = common.NewColorPair("#242424", "#E6E6E6") + statusBarNoteFg = lib.NewColorPair("#7D7D7D", "#656565") + statusBarBg = lib.NewColorPair("#242424", "#E6E6E6") // Styling funcs. - statusBarScrollPosStyle = newStyle(common.NewColorPair("#5A5A5A", "#949494"), statusBarBg, false) + statusBarScrollPosStyle = newStyle(lib.NewColorPair("#5A5A5A", "#949494"), statusBarBg, false) statusBarNoteStyle = newStyle(statusBarNoteFg, statusBarBg, false) - statusBarHelpStyle = newStyle(statusBarNoteFg, common.NewColorPair("#323232", "#DCDCDC"), false) - statusBarStashDotStyle = newStyle(common.Green, statusBarBg, false) + statusBarHelpStyle = newStyle(statusBarNoteFg, lib.NewColorPair("#323232", "#DCDCDC"), false) + statusBarStashDotStyle = newStyle(lib.Green, statusBarBg, false) statusBarMessageStyle = newStyle(mintGreen, darkGreen, false) statusBarMessageStashIconStyle = newStyle(mintGreen, darkGreen, false) statusBarMessageScrollPosStyle = newStyle(mintGreen, darkGreen, false) - statusBarMessageHelpStyle = newStyle(common.NewColorPair("#B6FFE4", "#B6FFE4"), common.Green, false) - helpViewStyle = newStyle(statusBarNoteFg, common.NewColorPair("#1B1B1B", "#f2f2f2"), false) + statusBarMessageHelpStyle = newStyle(lib.NewColorPair("#B6FFE4", "#B6FFE4"), lib.Green, false) + helpViewStyle = newStyle(statusBarNoteFg, lib.NewColorPair("#1B1B1B", "#f2f2f2"), false) ) type contentRenderedMsg string @@ -61,7 +61,7 @@ const ( ) type pagerModel struct { - general *general + common *commonModel viewport viewport.Model state pagerState showHelp bool @@ -80,7 +80,7 @@ type pagerModel struct { stashedDocument *markdown } -func newPagerModel(general *general) pagerModel { +func newPagerModel(common *commonModel) pagerModel { // Init viewport vp := viewport.Model{} vp.YPosition = 0 @@ -89,12 +89,12 @@ func newPagerModel(general *general) pagerModel { // Text input for notes/memos ti := textinput.NewModel() ti.Prompt = te.String(" > "). - Foreground(common.Color(darkGray)). - Background(common.YellowGreen.Color()). + Foreground(lib.Color(darkGray)). + Background(lib.YellowGreen.Color()). String() ti.TextColor = darkGray - ti.BackgroundColor = common.YellowGreen.String() - ti.CursorColor = common.Fuschia.String() + ti.BackgroundColor = lib.YellowGreen.String() + ti.CursorColor = lib.Fuschia.String() ti.CharLimit = noteCharacterLimit ti.Focus() @@ -106,7 +106,7 @@ func newPagerModel(general *general) pagerModel { sp.MinimumLifetime = time.Millisecond * 180 return pagerModel{ - general: general, + common: common, state: pagerStateBrowse, textInput: ti, viewport: vp, @@ -135,7 +135,7 @@ func (m *pagerModel) setContent(s string) { func (m *pagerModel) toggleHelp() { m.showHelp = !m.showHelp - m.setSize(m.general.width, m.general.height) + m.setSize(m.common.width, m.common.height) if m.viewport.PastBottom() { m.viewport.GotoBottom() } @@ -187,7 +187,7 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { var cmd tea.Cmd if m.textInput.Value() != m.currentDocument.Note { // don't update if the note didn't change m.currentDocument.Note = m.textInput.Value() // update optimistically - cmd = saveDocumentNote(m.general.cc, m.currentDocument.ID, m.currentDocument.Note) + cmd = saveDocumentNote(m.common.cc, m.currentDocument.ID, m.currentDocument.Note) } m.state = pagerStateBrowse m.textInput.Reset() @@ -235,13 +235,13 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { return m, textinput.Blink case "s": - if m.general.authStatus != authOK { + if m.common.authStatus != authOK { break } md := m.currentDocument - _, alreadyStashed := m.general.filesStashed[md.localID] + _, alreadyStashed := m.common.filesStashed[md.localID] if alreadyStashed { cmds = append(cmds, m.showStatusMessage("Already stashed")) break @@ -253,7 +253,7 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { m.spinner.Start() cmds = append( cmds, - stashDocument(m.general.cc, md), + stashDocument(m.common.cc, md), spinner.Tick, ) } @@ -313,7 +313,7 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { } case stashFailMsg: - delete(m.general.filesStashed, msg.markdown.localID) + delete(m.common.filesStashed, msg.markdown.localID) case statusMessageTimeoutMsg: m.state = pagerStateBrowse @@ -404,7 +404,7 @@ func (m pagerModel) statusBarView(b *strings.Builder) { } } note = truncate(" "+note+" ", max(0, - m.general.width- + m.common.width- ansi.PrintableRuneWidth(logo)- ansi.PrintableRuneWidth(statusIndicator)- ansi.PrintableRuneWidth(scrollPercent)- @@ -418,7 +418,7 @@ func (m pagerModel) statusBarView(b *strings.Builder) { // Empty space padding := max(0, - m.general.width- + m.common.width- ansi.PrintableRuneWidth(logo)- ansi.PrintableRuneWidth(statusIndicator)- ansi.PrintableRuneWidth(note)- @@ -449,7 +449,7 @@ func (m pagerModel) setNoteView(b *strings.Builder) { func (m pagerModel) helpView() (s string) { memoOrStash := "m set memo" - if m.general.authStatus == authOK && m.currentDocument.markdownType == LocalDoc { + if m.common.authStatus == authOK && m.currentDocument.markdownType == LocalDoc { memoOrStash = "s stash this document" } @@ -481,11 +481,11 @@ func (m pagerModel) helpView() (s string) { s = indent(s, 2) // Fill up empty cells with spaces for background coloring - if m.general.width > 0 { + if m.common.width > 0 { lines := strings.Split(s, "\n") for i := 0; i < len(lines); i++ { l := runewidth.StringWidth(lines[i]) - n := max(m.general.width-l, 0) + n := max(m.common.width-l, 0) lines[i] += strings.Repeat(" ", n) } @@ -518,13 +518,13 @@ func glamourRender(m pagerModel, markdown string) (string, error) { // initialize glamour var gs glamour.TermRendererOption - if m.general.cfg.GlamourStyle == "auto" { + if m.common.cfg.GlamourStyle == "auto" { gs = glamour.WithAutoStyle() } else { - gs = glamour.WithStylePath(m.general.cfg.GlamourStyle) + gs = glamour.WithStylePath(m.common.cfg.GlamourStyle) } - width := max(0, min(int(m.general.cfg.GlamourMaxWidth), m.viewport.Width)) + width := max(0, min(int(m.common.cfg.GlamourMaxWidth), m.viewport.Width)) r, err := glamour.NewTermRenderer( gs, glamour.WithWordWrap(width), diff --git a/ui/stash.go b/ui/stash.go index 2d8e26b..a3546b4 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -14,7 +14,7 @@ import ( "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" - "github.com/charmbracelet/charm/ui/common" + lib "github.com/charmbracelet/charm/ui/common" "github.com/muesli/reflow/ansi" te "github.com/muesli/termenv" "github.com/sahilm/fuzzy" @@ -29,7 +29,7 @@ const ( ) var ( - stashTextInputPromptStyle styleFunc = newFgStyle(common.YellowGreen) + stashTextInputPromptStyle styleFunc = newFgStyle(lib.YellowGreen) dividerDot string = darkGrayFg(" • ") dividerBar string = darkGrayFg(" │ ") offlineHeaderNote string = darkGrayFg("(Offline)") @@ -109,7 +109,7 @@ const ( ) type stashModel struct { - general *general + common *commonModel err error spinner spinner.Model noteInput textinput.Model @@ -149,15 +149,15 @@ type stashModel struct { } func (m stashModel) localOnly() bool { - return m.general.cfg.localOnly() + return m.common.cfg.localOnly() } func (m stashModel) stashedOnly() bool { - return m.general.cfg.stashedOnly() + return m.common.cfg.stashedOnly() } func (m stashModel) loadingDone() bool { - return m.loaded.Equals(m.general.cfg.DocumentTypes.Difference(ConvertedDoc)) + return m.loaded.Equals(m.common.cfg.DocumentTypes.Difference(ConvertedDoc)) } func (m stashModel) hasSection(key sectionKey) bool { @@ -192,12 +192,12 @@ func (m *stashModel) setCursor(i int) { // Returns whether or not we're online. That is, when "local-only" mode is // disabled and we've authenticated successfully. func (m stashModel) online() bool { - return !m.localOnly() && m.general.authStatus == authOK + return !m.localOnly() && m.common.authStatus == authOK } func (m *stashModel) setSize(width, height int) { - m.general.width = width - m.general.height = height + m.common.width = width + m.common.height = height m.noteInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.noteInput.Prompt) m.filterInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.filterInput.Prompt) @@ -230,7 +230,7 @@ func (m stashModel) shouldUpdateFilter() bool { func (m *stashModel) updatePagination() { _, helpHeight := m.helpView() - availableHeight := m.general.height - + availableHeight := m.common.height - stashViewTopPadding - helpHeight - stashViewBottomPadding @@ -345,7 +345,7 @@ func (m *stashModel) openMarkdown(md *markdown) tea.Cmd { if md.markdownType == LocalDoc { cmd = loadLocalMarkdown(md) } else { - cmd = loadRemoteMarkdown(m.general.cc, md) + cmd = loadRemoteMarkdown(m.common.cc, md) } return tea.Batch(cmd, spinner.Tick) @@ -412,32 +412,32 @@ func (m *stashModel) moveCursorDown() { // INIT -func newStashModel(general *general) stashModel { +func newStashModel(common *commonModel) stashModel { sp := spinner.NewModel() sp.Spinner = spinner.Line - sp.ForegroundColor = common.SpinnerColor.String() + sp.ForegroundColor = lib.SpinnerColor.String() sp.HideFor = time.Millisecond * 50 sp.MinimumLifetime = time.Millisecond * 180 sp.Start() ni := textinput.NewModel() ni.Prompt = stashTextInputPromptStyle("Memo: ") - ni.CursorColor = common.Fuschia.String() + ni.CursorColor = lib.Fuschia.String() ni.CharLimit = noteCharacterLimit ni.Focus() si := textinput.NewModel() si.Prompt = stashTextInputPromptStyle("Filter: ") - si.CursorColor = common.Fuschia.String() + si.CursorColor = lib.Fuschia.String() si.CharLimit = noteCharacterLimit si.Focus() var s []section - if general.cfg.localOnly() { + if common.cfg.localOnly() { s = []section{ sections[localSection], } - } else if general.cfg.stashedOnly() { + } else if common.cfg.stashedOnly() { s = []section{ sections[stashedSection], sections[newsSection], @@ -460,7 +460,7 @@ func newStashModel(general *general) stashModel { } m := stashModel{ - general: general, + common: common, spinner: sp, noteInput: ni, filterInput: si, @@ -548,7 +548,7 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { case spinner.TickMsg: loading := !m.loadingDone() - stashing := m.general.isStashing() + stashing := m.common.isStashing() openingDocument := m.viewState == stashStateLoadingDocument spinnerVisible := m.spinner.Visible() @@ -726,7 +726,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { break } - if _, alreadyStashed := m.general.filesStashed[md.localID]; alreadyStashed { + if _, alreadyStashed := m.common.filesStashed[md.localID]; alreadyStashed { cmds = append(cmds, m.newStatusMessage("Already stashed")) break } @@ -739,9 +739,9 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { } // Checks passed; perform the stash - m.general.filesStashed[md.localID] = struct{}{} - m.general.filesStashing[md.localID] = struct{}{} - cmds = append(cmds, stashDocument(m.general.cc, *md)) + m.common.filesStashed[md.localID] = struct{}{} + m.common.filesStashing[md.localID] = struct{}{} + cmds = append(cmds, stashDocument(m.common.cc, *md)) if m.loadingDone() && !m.spinner.Visible() { m.spinner.Start() @@ -826,7 +826,7 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { } // Remove from the things-we-stashed-this-session set - delete(m.general.filesStashed, md.localID) + delete(m.common.filesStashed, md.localID) // Delete optimistically and remove the stashed item before // we've received a success response. @@ -841,7 +841,7 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { m.selectionState = selectionIdle m.updatePagination() - return deleteStashedItem(m.general.cc, smd.ID) + return deleteStashedItem(m.common.cc, smd.ID) default: // Any other keys cancels deletion @@ -927,7 +927,7 @@ func (m *stashModel) handleNoteInput(msg tea.Msg) tea.Cmd { // Set new note md := m.selectedMarkdown() newNote := m.noteInput.Value() - cmd := saveDocumentNote(m.general.cc, md.ID, newNote) + cmd := saveDocumentNote(m.common.cc, md.ID, newNote) md.Note = newNote m.noteInput.Reset() m.selectionState = selectionIdle @@ -981,7 +981,7 @@ func (m stashModel) view() string { var logoOrFilter string if m.showStatusMessage { const gutter = 3 - logoOrFilter = greenFg(truncate(m.statusMessage, m.general.width-gutter)) + logoOrFilter = greenFg(truncate(m.statusMessage, m.common.width-gutter)) } else if m.isFiltering() { logoOrFilter = m.filterInput.View() } else { @@ -995,7 +995,7 @@ func (m stashModel) view() string { // We need to fill any empty height with newlines so the footer reaches // the bottom. - availHeight := m.general.height - + availHeight := m.common.height - stashViewTopPadding - populatedViewHeight - helpHeight - @@ -1008,9 +1008,9 @@ func (m stashModel) view() string { // If the dot pagination is wider than the width of the window // switch to the arabic paginator. - if ansi.PrintableRuneWidth(pagination) > m.general.width-stashViewHorizontalPadding { + if ansi.PrintableRuneWidth(pagination) > m.common.width-stashViewHorizontalPadding { m.paginator().Type = paginator.Arabic - pagination = common.Subtle(m.paginator().View()) + pagination = lib.Subtle(m.paginator().View()) } // We could also look at m.stashFullyLoaded and add an indicator @@ -1036,7 +1036,7 @@ func glowLogoView(text string) string { return te.String(text). Bold(). Foreground(glowLogoTextColor). - Background(common.Fuschia.Color()). + Background(lib.Fuschia.Color()). String() } @@ -1069,14 +1069,14 @@ func (m stashModel) headerView() string { if m.loadingDone() && len(m.markdowns) == 0 { var maybeOffline string - if m.general.authStatus == authFailed { + if m.common.authStatus == authFailed { maybeOffline = " " + offlineHeaderNote } if m.stashedOnly() { - return common.Subtle("Can’t load stash") + maybeOffline + return lib.Subtle("Can’t load stash") + maybeOffline } - return common.Subtle("No markdown files found") + maybeOffline + return lib.Subtle("No markdown files found") + maybeOffline } // Tabs @@ -1110,7 +1110,7 @@ func (m stashModel) headerView() string { } s := strings.Join(sections, dividerBar) - if m.general.authStatus == authFailed { + if m.common.authStatus == authFailed { s += dividerDot + offlineHeaderNote } @@ -1140,7 +1140,7 @@ func (m stashModel) populatedView() string { f("Looking for local files...") } case stashedSection: - if m.general.authStatus == authFailed { + if m.common.authStatus == authFailed { f("Can't load your stash. Are you offline?") } else if m.loadingDone() { f("Nothing stashed yet.") @@ -1148,7 +1148,7 @@ func (m stashModel) populatedView() string { f("Loading your stash...") } case newsSection: - if m.general.authStatus == authFailed { + if m.common.authStatus == authFailed { f("Can't load news. Are you offline?") } else if m.loadingDone() { f("No stashed files found.") diff --git a/ui/stashhelp.go b/ui/stashhelp.go index 243ef15..567b2a1 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "github.com/charmbracelet/charm/ui/common" + lib "github.com/charmbracelet/charm/ui/common" "github.com/muesli/reflow/ansi" ) @@ -195,14 +195,14 @@ func (m stashModel) miniHelpView(entries ...string) string { } var ( - truncationChar = common.Subtle("…") + truncationChar = lib.Subtle("…") truncationWidth = ansi.PrintableRuneWidth(truncationChar) ) var ( next string leftGutter = " " - maxWidth = m.general.width - + maxWidth = m.common.width - stashViewHorizontalPadding - truncationWidth - ansi.PrintableRuneWidth(leftGutter) diff --git a/ui/stashitem.go b/ui/stashitem.go index 03d4c5d..65c2bba 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -5,7 +5,7 @@ import ( "log" "strings" - "github.com/charmbracelet/charm/ui/common" + lib "github.com/charmbracelet/charm/ui/common" rw "github.com/mattn/go-runewidth" "github.com/muesli/termenv" "github.com/sahilm/fuzzy" @@ -19,7 +19,7 @@ const ( func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { var ( - truncateTo = m.general.width - stashViewHorizontalPadding*2 + truncateTo = m.common.width - stashViewHorizontalPadding*2 gutter string title = md.Note date = md.relativeTime() @@ -70,7 +70,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { gutter = dullFuchsiaFg(verticalLine) icon = dullFuchsiaFg(icon) if m.filterState == filterApplied || singleFilteredItem { - s := termenv.Style{}.Foreground(common.Fuschia.Color()) + s := termenv.Style{}.Foreground(lib.Fuschia.Color()) title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) } else { title = fuchsiaFg(title) @@ -87,7 +87,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { title = dimIndigoFg(title) date = dimSubtleIndigoFg(date) } else { - s := termenv.Style{}.Foreground(common.Indigo.Color()) + s := termenv.Style{}.Foreground(lib.Indigo.Color()) title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) date = subtleIndigoFg(date) } @@ -105,7 +105,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { if title == noMemoTitle { title = brightGrayFg(title) } else { - s := termenv.Style{}.Foreground(common.NewColorPair("#dddddd", "#1a1a1a").Color()) + s := termenv.Style{}.Foreground(lib.NewColorPair("#dddddd", "#1a1a1a").Color()) title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) } gutter = " " diff --git a/ui/styles.go b/ui/styles.go index ea86835..6afc101 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -1,7 +1,7 @@ package ui import ( - "github.com/charmbracelet/charm/ui/common" + lib "github.com/charmbracelet/charm/ui/common" te "github.com/muesli/termenv" ) @@ -12,39 +12,39 @@ const ( ) var ( - normalFg = newFgStyle(common.NewColorPair("#dddddd", "#1a1a1a")) - dimNormalFg = newFgStyle(common.NewColorPair("#777777", "#A49FA5")) + normalFg = newFgStyle(lib.NewColorPair("#dddddd", "#1a1a1a")) + dimNormalFg = newFgStyle(lib.NewColorPair("#777777", "#A49FA5")) - brightGrayFg = newFgStyle(common.NewColorPair("#979797", "#847A85")) - dimBrightGrayFg = newFgStyle(common.NewColorPair("#4D4D4D", "#C2B8C2")) + brightGrayFg = newFgStyle(lib.NewColorPair("#979797", "#847A85")) + dimBrightGrayFg = newFgStyle(lib.NewColorPair("#4D4D4D", "#C2B8C2")) - grayFg = newFgStyle(common.NewColorPair("#626262", "#909090")) - midGrayFg = newFgStyle(common.NewColorPair("#4A4A4A", "#B2B2B2")) - darkGrayFg = newFgStyle(common.NewColorPair("#3C3C3C", "#DDDADA")) + grayFg = newFgStyle(lib.NewColorPair("#626262", "#909090")) + midGrayFg = newFgStyle(lib.NewColorPair("#4A4A4A", "#B2B2B2")) + darkGrayFg = newFgStyle(lib.NewColorPair("#3C3C3C", "#DDDADA")) - greenFg = newFgStyle(common.NewColorPair("#04B575", "#04B575")) - dimGreenFg = newFgStyle(common.NewColorPair("#0B5137", "#72D2B0")) + greenFg = newFgStyle(lib.NewColorPair("#04B575", "#04B575")) + dimGreenFg = newFgStyle(lib.NewColorPair("#0B5137", "#72D2B0")) - fuchsiaFg = newFgStyle(common.Fuschia) - dimFuchsiaFg = newFgStyle(common.NewColorPair("#99519E", "#F1A8FF")) + fuchsiaFg = newFgStyle(lib.Fuschia) + dimFuchsiaFg = newFgStyle(lib.NewColorPair("#99519E", "#F1A8FF")) - dullFuchsiaFg = newFgStyle(common.NewColorPair("#AD58B4", "#F793FF")) - dimDullFuchsiaFg = newFgStyle(common.NewColorPair("#6B3A6F", "#F6C9FF")) + dullFuchsiaFg = newFgStyle(lib.NewColorPair("#AD58B4", "#F793FF")) + dimDullFuchsiaFg = newFgStyle(lib.NewColorPair("#6B3A6F", "#F6C9FF")) - indigoFg = newFgStyle(common.Indigo) - dimIndigoFg = newFgStyle(common.NewColorPair("#494690", "#9498FF")) + indigoFg = newFgStyle(lib.Indigo) + dimIndigoFg = newFgStyle(lib.NewColorPair("#494690", "#9498FF")) - subtleIndigoFg = newFgStyle(common.NewColorPair("#514DC1", "#7D79F6")) - dimSubtleIndigoFg = newFgStyle(common.NewColorPair("#383584", "#BBBDFF")) + subtleIndigoFg = newFgStyle(lib.NewColorPair("#514DC1", "#7D79F6")) + dimSubtleIndigoFg = newFgStyle(lib.NewColorPair("#383584", "#BBBDFF")) - yellowFg = newFgStyle(common.YellowGreen) // renders light green on light backgrounds - dullYellowFg = newFgStyle(common.NewColorPair("#9BA92F", "#6BCB94")) // renders light green on light backgrounds - redFg = newFgStyle(common.Red) - faintRedFg = newFgStyle(common.FaintRed) + yellowFg = newFgStyle(lib.YellowGreen) // renders light green on light backgrounds + dullYellowFg = newFgStyle(lib.NewColorPair("#9BA92F", "#6BCB94")) // renders light green on light backgrounds + redFg = newFgStyle(lib.Red) + faintRedFg = newFgStyle(lib.FaintRed) ) // Returns a termenv style with foreground and background options. -func newStyle(fg, bg common.ColorPair, bold bool) func(string) string { +func newStyle(fg, bg lib.ColorPair, bold bool) func(string) string { s := te.Style{}.Foreground(fg.Color()).Background(bg.Color()) if bold { s = s.Bold() @@ -53,6 +53,6 @@ func newStyle(fg, bg common.ColorPair, bold bool) func(string) string { } // Returns a new termenv style with background options only. -func newFgStyle(c common.ColorPair) styleFunc { +func newFgStyle(c lib.ColorPair) styleFunc { return te.Style{}.Foreground(c.Color()).Styled } diff --git a/ui/ui.go b/ui/ui.go index 3fb71c6..29a1608 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -15,6 +15,7 @@ import ( "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/keygen" "github.com/charmbracelet/charm/ui/common" + lib "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glow/utils" runewidth "github.com/mattn/go-runewidth" "github.com/muesli/gitcha" @@ -29,7 +30,7 @@ const ( var ( config Config - glowLogoTextColor = common.Color("#ECFD65") + glowLogoTextColor = lib.Color("#ECFD65") // True if we're logging to a file, in which case we'll log more stuff. debug = false @@ -124,8 +125,8 @@ const ( keygenFinished ) -// General stuff we'll need to access in all models. -type general struct { +// Common stuff we'll need to access in all models. +type commonModel struct { cfg Config cc *charm.Client cwd string @@ -142,12 +143,12 @@ type general struct { filesStashing map[ksuid.KSUID]struct{} } -func (g general) isStashing() bool { - return len(g.filesStashing) > 0 +func (c commonModel) isStashing() bool { + return len(c.filesStashing) > 0 } type model struct { - general *general + common *commonModel state state keygenState keygenState fatalErr error @@ -193,7 +194,7 @@ func newModel(cfg Config) tea.Model { cfg.DocumentTypes.Add(LocalDoc, StashedDoc, ConvertedDoc, NewsDoc) } - general := general{ + common := commonModel{ cfg: cfg, authStatus: authConnecting, filesStashed: make(map[ksuid.KSUID]struct{}), @@ -201,17 +202,17 @@ func newModel(cfg Config) tea.Model { } return model{ - general: &general, + common: &common, state: stateShowStash, keygenState: keygenUnstarted, - pager: newPagerModel(&general), - stash: newStashModel(&general), + pager: newPagerModel(&common), + stash: newStashModel(&common), } } func (m model) Init() tea.Cmd { var cmds []tea.Cmd - d := m.general.cfg.DocumentTypes + d := m.common.cfg.DocumentTypes if d.Contains(StashedDoc) || d.Contains(NewsDoc) { cmds = append(cmds, @@ -314,14 +315,14 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Window size is received when starting up and on every resize case tea.WindowSizeMsg: - m.general.width = msg.Width - m.general.height = msg.Height + m.common.width = msg.Width + m.common.height = msg.Height m.stash.setSize(msg.Width, msg.Height) m.pager.setSize(msg.Width, msg.Height) case initLocalFileSearchMsg: m.localFileFinder = msg.ch - m.general.cwd = msg.cwd + m.common.cwd = msg.cwd cmds = append(cmds, findNextLocalFile(m)) case sshAuthErrMsg: @@ -330,7 +331,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmds = append(cmds, generateSSHKeys) } else { // The keygen ran but things still didn't work and we can't auth - m.general.authStatus = authFailed + m.common.authStatus = authFailed m.stash.err = errors.New("SSH authentication failed; we tried ssh-agent, loading keys from disk, and generating SSH keys") if debug { log.Println("entering offline mode;", m.stash.err) @@ -342,7 +343,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case keygenFailedMsg: // Keygen failed. That sucks. - m.general.authStatus = authFailed + m.common.authStatus = authFailed m.stash.err = errors.New("could not authenticate; could not generate SSH keys") if debug { log.Println("entering offline mode;", m.stash.err) @@ -359,12 +360,12 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmds = append(cmds, newCharmClient) case newCharmClientMsg: - m.general.cc = msg - m.general.authStatus = authOK + m.common.cc = msg + m.common.authStatus = authOK cmds = append(cmds, loadStash(m.stash), loadNews(m.stash)) case stashLoadErrMsg: - m.general.authStatus = authFailed + m.common.authStatus = authFailed case fetchedMarkdownMsg: // We've loaded a markdown file's contents for rendering @@ -392,7 +393,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, cmd case foundLocalFileMsg: - newMd := localFileToMarkdown(m.general.cwd, gitcha.SearchResult(msg)) + newMd := localFileToMarkdown(m.common.cwd, gitcha.SearchResult(msg)) m.stash.addMarkdowns(newMd) if m.stash.isFiltering() { newMd.buildFilterValue() @@ -406,8 +407,8 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Common handling that should happen regardless of application state md := markdown(msg) m.stash.addMarkdowns(&md) - m.general.filesStashed[msg.localID] = struct{}{} - delete(m.general.filesStashing, md.localID) + m.common.filesStashed[msg.localID] = struct{}{} + delete(m.common.filesStashing, md.localID) if m.stash.isFiltering() { cmds = append(cmds, filterMarkdowns(m.stash)) @@ -415,8 +416,8 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case stashFailMsg: // Common handling that should happen regardless of application state - delete(m.general.filesStashed, msg.markdown.localID) - delete(m.general.filesStashing, msg.markdown.localID) + delete(m.common.filesStashed, msg.markdown.localID) + delete(m.common.filesStashing, msg.markdown.localID) case filteredMarkdownMsg: if m.state == stateShowDocument { @@ -464,8 +465,8 @@ func errorView(err error, fatal bool) string { } s := fmt.Sprintf("%s\n\n%v\n\n%s", te.String(" ERROR "). - Foreground(common.Cream.Color()). - Background(common.Red.Color()). + Foreground(lib.Cream.Color()). + Background(lib.Red.Color()). String(), err, common.Subtle(exitMsg), @@ -486,7 +487,7 @@ func findLocalFiles(m model) tea.Cmd { } var ignore []string - if !m.general.cfg.ShowAllFiles { + if !m.common.cfg.ShowAllFiles { ignore = ignorePatterns(m) } @@ -542,14 +543,14 @@ func newCharmClient() tea.Msg { func loadStash(m stashModel) tea.Cmd { return func() tea.Msg { - if m.general.cc == nil { + if m.common.cc == nil { err := errors.New("no charm client") if debug { log.Println("error loading stash:", err) } return stashLoadErrMsg{err} } - stash, err := m.general.cc.GetStash(m.serverPage) + stash, err := m.common.cc.GetStash(m.serverPage) if err != nil { if debug { if _, ok := err.(charm.ErrAuthFailed); ok { @@ -569,14 +570,14 @@ func loadStash(m stashModel) tea.Cmd { func loadNews(m stashModel) tea.Cmd { return func() tea.Msg { - if m.general.cc == nil { + if m.common.cc == nil { err := errors.New("no charm client") if debug { log.Println("error loading news:", err) } return newsLoadErrMsg{err} } - news, err := m.general.cc.GetNews(1) // just fetch the first page + news, err := m.common.cc.GetNews(1) // just fetch the first page if err != nil { if debug { log.Println("error loading news:", err) From 25dd530fb77d39f5316367a9a1e7aaca8a8f060e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 10 Dec 2020 22:53:09 -0500 Subject: [PATCH 632/911] Improve comments --- ui/stash.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index a3546b4..6995907 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -49,7 +49,7 @@ type markdownFetchFailedMsg struct { // MODEL -// High-level state of the application. +// stashViewState is the high-level state of the file listing. type stashViewState int const ( @@ -67,6 +67,8 @@ const ( newsSection ) +// section contains definitions and state information for displaying a tab and +// its contents in the file listing view. type section struct { key sectionKey docTypes DocTypeSet @@ -74,7 +76,7 @@ type section struct { cursor int } -// Maps sections to their associated types +// map sections to their associated types. var sections = map[sectionKey]section{ localSection: { key: localSection, @@ -90,7 +92,7 @@ var sections = map[sectionKey]section{ }, } -// The current filtering state. +// filterState is the current filtering state in the file listing. type filterState int const ( @@ -99,7 +101,7 @@ const ( filterApplied // a filter is applied and user is not editing filter ) -// The state of the currently selected document. +// selectionState is the state of the currently selected document. type selectionState int const ( From 64da53ede63c64d1a876973d1ce97508247c5377 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 10 Dec 2020 22:53:24 -0500 Subject: [PATCH 633/911] Rename a function --- ui/stash.go | 51 +++++++++++++++++++++++++-------------------------- ui/ui.go | 2 +- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 6995907..c698ce8 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -1194,7 +1194,7 @@ func (m stashModel) populatedView() string { // loadRemoteMarkdown is a command for loading markdown from the server. func loadRemoteMarkdown(cc *charm.Client, md *markdown) tea.Cmd { return func() tea.Msg { - newMD, err := loadMarkdownFromCharm(cc, md.ID, md.markdownType) + newMD, err := fetchMarkdown(cc, md.ID, md.markdownType) if err != nil { if debug { log.Printf("error loading %s markdown (ID %d, Note: '%s'): %v", md.markdownType, md.ID, md.Note, err) @@ -1210,31 +1210,6 @@ func loadRemoteMarkdown(cc *charm.Client, md *markdown) tea.Cmd { } } -// loadMarkdownFromCharm performs the actual I/O for loading markdown from the -// sever. -func loadMarkdownFromCharm(cc *charm.Client, id int, t DocType) (*markdown, error) { - var md *charm.Markdown - var err error - - switch t { - case StashedDoc, ConvertedDoc: - md, err = cc.GetStashMarkdown(id) - case NewsDoc: - md, err = cc.GetNewsMarkdown(id) - default: - err = fmt.Errorf("unknown markdown type: %s", t) - } - - if err != nil { - return nil, err - } - - return &markdown{ - markdownType: t, - Markdown: *md, - }, nil -} - func loadLocalMarkdown(md *markdown) tea.Cmd { return func() tea.Msg { if md.markdownType != LocalDoc { @@ -1296,6 +1271,30 @@ func filterMarkdowns(m stashModel) tea.Cmd { // ETC +// fetchMarkdown performs the actual I/O for loading markdown from the sever. +func fetchMarkdown(cc *charm.Client, id int, t DocType) (*markdown, error) { + var md *charm.Markdown + var err error + + switch t { + case StashedDoc, ConvertedDoc: + md, err = cc.GetStashMarkdown(id) + case NewsDoc: + md, err = cc.GetNewsMarkdown(id) + default: + err = fmt.Errorf("unknown markdown type: %s", t) + } + + if err != nil { + return nil, err + } + + return &markdown{ + markdownType: t, + Markdown: *md, + }, nil +} + // Delete a markdown from a slice of markdowns. func deleteMarkdown(markdowns []*markdown, target *markdown) ([]*markdown, error) { index := -1 diff --git a/ui/ui.go b/ui/ui.go index 29a1608..4471b90 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -658,7 +658,7 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { md.Body = string(data) case NewsDoc: - newMD, err := loadMarkdownFromCharm(cc, md.ID, md.markdownType) + newMD, err := fetchMarkdown(cc, md.ID, md.markdownType) if err != nil { return stashFailMsg{err, md} } From 8d7b61468849bdfbfe37f0e2d3b042384790e62e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 11 Dec 2020 19:54:19 -0500 Subject: [PATCH 634/911] Fine tuning + subtle behavioral adjustments to spinners + status messages --- go.mod | 2 +- go.sum | 6 ++---- ui/stash.go | 48 ++++++++++++++++++++++++++++++++---------------- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 6172ba0..9195fbe 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/alecthomas/chroma v0.8.0 // indirect - github.com/charmbracelet/bubbles v0.7.5 + github.com/charmbracelet/bubbles v0.7.6-0.20201212003737-11f56f9b6b3f github.com/charmbracelet/bubbletea v0.12.2 github.com/charmbracelet/charm v0.8.2 github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 diff --git a/go.sum b/go.sum index 024a2d0..ed81a33 100644 --- a/go.sum +++ b/go.sum @@ -43,8 +43,8 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.6.0/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= -github.com/charmbracelet/bubbles v0.7.5 h1:N6TiahuRt2iGNE5gYxKBQ5/C6Lc8xxSp5LY9QJ09mS4= -github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGimk1BE6cmHijOkM= +github.com/charmbracelet/bubbles v0.7.6-0.20201212003737-11f56f9b6b3f h1:6g/MQxdygWh8Ga0c5uR1Z8uz5wa3uaQjW0Hive/XBWw= +github.com/charmbracelet/bubbles v0.7.6-0.20201212003737-11f56f9b6b3f/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZSG46SFauoZj22s= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= github.com/charmbracelet/bubbletea v0.10.5/go.mod h1:Nay5oWkkSZvc6E/be+W3nDFXAsVytNUNKV9jbXcuae0= github.com/charmbracelet/bubbletea v0.12.2 h1:y9Yo2Pv8tcm3mAJsWONGsmHhzrbNxJVxpVtemikxE9A= @@ -241,8 +241,6 @@ github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkA github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/ksuid v1.0.3 h1:FoResxvleQwYiPAVKe1tMUlEirodZqlqglIuFsdDntY= github.com/segmentio/ksuid v1.0.3/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= diff --git a/ui/stash.go b/ui/stash.go index c698ce8..0163f16 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -26,6 +26,7 @@ const ( stashViewTopPadding = 5 // logo, status bar, gaps stashViewBottomPadding = 3 // pagination and gaps, but not help stashViewHorizontalPadding = 6 + stashedStatusMessage = "Stashed!" ) var ( @@ -111,19 +112,20 @@ const ( ) type stashModel struct { - common *commonModel - err error - spinner spinner.Model - noteInput textinput.Model - filterInput textinput.Model - stashFullyLoaded bool // have we loaded all available stashed documents from the server? - viewState stashViewState - filterState filterState - selectionState selectionState - showFullHelp bool - showStatusMessage bool - statusMessage string - statusMessageTimer *time.Timer + common *commonModel + err error + spinner spinner.Model + noteInput textinput.Model + filterInput textinput.Model + stashFullyLoaded bool // have we loaded all available stashed documents from the server? + viewState stashViewState + filterState filterState + selectionState selectionState + showFullHelp bool + showStatusMessage bool + statusMessage string + statusMessageTimer *time.Timer + stashStatusMessageQueued bool // Available document sections we can cycle through. We use a slice, rather // than a map, because order is important. @@ -419,7 +421,7 @@ func newStashModel(common *commonModel) stashModel { sp.Spinner = spinner.Line sp.ForegroundColor = lib.SpinnerColor.String() sp.HideFor = time.Millisecond * 50 - sp.MinimumLifetime = time.Millisecond * 180 + sp.MinimumLifetime = time.Millisecond * 250 sp.Start() ni := textinput.NewModel() @@ -558,6 +560,13 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { newSpinnerModel, cmd := m.spinner.Update(msg) m.spinner = newSpinnerModel cmds = append(cmds, cmd) + } else if !stashing && !spinnerVisible && m.stashStatusMessageQueued { + m.stashStatusMessageQueued = false + cmds = append(cmds, m.newStatusMessage(stashedStatusMessage)) + } + + if spinnerVisible && m.showStatusMessage { + m.hideStatusMessage() } // A note was set on a document. This may have happened in the pager so @@ -572,7 +581,14 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { // Note: mechanical stuff related to stash success is handled in the parent // update function. case stashSuccessMsg: - cmds = append(cmds, m.newStatusMessage("Stashed!")) + m.spinner.Finish() + if m.spinner.Visible() { + // We want to show the 'stashed!' status message, but need to wait + // until the spinner goes away first. + m.stashStatusMessageQueued = true + } else { + cmds = append(cmds, m.newStatusMessage(stashedStatusMessage)) + } // Note: mechanical stuff related to stash failure is handled in the parent // update function. @@ -961,7 +977,7 @@ func (m stashModel) view() string { case stashStateReady: loadingIndicator := " " - if !m.localOnly() && (!m.loadingDone() || m.spinner.Visible()) { + if !m.loadingDone() || m.spinner.Visible() { loadingIndicator = m.spinner.View() } From 53155f1e16c2482f0f2a142aebae400943b87d4e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 14 Dec 2020 15:44:03 -0500 Subject: [PATCH 635/911] Adjust spinner thresholds and timing so stashing feels snappier --- ui/stash.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 0163f16..5486b16 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -420,8 +420,8 @@ func newStashModel(common *commonModel) stashModel { sp := spinner.NewModel() sp.Spinner = spinner.Line sp.ForegroundColor = lib.SpinnerColor.String() - sp.HideFor = time.Millisecond * 50 - sp.MinimumLifetime = time.Millisecond * 250 + sp.HideFor = time.Millisecond * 100 + sp.MinimumLifetime = time.Millisecond * 180 sp.Start() ni := textinput.NewModel() From 59f8a002d0787f763f62f7485daa46dadfda4b5b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 14 Dec 2020 16:26:29 -0500 Subject: [PATCH 636/911] Make "already stashed" status messages more subtle --- ui/stash.go | 54 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 5486b16..d07a033 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -26,7 +26,11 @@ const ( stashViewTopPadding = 5 // logo, status bar, gaps stashViewBottomPadding = 3 // pagination and gaps, but not help stashViewHorizontalPadding = 6 - stashedStatusMessage = "Stashed!" +) + +var ( + stashedStatusMessage = statusMessage{normalStatusMessage, "Stashed!"} + alreadyStashedStatusMessage = statusMessage{subtleStatusMessage, "Already stashed"} ) var ( @@ -111,6 +115,32 @@ const ( selectionPromptingDelete ) +// statusMessageType adds some context to the status message being sent. +type statusMessageType int + +// Types of status messages. +const ( + normalStatusMessage statusMessageType = iota + subtleStatusMessage +) + +// statusMessage is an ephemeral note displayed in the UI. +type statusMessage struct { + status statusMessageType + message string +} + +// String returns a styled version of the status message appropriate for the +// given context. +func (s statusMessage) String() string { + switch s.status { + case subtleStatusMessage: + return dimGreenFg(s.message) + default: + return greenFg(s.message) + } +} + type stashModel struct { common *commonModel err error @@ -123,7 +153,7 @@ type stashModel struct { selectionState selectionState showFullHelp bool showStatusMessage bool - statusMessage string + statusMessage statusMessage statusMessageTimer *time.Timer stashStatusMessageQueued bool @@ -355,9 +385,9 @@ func (m *stashModel) openMarkdown(md *markdown) tea.Cmd { return tea.Batch(cmd, spinner.Tick) } -func (m *stashModel) newStatusMessage(s string) tea.Cmd { +func (m *stashModel) newStatusMessage(sm statusMessage) tea.Cmd { m.showStatusMessage = true - m.statusMessage = s + m.statusMessage = sm if m.statusMessageTimer != nil { m.statusMessageTimer.Stop() } @@ -367,7 +397,7 @@ func (m *stashModel) newStatusMessage(s string) tea.Cmd { func (m *stashModel) hideStatusMessage() { m.showStatusMessage = false - m.statusMessage = "" + m.statusMessage = statusMessage{} if m.statusMessageTimer != nil { m.statusMessageTimer.Stop() } @@ -543,7 +573,10 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { if msg.note != "" { s += ": " + msg.note } - cmd := m.newStatusMessage(s) + cmd := m.newStatusMessage(statusMessage{ + status: normalStatusMessage, + message: s, + }) return m, cmd case filteredMarkdownMsg: @@ -593,7 +626,10 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { // Note: mechanical stuff related to stash failure is handled in the parent // update function. case stashFailMsg: - cmds = append(cmds, m.newStatusMessage("Couldn’t stash :(")) + cmds = append(cmds, m.newStatusMessage(statusMessage{ + status: normalStatusMessage, + message: "Couldn’t stash :(", + })) case statusMessageTimeoutMsg: if applicationContext(msg) == stashContext { @@ -745,7 +781,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { } if _, alreadyStashed := m.common.filesStashed[md.localID]; alreadyStashed { - cmds = append(cmds, m.newStatusMessage("Already stashed")) + cmds = append(cmds, m.newStatusMessage(alreadyStashedStatusMessage)) break } @@ -999,7 +1035,7 @@ func (m stashModel) view() string { var logoOrFilter string if m.showStatusMessage { const gutter = 3 - logoOrFilter = greenFg(truncate(m.statusMessage, m.common.width-gutter)) + logoOrFilter = m.statusMessage.String() // TODO: auto-truncate } else if m.isFiltering() { logoOrFilter = m.filterInput.View() } else { From 28ccb85b2e1f37d2730c56ab44ff7abfd1cbce96 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 14 Dec 2020 18:42:33 -0500 Subject: [PATCH 637/911] Use ANSI-aware truncation --- go.mod | 2 +- go.sum | 2 ++ ui/pager.go | 5 +++-- ui/stash.go | 3 +-- ui/stashitem.go | 11 ++++++----- ui/ui.go | 9 +-------- 6 files changed, 14 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 9195fbe..82a3be2 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6 github.com/muesli/go-app-paths v0.2.1 - github.com/muesli/reflow v0.2.0 + github.com/muesli/reflow v0.2.1-0.20201126184510-3bcb929042f2 github.com/muesli/termenv v0.7.4 github.com/sahilm/fuzzy v0.1.0 github.com/segmentio/ksuid v1.0.3 diff --git a/go.sum b/go.sum index ed81a33..cf2fc0e 100644 --- a/go.sum +++ b/go.sum @@ -202,6 +202,8 @@ github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQ github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/reflow v0.2.0 h1:2o0UBJPHHH4fa2GCXU4Rg4DwOtWPMekCeyc5EWbAQp0= github.com/muesli/reflow v0.2.0/go.mod h1:qT22vjVmM9MIUeLgsVYe/Ye7eZlbv9dZjL3dVhUqLX8= +github.com/muesli/reflow v0.2.1-0.20201126184510-3bcb929042f2 h1:+cpkcmASpeBn4qXz2tU+x+njyKe91NoHXqrJdhoDnZo= +github.com/muesli/reflow v0.2.1-0.20201126184510-3bcb929042f2/go.mod h1:qT22vjVmM9MIUeLgsVYe/Ye7eZlbv9dZjL3dVhUqLX8= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= diff --git a/ui/pager.go b/ui/pager.go index 262d54e..3192264 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -16,6 +16,7 @@ import ( "github.com/charmbracelet/glamour" runewidth "github.com/mattn/go-runewidth" "github.com/muesli/reflow/ansi" + "github.com/muesli/reflow/truncate" te "github.com/muesli/termenv" ) @@ -403,13 +404,13 @@ func (m pagerModel) statusBarView(b *strings.Builder) { note = "(No memo)" } } - note = truncate(" "+note+" ", max(0, + note = truncate.StringWithTail(" "+note+" ", uint(max(0, m.common.width- ansi.PrintableRuneWidth(logo)- ansi.PrintableRuneWidth(statusIndicator)- ansi.PrintableRuneWidth(scrollPercent)- ansi.PrintableRuneWidth(helpNote), - )) + )), ellipsis) if showStatusMessage { note = statusBarMessageStyle(note) } else { diff --git a/ui/stash.go b/ui/stash.go index d07a033..0aeb936 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -1034,8 +1034,7 @@ func (m stashModel) view() string { // Rules for the logo, filter and status message. var logoOrFilter string if m.showStatusMessage { - const gutter = 3 - logoOrFilter = m.statusMessage.String() // TODO: auto-truncate + logoOrFilter = m.statusMessage.String() } else if m.isFiltering() { logoOrFilter = m.filterInput.View() } else { diff --git a/ui/stashitem.go b/ui/stashitem.go index 65c2bba..4b3d19e 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -6,7 +6,8 @@ import ( "strings" lib "github.com/charmbracelet/charm/ui/common" - rw "github.com/mattn/go-runewidth" + "github.com/muesli/reflow/ansi" + "github.com/muesli/reflow/truncate" "github.com/muesli/termenv" "github.com/sahilm/fuzzy" ) @@ -19,7 +20,7 @@ const ( func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { var ( - truncateTo = m.common.width - stashViewHorizontalPadding*2 + truncateTo = uint(m.common.width - stashViewHorizontalPadding*2) gutter string title = md.Note date = md.relativeTime() @@ -31,16 +32,16 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { if title == "" { title = "News" } else { - title = truncate(title, truncateTo) + title = truncate.StringWithTail(title, truncateTo, ellipsis) } case StashedDoc, ConvertedDoc: icon = fileListingStashIcon if title == "" { title = noMemoTitle } - title = truncate(title, truncateTo-rw.StringWidth(icon)) + title = truncate.StringWithTail(title, truncateTo-uint(ansi.PrintableRuneWidth(icon)), ellipsis) default: - title = truncate(title, truncateTo) + title = truncate.StringWithTail(title, truncateTo, ellipsis) } isSelected := index == m.cursor() diff --git a/ui/ui.go b/ui/ui.go index 4471b90..bd13537 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -17,7 +17,6 @@ import ( "github.com/charmbracelet/charm/ui/common" lib "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glow/utils" - runewidth "github.com/mattn/go-runewidth" "github.com/muesli/gitcha" te "github.com/muesli/termenv" "github.com/segmentio/ksuid" @@ -26,6 +25,7 @@ import ( const ( noteCharacterLimit = 256 // should match server statusMessageTimeout = time.Second * 2 // how long to show status messages like "stashed!" + ellipsis = "…" ) var ( @@ -743,13 +743,6 @@ func indent(s string, n int) string { return b.String() } -func truncate(str string, num int) string { - if num < 1 { - return str - } - return runewidth.Truncate(str, num, "…") -} - func min(a, b int) int { if a < b { return a From 47b24f66d0c139b631df56610a580dc6da90e2ce Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 14 Dec 2020 18:54:39 -0500 Subject: [PATCH 638/911] Move status message next to the logo in the file browser --- ui/stash.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 0aeb936..46aab86 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -16,6 +16,7 @@ import ( "github.com/charmbracelet/charm" lib "github.com/charmbracelet/charm/ui/common" "github.com/muesli/reflow/ansi" + "github.com/muesli/reflow/truncate" te "github.com/muesli/termenv" "github.com/sahilm/fuzzy" ) @@ -1032,14 +1033,18 @@ func (m stashModel) view() string { } // Rules for the logo, filter and status message. - var logoOrFilter string - if m.showStatusMessage { - logoOrFilter = m.statusMessage.String() + logoOrFilter := " " + if m.showStatusMessage && m.isFiltering() { + logoOrFilter += m.statusMessage.String() } else if m.isFiltering() { - logoOrFilter = m.filterInput.View() + logoOrFilter += m.filterInput.View() } else { - logoOrFilter = glowLogoView(" Glow ") + logoOrFilter += glowLogoView(" Glow ") + if m.showStatusMessage { + logoOrFilter += " " + m.statusMessage.String() + } } + logoOrFilter = truncate.StringWithTail(logoOrFilter, uint(m.common.width), ellipsis) help, helpHeight := m.helpView() @@ -1072,7 +1077,7 @@ func (m stashModel) view() string { } s += fmt.Sprintf( - "%s %s\n\n %s\n\n%s\n\n%s %s\n\n%s", + "%s%s\n\n %s\n\n%s\n\n%s %s\n\n%s", loadingIndicator, logoOrFilter, header, From 37a9b6846f9667caca2062a131689066156b41a1 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 14 Dec 2020 19:53:06 -0500 Subject: [PATCH 639/911] Filter is now called find --- ui/stash.go | 2 +- ui/stashhelp.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 46aab86..318e7f1 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -462,7 +462,7 @@ func newStashModel(common *commonModel) stashModel { ni.Focus() si := textinput.NewModel() - si.Prompt = stashTextInputPromptStyle("Filter: ") + si.Prompt = stashTextInputPromptStyle("Find: ") si.CursorColor = lib.Fuschia.String() si.CharLimit = noteCharacterLimit si.Focus() diff --git a/ui/stashhelp.go b/ui/stashhelp.go index 567b2a1..4a1bbc1 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -142,9 +142,9 @@ func (m stashModel) helpView() (string, int) { // If we're browsing a filtered set if m.filterState == filterApplied { - filterHelp = []string{"/", "edit filter", "esc", "clear filter"} + filterHelp = []string{"/", "edit search", "esc", "clear search"} } else { - filterHelp = []string{"/", "filter"} + filterHelp = []string{"/", "find"} } if isStashed { From ca0dfecb1c62f32cf90ff21fb905726ba0e45638 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 15 Dec 2020 11:11:16 -0500 Subject: [PATCH 640/911] Fix bug where deleting newly stashed news could delete the wrong item --- ui/stash.go | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 318e7f1..e30082b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -898,8 +898,8 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { return deleteStashedItem(m.common.cc, smd.ID) + // Any other key cancels deletion default: - // Any other keys cancels deletion m.selectionState = selectionIdle } } @@ -1356,17 +1356,9 @@ func deleteMarkdown(markdowns []*markdown, target *markdown) ([]*markdown, error index := -1 for i, v := range markdowns { - switch target.markdownType { - case ConvertedDoc: - if v.markdownType == ConvertedDoc && v.localPath == target.localPath { - index = i - } - case StashedDoc: - if v.ID == target.ID { - index = i - } - default: - return nil, fmt.Errorf("%s documents cannot be deleted", target.markdownType) + if v.localID == target.localID { + index = i + break } } From 84843e4f1352acd7bcabddfab54938c3180e0bea Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 15 Dec 2020 11:22:52 -0500 Subject: [PATCH 641/911] Sort local ID as a last resort as not all markdowns will have an SQL ID --- ui/markdown.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ui/markdown.go b/ui/markdown.go index 9b82de9..3d2627c 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -89,8 +89,10 @@ func (m markdownsByLocalFirst) Less(i, j int) bool { return m[i].CreatedAt.After(m[j].CreatedAt) } - // If the timestamps also match, sort by ID. - return m[i].ID > m[j].ID + // If the timestamps also match, sort by local ID. + localIDs := []ksuid.KSUID{m[i].localID, m[j].localID} + ksuid.Sort(localIDs) + return localIDs[0] == m[i].localID } func (m markdown) relativeTime() string { From 03db9a6869b76ed34ffd6a4e9f0aff223961e192 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 15 Dec 2020 13:37:11 -0500 Subject: [PATCH 642/911] Put filter results in a tab --- ui/markdown.go | 37 ++++++++++------- ui/pager.go | 4 +- ui/stash.go | 109 +++++++++++++++++++++++++++++++------------------ ui/ui.go | 14 +++---- 4 files changed, 100 insertions(+), 64 deletions(-) diff --git a/ui/markdown.go b/ui/markdown.go index 3d2627c..5d2a232 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -19,10 +19,16 @@ import ( type markdown struct { markdownType DocType - // Local identifier. This allows us to precisely determine the stashed - // state of a markdown, regardless of whether it exists locally or on the - // network. - localID ksuid.KSUID + // Stash identifier. This exists so we can keep track of documents stashed + // in-session as they relate to their original, non-stashed counterparts. + // All documents have a stashID, however when a document is stashed that + // document inherits the stashID of the original. + stashID ksuid.KSUID + + // Unique identifier. Unlike the stash identifier, this value should always + // be unique so we can confidently find it an operate on it (versus stashID, + // which could match both an original or stashed document). + uniqueID ksuid.KSUID // Full path of a local markdown file. Only relevant to local documents and // those that have been stashed in this session. @@ -36,10 +42,11 @@ type markdown struct { charm.Markdown } -func (m *markdown) generateLocalID() { - if m.localID.IsNil() { - m.localID = ksuid.New() +func (m *markdown) generateIDs() { + if m.stashID.IsNil() { + m.stashID = ksuid.New() } + m.uniqueID = ksuid.New() } // Generate the value we're doing to filter against. @@ -55,9 +62,9 @@ func (m *markdown) buildFilterValue() { m.filterValue = note } -// sortAsLocal returns whether or not this markdown should be sorted as though +// shouldSortAsLocal returns whether or not this markdown should be sorted as though // it's a local markdown document. -func (m markdown) sortAsLocal() bool { +func (m markdown) shouldSortAsLocal() bool { return m.markdownType == LocalDoc || m.markdownType == ConvertedDoc } @@ -67,8 +74,8 @@ type markdownsByLocalFirst []*markdown func (m markdownsByLocalFirst) Len() int { return len(m) } func (m markdownsByLocalFirst) Swap(i, j int) { m[i], m[j] = m[j], m[i] } func (m markdownsByLocalFirst) Less(i, j int) bool { - iIsLocal := m[i].sortAsLocal() - jIsLocal := m[j].sortAsLocal() + iIsLocal := m[i].shouldSortAsLocal() + jIsLocal := m[j].shouldSortAsLocal() // Local files (and files that used to be local) come first if iIsLocal && !jIsLocal { @@ -89,10 +96,10 @@ func (m markdownsByLocalFirst) Less(i, j int) bool { return m[i].CreatedAt.After(m[j].CreatedAt) } - // If the timestamps also match, sort by local ID. - localIDs := []ksuid.KSUID{m[i].localID, m[j].localID} - ksuid.Sort(localIDs) - return localIDs[0] == m[i].localID + // If the times also match, sort by unqiue ID. + ids := []ksuid.KSUID{m[i].uniqueID, m[j].uniqueID} + ksuid.Sort(ids) + return ids[0] == m[i].uniqueID } func (m markdown) relativeTime() string { diff --git a/ui/pager.go b/ui/pager.go index 3192264..8494c23 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -242,7 +242,7 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { md := m.currentDocument - _, alreadyStashed := m.common.filesStashed[md.localID] + _, alreadyStashed := m.common.filesStashed[md.stashID] if alreadyStashed { cmds = append(cmds, m.showStatusMessage("Already stashed")) break @@ -314,7 +314,7 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { } case stashFailMsg: - delete(m.common.filesStashed, msg.markdown.localID) + delete(m.common.filesStashed, msg.markdown.stashID) case statusMessageTimeoutMsg: m.state = pagerStateBrowse diff --git a/ui/stash.go b/ui/stash.go index e30082b..5d100ff 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -71,6 +71,7 @@ const ( localSection = iota stashedSection newsSection + filterSection ) // section contains definitions and state information for displaying a tab and @@ -85,16 +86,24 @@ type section struct { // map sections to their associated types. var sections = map[sectionKey]section{ localSection: { - key: localSection, - docTypes: NewDocTypeSet(LocalDoc), + key: localSection, + docTypes: NewDocTypeSet(LocalDoc), + paginator: newStashPaginator(), }, stashedSection: { - key: stashedSection, - docTypes: NewDocTypeSet(StashedDoc, ConvertedDoc), + key: stashedSection, + docTypes: NewDocTypeSet(StashedDoc, ConvertedDoc), + paginator: newStashPaginator(), }, newsSection: { - key: newsSection, - docTypes: NewDocTypeSet(NewsDoc), + key: newsSection, + docTypes: NewDocTypeSet(NewsDoc), + paginator: newStashPaginator(), + }, + filterSection: { + key: filterSection, + docTypes: DocTypeSet{}, + paginator: newStashPaginator(), }, } @@ -246,10 +255,17 @@ func (m *stashModel) resetFiltering() { sort.Stable(markdownsByLocalFirst(m.markdowns)) m.filteredMarkdowns = nil m.updatePagination() + + if m.sections[len(m.sections)-1].key == filterSection { + m.sections = m.sections[:len(m.sections)-1] + } + if m.sectionIndex > len(m.sections)-1 { + m.sectionIndex = 0 + } } // Is a filter currently being applied? -func (m stashModel) isFiltering() bool { +func (m stashModel) filterApplied() bool { return m.filterState != unfiltered } @@ -257,7 +273,7 @@ func (m stashModel) isFiltering() bool { func (m stashModel) shouldUpdateFilter() bool { // If we're in the middle of setting a note don't update the filter so that // the focus won't jump around. - return m.isFiltering() && m.selectionState != selectionSettingNote + return m.filterApplied() && m.selectionState != selectionSettingNote } // Update pagination according to the amount of markdowns for the current @@ -305,11 +321,11 @@ func (m stashModel) selectedMarkdown() *markdown { func (m *stashModel) addMarkdowns(mds ...*markdown) { if len(mds) > 0 { for _, md := range mds { - md.generateLocalID() + md.generateIDs() } m.markdowns = append(m.markdowns, mds...) - if !m.isFiltering() { + if !m.filterApplied() { sort.Stable(markdownsByLocalFirst(m.markdowns)) } m.updatePagination() @@ -323,7 +339,7 @@ func (m stashModel) countMarkdowns(t DocType) (found int) { } var mds []*markdown - if m.isFiltering() { + if m.filterState == filtering { mds = m.getVisibleMarkdowns() } else { mds = m.markdowns @@ -359,7 +375,7 @@ func (m stashModel) getMarkdownByType(types ...DocType) []*markdown { // Returns the markdowns that should be currently shown. func (m stashModel) getVisibleMarkdowns() []*markdown { - if m.isFiltering() { + if m.filterState == filtering || m.currentSection().key == filterSection { return m.filteredMarkdowns } @@ -485,15 +501,6 @@ func newStashModel(common *commonModel) stashModel { } } - p := paginator.NewModel() - p.Type = paginator.Dots - p.ActiveDot = brightGrayFg("•") - p.InactiveDot = darkGrayFg("•") - - for i := range s { - s[i].paginator = p - } - m := stashModel{ common: common, spinner: sp, @@ -507,6 +514,14 @@ func newStashModel(common *commonModel) stashModel { return m } +func newStashPaginator() paginator.Model { + p := paginator.NewModel() + p.Type = paginator.Dots + p.ActiveDot = brightGrayFg("•") + p.InactiveDot = darkGrayFg("•") + return p +} + // UPDATE func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { @@ -558,7 +573,7 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { // If we're filtering build filter indexes immediately so any // matching results will show up in the filter. - if m.isFiltering() { + if m.filterApplied() { for _, md := range docs { md.buildFilterValue() } @@ -692,14 +707,15 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { m.paginator().Page = m.paginator().TotalPages - 1 m.setCursor(m.paginator().ItemsOnPage(numDocs) - 1) + // Clear filter (if applicable) case "esc": - if m.isFiltering() { + if m.filterApplied() { m.resetFiltering() - break } + // Next section case "tab": - if len(m.sections) == 0 || m.isFiltering() { + if len(m.sections) == 0 || m.filterState == filtering { break } m.sectionIndex++ @@ -708,8 +724,9 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { } m.updatePagination() + // Previous section case "shift+tab": - if len(m.sections) == 0 { + if len(m.sections) == 0 || m.filterState == filtering { break } m.sectionIndex-- @@ -781,21 +798,21 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { break } - if _, alreadyStashed := m.common.filesStashed[md.localID]; alreadyStashed { + if _, alreadyStashed := m.common.filesStashed[md.stashID]; alreadyStashed { cmds = append(cmds, m.newStatusMessage(alreadyStashedStatusMessage)) break } - if !stashableDocTypes.Contains(md.markdownType) || md.localID.IsNil() { - if debug && md.localID.IsNil() { + if !stashableDocTypes.Contains(md.markdownType) || md.stashID.IsNil() { + if debug && md.stashID.IsNil() { log.Printf("refusing to stash markdown; local ID path is nil: %#v", md) } break } // Checks passed; perform the stash - m.common.filesStashed[md.localID] = struct{}{} - m.common.filesStashing[md.localID] = struct{}{} + m.common.filesStashed[md.stashID] = struct{}{} + m.common.filesStashing[md.stashID] = struct{}{} cmds = append(cmds, stashDocument(m.common.cc, *md)) if m.loadingDone() && !m.spinner.Visible() { @@ -881,11 +898,11 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { } // Remove from the things-we-stashed-this-session set - delete(m.common.filesStashed, md.localID) + delete(m.common.filesStashed, md.stashID) // Delete optimistically and remove the stashed item before // we've received a success response. - if m.isFiltering() { + if m.filterApplied() { mds, _ := deleteMarkdown(m.filteredMarkdowns, m.markdowns[i]) m.filteredMarkdowns = mds } @@ -896,6 +913,10 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { m.selectionState = selectionIdle m.updatePagination() + if len(m.filteredMarkdowns) == 0 { + m.resetFiltering() + } + return deleteStashedItem(m.common.cc, smd.ID) // Any other key cancels deletion @@ -942,6 +963,12 @@ func (m *stashModel) handleFiltering(msg tea.Msg) tea.Cmd { break } + // Add new section if it's not present + if m.sections[len(m.sections)-1].key != filterSection { + m.sections = append(m.sections, sections[filterSection]) + } + m.sectionIndex = len(m.sections) - 1 + m.filterInput.Blur() m.filterState = filterApplied @@ -1034,9 +1061,9 @@ func (m stashModel) view() string { // Rules for the logo, filter and status message. logoOrFilter := " " - if m.showStatusMessage && m.isFiltering() { + if m.showStatusMessage && m.filterState == filtering { logoOrFilter += m.statusMessage.String() - } else if m.isFiltering() { + } else if m.filterState == filtering { logoOrFilter += m.filterInput.View() } else { logoOrFilter += glowLogoView(" Glow ") @@ -1106,7 +1133,7 @@ func (m stashModel) headerView() string { var sections []string // Filter results - if m.isFiltering() { + if m.filterState == filtering { if localCount+stashedCount+newsCount == 0 { return grayFg("Nothing found.") } else { @@ -1157,6 +1184,8 @@ func (m stashModel) headerView() string { continue } s = fmt.Sprintf("%d news", newsCount) + case filterSection: + s = fmt.Sprintf("%d “%s”", len(m.filteredMarkdowns), m.filterInput.Value()) } if m.sectionIndex == i && len(m.sections) > 1 { @@ -1178,7 +1207,7 @@ func (m stashModel) headerView() string { func (m stashModel) populatedView() string { mds := m.getVisibleMarkdowns() - if len(mds) == 0 && m.isFiltering() { + if len(mds) == 0 && m.filterApplied() { return "" } @@ -1261,7 +1290,7 @@ func loadRemoteMarkdown(cc *charm.Client, md *markdown) tea.Cmd { note: md.Note, } } - newMD.localID = md.localID + newMD.stashID = md.stashID return fetchedMarkdownMsg(newMD) } } @@ -1302,7 +1331,7 @@ func deleteStashedItem(cc *charm.Client, id int) tea.Cmd { func filterMarkdowns(m stashModel) tea.Cmd { return func() tea.Msg { - if m.filterInput.Value() == "" || !m.isFiltering() { + if m.filterInput.Value() == "" || !m.filterApplied() { return filteredMarkdownMsg(m.getFilterableMarkdowns()) // return everything } @@ -1356,7 +1385,7 @@ func deleteMarkdown(markdowns []*markdown, target *markdown) ([]*markdown, error index := -1 for i, v := range markdowns { - if v.localID == target.localID { + if v.uniqueID == target.uniqueID { index = i break } diff --git a/ui/ui.go b/ui/ui.go index bd13537..9a0dc96 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -249,7 +249,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case stateShowStash: // Q quits if we're filtering, but we still send esc though. - if m.stash.isFiltering() { + if m.stash.filterApplied() { if msg.String() == "q" { return m, tea.Quit } @@ -395,7 +395,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case foundLocalFileMsg: newMd := localFileToMarkdown(m.common.cwd, gitcha.SearchResult(msg)) m.stash.addMarkdowns(newMd) - if m.stash.isFiltering() { + if m.stash.filterApplied() { newMd.buildFilterValue() } if m.stash.shouldUpdateFilter() { @@ -407,17 +407,17 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Common handling that should happen regardless of application state md := markdown(msg) m.stash.addMarkdowns(&md) - m.common.filesStashed[msg.localID] = struct{}{} - delete(m.common.filesStashing, md.localID) + m.common.filesStashed[msg.stashID] = struct{}{} + delete(m.common.filesStashing, md.stashID) - if m.stash.isFiltering() { + if m.stash.filterApplied() { cmds = append(cmds, filterMarkdowns(m.stash)) } case stashFailMsg: // Common handling that should happen regardless of application state - delete(m.common.filesStashed, msg.markdown.localID) - delete(m.common.filesStashing, msg.markdown.localID) + delete(m.common.filesStashed, msg.markdown.stashID) + delete(m.common.filesStashing, msg.markdown.stashID) case filteredMarkdownMsg: if m.state == stateShowDocument { From 12f32092385fee362635bbdefc58d276490155f1 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 15 Dec 2020 15:57:27 -0500 Subject: [PATCH 643/911] When stashing in a filter, turn local docs to stashed ones --- ui/stash.go | 76 +++++++++++++++++++++++++++++++++++++++++++++-------- ui/ui.go | 37 +++++++++++++++++++------- 2 files changed, 92 insertions(+), 21 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 5d100ff..3c66bb4 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -383,8 +383,16 @@ func (m stashModel) getVisibleMarkdowns() []*markdown { } // Return the markdowns eligible to be filtered. -func (m stashModel) getFilterableMarkdowns() []*markdown { - return m.getMarkdownByType(LocalDoc, ConvertedDoc, StashedDoc) +func (m stashModel) getFilterableMarkdowns() (agg []*markdown) { + mds := m.getMarkdownByType(LocalDoc, ConvertedDoc, StashedDoc) + + // Copy values + for _, v := range mds { + p := *v + agg = append(agg, &p) + } + + return } // Command for opening a markdown document in the pager. Note that this also @@ -794,16 +802,19 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { md := m.selectedMarkdown() + // Is this a document we're allowed to stash? if !stashableDocTypes.Contains(md.markdownType) { break } + // Was this document already stashed? if _, alreadyStashed := m.common.filesStashed[md.stashID]; alreadyStashed { cmds = append(cmds, m.newStatusMessage(alreadyStashedStatusMessage)) break } - if !stashableDocTypes.Contains(md.markdownType) || md.stashID.IsNil() { + // Is the document missing a stash ID? + if md.stashID.IsNil() { if debug && md.stashID.IsNil() { log.Printf("refusing to stash markdown; local ID path is nil: %#v", md) } @@ -815,6 +826,16 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { m.common.filesStashing[md.stashID] = struct{}{} cmds = append(cmds, stashDocument(m.common.cc, *md)) + // If we're stashing a filtered item, optimistically convert the + // filtered item into a stashed item. + if m.filterApplied() { + for _, v := range m.filteredMarkdowns { + if v.uniqueID == md.uniqueID { + convertMarkdownToStashed(v) + } + } + } + if m.loadingDone() && !m.spinner.Visible() { m.spinner.Start() cmds = append(cmds, spinner.Tick) @@ -892,8 +913,9 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { } smd := m.selectedMarkdown() + for i, md := range m.markdowns { - if md != smd { + if md.uniqueID != smd.uniqueID { continue } @@ -902,12 +924,26 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { // Delete optimistically and remove the stashed item before // we've received a success response. - if m.filterApplied() { - mds, _ := deleteMarkdown(m.filteredMarkdowns, m.markdowns[i]) - m.filteredMarkdowns = mds + mds, err := deleteMarkdown(m.markdowns, m.markdowns[i]) + if err == nil { + m.markdowns = mds + } + + break + } + + // Also optimistically delete from filtered markdowns + if m.filterApplied() { + for i, md := range m.filteredMarkdowns { + if md.uniqueID != smd.uniqueID { + continue + } + mds, err := deleteMarkdown(m.filteredMarkdowns, m.filteredMarkdowns[i]) + if err == nil { + m.filteredMarkdowns = mds + } + break } - mds, _ := deleteMarkdown(m.markdowns, m.markdowns[i]) - m.markdowns = mds } m.selectionState = selectionIdle @@ -1008,6 +1044,20 @@ func (m *stashModel) handleNoteInput(msg tea.Msg) tea.Cmd { case "enter": // Set new note md := m.selectedMarkdown() + + // If the user is issuing a rename on a newly stashed item in a + // filtered listing, there's a small chance the user could try and + // set a note before the stash is complete. + if md.ID == 0 { + if debug { + log.Printf("user attempted to rename, but markdown ID is 0: %v", md) + } + return m.newStatusMessage(statusMessage{ + status: subtleStatusMessage, + message: "Too fast. Try again in a sec.", + }) + } + newNote := m.noteInput.Value() cmd := saveDocumentNote(m.common.cc, md.ID, newNote) md.Note = newNote @@ -1384,7 +1434,11 @@ func fetchMarkdown(cc *charm.Client, id int, t DocType) (*markdown, error) { func deleteMarkdown(markdowns []*markdown, target *markdown) ([]*markdown, error) { index := -1 - for i, v := range markdowns { + // Operate on a copy to avoid any pointer weirdness + mds := make([]*markdown, len(markdowns)) + copy(mds, markdowns) + + for i, v := range mds { if v.uniqueID == target.uniqueID { index = i break @@ -1399,5 +1453,5 @@ func deleteMarkdown(markdowns []*markdown, target *markdown) ([]*markdown, error return nil, err } - return append(markdowns[:index], markdowns[index+1:]...), nil + return append(mds[:index], mds[index+1:]...), nil } diff --git a/ui/ui.go b/ui/ui.go index 9a0dc96..38187e3 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -411,7 +411,20 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { delete(m.common.filesStashing, md.stashID) if m.stash.filterApplied() { - cmds = append(cmds, filterMarkdowns(m.stash)) + for _, v := range m.stash.filteredMarkdowns { + if v.stashID == msg.stashID && v.markdownType == ConvertedDoc { + // Add the server-side ID we got back so we can do things + // like rename and stash it. + v.ID = msg.ID + + // Keep the unique ID in sync so we can do things like + // delete. Note that the markdown received a new unique ID + // when it was added to the file listing in + // stash.addMarkdowns. + v.uniqueID = md.uniqueID + break + } + } } case stashFailMsg: @@ -673,11 +686,7 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { } } - // Set the note as the filename without the extension - if md.markdownType == LocalDoc { - p := md.localPath - md.Note = strings.Replace(path.Base(p), path.Ext(p), "", 1) - } + convertMarkdownToStashed(&md) newMd, err := cc.StashMarkdown(md.Note, md.Body) if err != nil { @@ -692,10 +701,6 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { // markdown. md.ID = newMd.ID - // Turn the markdown into a newly stashed (converted) markdown - md.markdownType = ConvertedDoc - md.CreatedAt = time.Now() - return stashSuccessMsg(md) } } @@ -725,6 +730,18 @@ func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { return md } +// convertMarkdownToStashed performs some adjustments on the given markdown to +// that occur as part of stashing. +func convertMarkdownToStashed(md *markdown) { + // Set the note as the filename without the extension + if md.markdownType == LocalDoc { + md.Note = strings.Replace(path.Base(md.localPath), path.Ext(md.localPath), "", 1) + } + + md.markdownType = ConvertedDoc + md.CreatedAt = time.Now() +} + func stripAbsolutePath(fullPath, cwd string) string { return strings.Replace(fullPath, cwd+string(os.PathSeparator), "", -1) } From 2a688fc71e24a32e0066e468c56d78f9e085fc5d Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 16 Dec 2020 15:12:48 -0500 Subject: [PATCH 644/911] In a filter, deleting docs stashed in-session converts them to local ones --- ui/markdown.go | 13 +++++++++---- ui/pager.go | 12 ++++++------ ui/stash.go | 49 ++++++++++++++++++++++++++++++++----------------- ui/stashhelp.go | 4 ++-- ui/stashitem.go | 4 ++-- ui/ui.go | 15 ++++++++------- 6 files changed, 59 insertions(+), 38 deletions(-) diff --git a/ui/markdown.go b/ui/markdown.go index 5d2a232..7bb3447 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -17,7 +17,7 @@ import ( // markdown wraps charm.Markdown. type markdown struct { - markdownType DocType + docType DocType // Stash identifier. This exists so we can keep track of documents stashed // in-session as they relate to their original, non-stashed counterparts. @@ -34,6 +34,11 @@ type markdown struct { // those that have been stashed in this session. localPath string + // Modified time of the local file. This will also be stored in + // Markdown.CreatedAt, however we also retain it here incase we need to + // convert this document back to a local document after it's been stashed. + localModTime time.Time + // Value we filter against. This exists so that we can maintain positions // of filtered items if notes are edited while a filter is active. This // field is ephemeral, and should only be referenced during filtering. @@ -65,7 +70,7 @@ func (m *markdown) buildFilterValue() { // shouldSortAsLocal returns whether or not this markdown should be sorted as though // it's a local markdown document. func (m markdown) shouldSortAsLocal() bool { - return m.markdownType == LocalDoc || m.markdownType == ConvertedDoc + return m.docType == LocalDoc || m.docType == ConvertedDoc } // Sort documents with local files first, then by date. @@ -120,8 +125,8 @@ func normalize(in string) (string, error) { func wrapMarkdowns(t DocType, md []*charm.Markdown) (m []*markdown) { for _, v := range md { m = append(m, &markdown{ - markdownType: t, - Markdown: *v, + docType: t, + Markdown: *v, }) } return m diff --git a/ui/pager.go b/ui/pager.go index 8494c23..876844f 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -212,8 +212,8 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { cmds = append(cmds, viewport.Sync(m.viewport)) } case "m": - isStashed := m.currentDocument.markdownType == StashedDoc || - m.currentDocument.markdownType == ConvertedDoc + isStashed := m.currentDocument.docType == StashedDoc || + m.currentDocument.docType == ConvertedDoc // Users can only set the note on user-stashed markdown if !isStashed { @@ -249,7 +249,7 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { } // Stash a local document - if m.state != pagerStateStashing && stashableDocTypes.Contains(md.markdownType) { + if m.state != pagerStateStashing && stashableDocTypes.Contains(md.docType) { m.state = pagerStateStashing m.spinner.Start() cmds = append( @@ -358,7 +358,7 @@ func (m pagerModel) statusBarView(b *strings.Builder) { percentToStringMagnitude float64 = 100.0 ) var ( - isStashed bool = m.currentDocument.markdownType == StashedDoc || m.currentDocument.markdownType == ConvertedDoc + isStashed bool = m.currentDocument.docType == StashedDoc || m.currentDocument.docType == ConvertedDoc showStatusMessage bool = m.state == pagerStateStatusMessage ) @@ -450,7 +450,7 @@ func (m pagerModel) setNoteView(b *strings.Builder) { func (m pagerModel) helpView() (s string) { memoOrStash := "m set memo" - if m.common.authStatus == authOK && m.currentDocument.markdownType == LocalDoc { + if m.common.authStatus == authOK && m.currentDocument.docType == LocalDoc { memoOrStash = "s stash this document" } @@ -463,7 +463,7 @@ func (m pagerModel) helpView() (s string) { "q quit", } - if m.currentDocument.markdownType == NewsDoc { + if m.currentDocument.docType == NewsDoc { deleteFromStringSlice(col1, 3) } diff --git a/ui/stash.go b/ui/stash.go index 3c66bb4..f353d57 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -346,7 +346,7 @@ func (m stashModel) countMarkdowns(t DocType) (found int) { } for i := 0; i < len(mds); i++ { - if mds[i].markdownType == t { + if mds[i].docType == t { found++ } } @@ -363,7 +363,7 @@ func (m stashModel) getMarkdownByType(types ...DocType) []*markdown { for _, t := range types { for _, md := range m.markdowns { - if md.markdownType == t { + if md.docType == t { agg = append(agg, md) } } @@ -401,7 +401,7 @@ func (m *stashModel) openMarkdown(md *markdown) tea.Cmd { var cmd tea.Cmd m.viewState = stashStateLoadingDocument - if md.markdownType == LocalDoc { + if md.docType == LocalDoc { cmd = loadLocalMarkdown(md) } else { cmd = loadRemoteMarkdown(m.common.cc, md) @@ -783,7 +783,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { } md := m.selectedMarkdown() - isUserMarkdown := md.markdownType == StashedDoc || md.markdownType == ConvertedDoc + isUserMarkdown := md.docType == StashedDoc || md.docType == ConvertedDoc isSettingNote := m.selectionState == selectionSettingNote isPromptingDelete := m.selectionState == selectionPromptingDelete @@ -803,7 +803,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { md := m.selectedMarkdown() // Is this a document we're allowed to stash? - if !stashableDocTypes.Contains(md.markdownType) { + if !stashableDocTypes.Contains(md.docType) { break } @@ -857,7 +857,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { break } - t := md.markdownType + t := md.docType if t == StashedDoc || t == ConvertedDoc { m.selectionState = selectionPromptingDelete } @@ -914,7 +914,7 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { smd := m.selectedMarkdown() - for i, md := range m.markdowns { + for _, md := range m.markdowns { if md.uniqueID != smd.uniqueID { continue } @@ -924,7 +924,7 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { // Delete optimistically and remove the stashed item before // we've received a success response. - mds, err := deleteMarkdown(m.markdowns, m.markdowns[i]) + mds, err := deleteMarkdown(m.markdowns, md) if err == nil { m.markdowns = mds } @@ -934,14 +934,29 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { // Also optimistically delete from filtered markdowns if m.filterApplied() { - for i, md := range m.filteredMarkdowns { + for _, md := range m.filteredMarkdowns { if md.uniqueID != smd.uniqueID { continue } - mds, err := deleteMarkdown(m.filteredMarkdowns, m.filteredMarkdowns[i]) - if err == nil { - m.filteredMarkdowns = mds + + switch md.docType { + + // If the document was stashed in this session, convert it + // back to "local" document + case ConvertedDoc: + md.docType = LocalDoc + md.Note = stripAbsolutePath(md.localPath, m.common.cwd) + md.CreatedAt = md.localModTime + + // Otherwise, remove the document from the listing + default: + mds, err := deleteMarkdown(m.filteredMarkdowns, md) + if err == nil { + m.filteredMarkdowns = mds + } + } + break } } @@ -1329,10 +1344,10 @@ func (m stashModel) populatedView() string { // loadRemoteMarkdown is a command for loading markdown from the server. func loadRemoteMarkdown(cc *charm.Client, md *markdown) tea.Cmd { return func() tea.Msg { - newMD, err := fetchMarkdown(cc, md.ID, md.markdownType) + newMD, err := fetchMarkdown(cc, md.ID, md.docType) if err != nil { if debug { - log.Printf("error loading %s markdown (ID %d, Note: '%s'): %v", md.markdownType, md.ID, md.Note, err) + log.Printf("error loading %s markdown (ID %d, Note: '%s'): %v", md.docType, md.ID, md.Note, err) } return markdownFetchFailedMsg{ err: err, @@ -1347,7 +1362,7 @@ func loadRemoteMarkdown(cc *charm.Client, md *markdown) tea.Cmd { func loadLocalMarkdown(md *markdown) tea.Cmd { return func() tea.Msg { - if md.markdownType != LocalDoc { + if md.docType != LocalDoc { return errMsg{errors.New("could not load local file: not a local file")} } if md.localPath == "" { @@ -1425,8 +1440,8 @@ func fetchMarkdown(cc *charm.Client, id int, t DocType) (*markdown, error) { } return &markdown{ - markdownType: t, - Markdown: *md, + docType: t, + Markdown: *md, }, nil } diff --git a/ui/stashhelp.go b/ui/stashhelp.go index 4a1bbc1..27a883a 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -120,8 +120,8 @@ func (m stashModel) helpView() (string, int) { if numDocs > 0 { md := m.selectedMarkdown() - isStashed = md != nil && md.markdownType == StashedDoc - isStashable = md != nil && md.markdownType == LocalDoc && m.online() + isStashed = md != nil && md.docType == StashedDoc + isStashable = md != nil && md.docType == LocalDoc && m.online() } if numDocs > 0 && m.showFullHelp { diff --git a/ui/stashitem.go b/ui/stashitem.go index 4b3d19e..a9d67d6 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -27,7 +27,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { icon = "" ) - switch md.markdownType { + switch md.docType { case NewsDoc: if title == "" { title = "News" @@ -81,7 +81,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { } else { // Regular (non-selected) items - if md.markdownType == NewsDoc { + if md.docType == NewsDoc { gutter = " " if isFiltering && m.filterInput.Value() == "" { diff --git a/ui/ui.go b/ui/ui.go index 38187e3..1bad6d3 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -412,7 +412,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if m.stash.filterApplied() { for _, v := range m.stash.filteredMarkdowns { - if v.stashID == msg.stashID && v.markdownType == ConvertedDoc { + if v.stashID == msg.stashID && v.docType == ConvertedDoc { // Add the server-side ID we got back so we can do things // like rename and stash it. v.ID = msg.ID @@ -658,7 +658,7 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { // be loaded. But...if it turnsout the document body really is empty // then we'll stash it anyway. if len(md.Body) == 0 { - switch md.markdownType { + switch md.docType { case LocalDoc: data, err := ioutil.ReadFile(md.localPath) @@ -671,14 +671,14 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { md.Body = string(data) case NewsDoc: - newMD, err := fetchMarkdown(cc, md.ID, md.markdownType) + newMD, err := fetchMarkdown(cc, md.ID, md.docType) if err != nil { return stashFailMsg{err, md} } md.Body = newMD.Body default: - err := fmt.Errorf("user is attempting to stash an unsupported markdown type: %s", md.markdownType) + err := fmt.Errorf("user is attempting to stash an unsupported markdown type: %s", md.docType) if debug { log.Println(err) } @@ -719,8 +719,9 @@ func waitForStatusMessageTimeout(appCtx applicationContext, t *time.Timer) tea.C // a directory, but we trust that gitcha has already done that. func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { md := &markdown{ - markdownType: LocalDoc, + docType: LocalDoc, localPath: res.Path, + localModTime: res.Info.ModTime(), Markdown: charm.Markdown{ Note: stripAbsolutePath(res.Path, cwd), CreatedAt: res.Info.ModTime(), @@ -734,11 +735,11 @@ func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { // that occur as part of stashing. func convertMarkdownToStashed(md *markdown) { // Set the note as the filename without the extension - if md.markdownType == LocalDoc { + if md.docType == LocalDoc { md.Note = strings.Replace(path.Base(md.localPath), path.Ext(md.localPath), "", 1) } - md.markdownType = ConvertedDoc + md.docType = ConvertedDoc md.CreatedAt = time.Now() } From 0c3df027ccc14acd249b906dbe6a75ae6ed2614f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 16 Dec 2020 16:02:38 -0500 Subject: [PATCH 645/911] Correct empty stashed state when filter is applied --- ui/stash.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index f353d57..c47233a 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -1272,10 +1272,6 @@ func (m stashModel) headerView() string { func (m stashModel) populatedView() string { mds := m.getVisibleMarkdowns() - if len(mds) == 0 && m.filterApplied() { - return "" - } - var b strings.Builder // Empty states @@ -1307,6 +1303,8 @@ func (m stashModel) populatedView() string { } else { f("Loading your stash...") } + case filterSection: + return "" } } From 3c740796698cfac245b0d5f342c9a1297894b9d5 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 16 Dec 2020 17:49:48 -0500 Subject: [PATCH 646/911] In a filter, deleting stashed news removes those items from the filter --- ui/doctypes.go | 4 +++- ui/markdown.go | 43 ++++++++++++++++++++++++++++++++++++++----- ui/stash.go | 16 ++++++++++------ ui/ui.go | 20 +++----------------- 4 files changed, 54 insertions(+), 29 deletions(-) diff --git a/ui/doctypes.go b/ui/doctypes.go index 0b17d58..8d2ef14 100644 --- a/ui/doctypes.go +++ b/ui/doctypes.go @@ -5,7 +5,8 @@ type DocType int // Available document types. const ( - LocalDoc DocType = iota + NoDocType DocType = iota + LocalDoc StashedDoc ConvertedDoc NewsDoc @@ -13,6 +14,7 @@ const ( func (d DocType) String() string { return [...]string{ + "none", "local", "stashed", "converted", diff --git a/ui/markdown.go b/ui/markdown.go index 7bb3447..f6f8f2c 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -3,6 +3,7 @@ package ui import ( "log" "math" + "path" "strings" "time" "unicode" @@ -30,15 +31,16 @@ type markdown struct { // which could match both an original or stashed document). uniqueID ksuid.KSUID + // Some of the document's original values before this document was stashed. + // These are irrelevant if this document was not stashed in this session. + originalDocType DocType + originalTimestamp time.Time + originalNote string + // Full path of a local markdown file. Only relevant to local documents and // those that have been stashed in this session. localPath string - // Modified time of the local file. This will also be stored in - // Markdown.CreatedAt, however we also retain it here incase we need to - // convert this document back to a local document after it's been stashed. - localModTime time.Time - // Value we filter against. This exists so that we can maintain positions // of filtered items if notes are edited while a filter is active. This // field is ephemeral, and should only be referenced during filtering. @@ -54,6 +56,37 @@ func (m *markdown) generateIDs() { m.uniqueID = ksuid.New() } +// convertToStashed converts this document into its stashed state. +func (m *markdown) convertToStashed() { + if m.docType == ConvertedDoc { + if debug { + log.Println("not converting already converted document:", m) + } + return + } + + m.originalDocType = m.docType + m.originalTimestamp = m.CreatedAt + m.originalNote = m.Note + + if m.docType == LocalDoc { + m.Note = strings.Replace(path.Base(m.localPath), path.Ext(m.localPath), "", 1) + } + m.CreatedAt = time.Now() + m.docType = ConvertedDoc +} + +// revert reverts this document from its stashed state. +func (m *markdown) revertFromStashed() { + if m.docType != ConvertedDoc { + log.Printf("not reverting document of type %s: %v", m.docType, m) + } + + m.docType = m.originalDocType + m.CreatedAt = m.originalTimestamp + m.Note = m.originalNote +} + // Generate the value we're doing to filter against. func (m *markdown) buildFilterValue() { note, err := normalize(m.Note) diff --git a/ui/stash.go b/ui/stash.go index c47233a..7762faa 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -831,7 +831,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { if m.filterApplied() { for _, v := range m.filteredMarkdowns { if v.uniqueID == md.uniqueID { - convertMarkdownToStashed(v) + v.convertToStashed() } } } @@ -941,12 +941,16 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { switch md.docType { - // If the document was stashed in this session, convert it - // back to "local" document case ConvertedDoc: - md.docType = LocalDoc - md.Note = stripAbsolutePath(md.localPath, m.common.cwd) - md.CreatedAt = md.localModTime + // If the document was stashed in this session, convert it + // back to it's original document type + if md.originalDocType == LocalDoc { + md.revertFromStashed() + break + } + + // Other documents fall through and delete as normal + fallthrough // Otherwise, remove the document from the listing default: diff --git a/ui/ui.go b/ui/ui.go index 1bad6d3..522de57 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -6,7 +6,6 @@ import ( "io/ioutil" "log" "os" - "path" "strings" "time" @@ -686,7 +685,7 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { } } - convertMarkdownToStashed(&md) + md.convertToStashed() newMd, err := cc.StashMarkdown(md.Note, md.Body) if err != nil { @@ -719,9 +718,8 @@ func waitForStatusMessageTimeout(appCtx applicationContext, t *time.Timer) tea.C // a directory, but we trust that gitcha has already done that. func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { md := &markdown{ - docType: LocalDoc, - localPath: res.Path, - localModTime: res.Info.ModTime(), + docType: LocalDoc, + localPath: res.Path, Markdown: charm.Markdown{ Note: stripAbsolutePath(res.Path, cwd), CreatedAt: res.Info.ModTime(), @@ -731,18 +729,6 @@ func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { return md } -// convertMarkdownToStashed performs some adjustments on the given markdown to -// that occur as part of stashing. -func convertMarkdownToStashed(md *markdown) { - // Set the note as the filename without the extension - if md.docType == LocalDoc { - md.Note = strings.Replace(path.Base(md.localPath), path.Ext(md.localPath), "", 1) - } - - md.docType = ConvertedDoc - md.CreatedAt = time.Now() -} - func stripAbsolutePath(fullPath, cwd string) string { return strings.Replace(fullPath, cwd+string(os.PathSeparator), "", -1) } From 58df854466cf809a53bdd72bad416104a2383a89 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 16 Dec 2020 17:55:57 -0500 Subject: [PATCH 647/911] When clearing the filter forget which markdowns were stashed in-session --- ui/stash.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 7762faa..8737bf7 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -249,11 +249,27 @@ func (m *stashModel) setSize(width, height int) { m.updatePagination() } +// bakeConvertedDocs turns converted documents into stashed ones. Essentially, +// we're discarding the fact that they were ever converted so we can stop +// treating them like converted documents. +func (m *stashModel) bakeConvertedDocs() { + for _, md := range m.markdowns { + if md.docType == ConvertedDoc { + md.docType = StashedDoc + } + } +} + func (m *stashModel) resetFiltering() { m.filterState = unfiltered m.filterInput.Reset() - sort.Stable(markdownsByLocalFirst(m.markdowns)) m.filteredMarkdowns = nil + + // Turn converted markdowns into stashed ones so that the next time we + // filter we get both local and stashed results. + m.bakeConvertedDocs() + + sort.Stable(markdownsByLocalFirst(m.markdowns)) m.updatePagination() if m.sections[len(m.sections)-1].key == filterSection { @@ -759,6 +775,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Filter your notes case "/": m.hideStatusMessage() + m.bakeConvertedDocs() // Build values we'll filter against for _, md := range m.markdowns { From 70a155ee302fadf13dffacae502957dfe0359c79 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 16 Dec 2020 20:04:55 -0500 Subject: [PATCH 648/911] Only underline matched chars in filter section when a filter is applied --- ui/stashitem.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stashitem.go b/ui/stashitem.go index a9d67d6..65a44f3 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -70,7 +70,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { default: gutter = dullFuchsiaFg(verticalLine) icon = dullFuchsiaFg(icon) - if m.filterState == filterApplied || singleFilteredItem { + if m.currentSection().key == filterSection && m.filterState == filterApplied || singleFilteredItem { s := termenv.Style{}.Foreground(lib.Fuschia.Color()) title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) } else { From a0fb0e4cd0f59324a595fcdf9a676dfc54b11e53 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 17 Dec 2020 10:28:51 -0500 Subject: [PATCH 649/911] Fix a case where file listings could jitter --- ui/stash.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 8737bf7..90f2663 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -385,7 +385,7 @@ func (m stashModel) getMarkdownByType(types ...DocType) []*markdown { } } - sort.Sort(markdownsByLocalFirst(agg)) + sort.Stable(markdownsByLocalFirst(agg)) return agg } From 8f3c5df236b803c85a2eb14bd6d0245aa3872d2d Mon Sep 17 00:00:00 2001 From: Nicolas Martin Date: Thu, 17 Dec 2020 21:45:08 +0100 Subject: [PATCH 650/911] Highlight the most recent stash item in green in the stash view ...as long as the statusMessage is `Stashed!` is present --- ui/stashitem.go | 30 ++++++++++++++++++++++-------- ui/ui.go | 4 ++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/ui/stashitem.go b/ui/stashitem.go index 65a44f3..414f439 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -68,20 +68,34 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { title = m.noteInput.View() date = dullYellowFg(date) default: - gutter = dullFuchsiaFg(verticalLine) - icon = dullFuchsiaFg(icon) - if m.currentSection().key == filterSection && m.filterState == filterApplied || singleFilteredItem { - s := termenv.Style{}.Foreground(lib.Fuschia.Color()) - title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) + if m.common.latestFileStashed == md.stashID && + m.statusMessage == stashedStatusMessage { + gutter = greenFg(verticalLine) + icon = dimGreenFg(icon) + title = greenFg(title) + date = dimGreenFg(date) } else { - title = fuchsiaFg(title) + gutter = dullFuchsiaFg(verticalLine) + icon = dullFuchsiaFg(icon) + if m.currentSection().key == filterSection && m.filterState == filterApplied || singleFilteredItem { + s := termenv.Style{}.Foreground(lib.Fuschia.Color()) + title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) + } else { + title = fuchsiaFg(title) + } + date = dullFuchsiaFg(date) } - date = dullFuchsiaFg(date) } } else { // Regular (non-selected) items - if md.docType == NewsDoc { + if m.common.latestFileStashed == md.stashID && + m.statusMessage == stashedStatusMessage { + gutter = " " + icon = dimGreenFg(icon) + title = greenFg(title) + date = dimGreenFg(date) + } else if md.docType == NewsDoc { gutter = " " if isFiltering && m.filterInput.Value() == "" { diff --git a/ui/ui.go b/ui/ui.go index 522de57..4f21aea 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -137,6 +137,9 @@ type commonModel struct { // ignoring the value portion with an empty struct. filesStashed map[ksuid.KSUID]struct{} + // ID of the most recently stashed markdown + latestFileStashed ksuid.KSUID + // Files currently being stashed. We remove files from this set once // a stash operation has either succeeded or failed. filesStashing map[ksuid.KSUID]struct{} @@ -407,6 +410,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { md := markdown(msg) m.stash.addMarkdowns(&md) m.common.filesStashed[msg.stashID] = struct{}{} + m.common.latestFileStashed = msg.stashID delete(m.common.filesStashing, md.stashID) if m.stash.filterApplied() { From 379dc74d0e2a91277734b0c4d99c00940248060e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 17 Dec 2020 18:01:41 -0500 Subject: [PATCH 651/911] Secret keystroke: navigate tabs with shift+h, shift+l --- ui/stash.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 90f2663..62f85a3 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -738,7 +738,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { } // Next section - case "tab": + case "tab", "L": if len(m.sections) == 0 || m.filterState == filtering { break } @@ -749,7 +749,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { m.updatePagination() // Previous section - case "shift+tab": + case "shift+tab", "H": if len(m.sections) == 0 || m.filterState == filtering { break } From dd936ac1cd699b4bfda1dc95b429baeb3ba51085 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 17 Dec 2020 18:31:08 -0500 Subject: [PATCH 652/911] Adjust "secondary" green color in stash highlight + help --- ui/stashhelp.go | 4 ++-- ui/stashitem.go | 20 ++++++++------------ ui/styles.go | 5 +++-- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/ui/stashhelp.go b/ui/stashhelp.go index 27a883a..4dbe530 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -46,7 +46,7 @@ func (h helpColumn) render(height int) (rows []string) { switch k { case "s": k = greenFg(k) - v = dimGreenFg(v) + v = semiDimGreenFg(v) default: k = grayFg(k) v = midGrayFg(v) @@ -216,7 +216,7 @@ func (m stashModel) miniHelpView(entries ...string) string { switch k { case "s": k = greenFg(k) - v = dimGreenFg(v) + v = semiDimGreenFg(v) default: k = grayFg(k) v = midGrayFg(v) diff --git a/ui/stashitem.go b/ui/stashitem.go index 414f439..7c5005e 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -46,13 +46,11 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { isSelected := index == m.cursor() isFiltering := m.filterState == filtering + singleFilteredItem := isFiltering && len(m.getVisibleMarkdowns()) == 1 - // If there are multiple items being filtered we don't highlight a selected + // If there are multiple items being filtered don't highlight a selected // item in the results. If we've filtered down to one item, however, // highlight that first item since pressing return will open it. - singleFilteredItem := - isFiltering && len(m.getVisibleMarkdowns()) == 1 - if isSelected && !isFiltering || singleFilteredItem { // Selected item @@ -73,11 +71,12 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { gutter = greenFg(verticalLine) icon = dimGreenFg(icon) title = greenFg(title) - date = dimGreenFg(date) + date = semiDimGreenFg(date) } else { gutter = dullFuchsiaFg(verticalLine) icon = dullFuchsiaFg(icon) - if m.currentSection().key == filterSection && m.filterState == filterApplied || singleFilteredItem { + if m.currentSection().key == filterSection && + m.filterState == filterApplied || singleFilteredItem { s := termenv.Style{}.Foreground(lib.Fuschia.Color()) title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) } else { @@ -89,15 +88,14 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { } else { // Regular (non-selected) items + gutter = " " + if m.common.latestFileStashed == md.stashID && m.statusMessage == stashedStatusMessage { - gutter = " " icon = dimGreenFg(icon) title = greenFg(title) - date = dimGreenFg(date) + date = semiDimGreenFg(date) } else if md.docType == NewsDoc { - gutter = " " - if isFiltering && m.filterInput.Value() == "" { title = dimIndigoFg(title) date = dimSubtleIndigoFg(date) @@ -113,7 +111,6 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { } else { title = dimNormalFg(title) } - gutter = " " date = dimBrightGrayFg(date) } else { icon = greenFg(icon) @@ -123,7 +120,6 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { s := termenv.Style{}.Foreground(lib.NewColorPair("#dddddd", "#1a1a1a").Color()) title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) } - gutter = " " date = brightGrayFg(date) } } diff --git a/ui/styles.go b/ui/styles.go index 6afc101..cd90d61 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -22,8 +22,9 @@ var ( midGrayFg = newFgStyle(lib.NewColorPair("#4A4A4A", "#B2B2B2")) darkGrayFg = newFgStyle(lib.NewColorPair("#3C3C3C", "#DDDADA")) - greenFg = newFgStyle(lib.NewColorPair("#04B575", "#04B575")) - dimGreenFg = newFgStyle(lib.NewColorPair("#0B5137", "#72D2B0")) + greenFg = newFgStyle(lib.NewColorPair("#04B575", "#04B575")) + semiDimGreenFg = newFgStyle(lib.NewColorPair("#036B46", "#35D79C")) + dimGreenFg = newFgStyle(lib.NewColorPair("#0B5137", "#72D2B0")) fuchsiaFg = newFgStyle(lib.Fuschia) dimFuchsiaFg = newFgStyle(lib.NewColorPair("#99519E", "#F1A8FF")) From f2c3ef12eae584155a8f955ebb3bc3f3085429cd Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 18 Dec 2020 14:28:21 -0500 Subject: [PATCH 653/911] Show stash feedback optimistically --- ui/stash.go | 54 ++++++++++++++++++++++++----------------------------- ui/ui.go | 1 - 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 62f85a3..7b87da7 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -152,20 +152,19 @@ func (s statusMessage) String() string { } type stashModel struct { - common *commonModel - err error - spinner spinner.Model - noteInput textinput.Model - filterInput textinput.Model - stashFullyLoaded bool // have we loaded all available stashed documents from the server? - viewState stashViewState - filterState filterState - selectionState selectionState - showFullHelp bool - showStatusMessage bool - statusMessage statusMessage - statusMessageTimer *time.Timer - stashStatusMessageQueued bool + common *commonModel + err error + spinner spinner.Model + noteInput textinput.Model + filterInput textinput.Model + stashFullyLoaded bool // have we loaded all available stashed documents from the server? + viewState stashViewState + filterState filterState + selectionState selectionState + showFullHelp bool + showStatusMessage bool + statusMessage statusMessage + statusMessageTimer *time.Timer // Available document sections we can cycle through. We use a slice, rather // than a map, because order is important. @@ -633,13 +632,6 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { newSpinnerModel, cmd := m.spinner.Update(msg) m.spinner = newSpinnerModel cmds = append(cmds, cmd) - } else if !stashing && !spinnerVisible && m.stashStatusMessageQueued { - m.stashStatusMessageQueued = false - cmds = append(cmds, m.newStatusMessage(stashedStatusMessage)) - } - - if spinnerVisible && m.showStatusMessage { - m.hideStatusMessage() } // A note was set on a document. This may have happened in the pager so @@ -655,13 +647,6 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { // update function. case stashSuccessMsg: m.spinner.Finish() - if m.spinner.Visible() { - // We want to show the 'stashed!' status message, but need to wait - // until the spinner goes away first. - m.stashStatusMessageQueued = true - } else { - cmds = append(cmds, m.newStatusMessage(stashedStatusMessage)) - } // Note: mechanical stuff related to stash failure is handled in the parent // update function. @@ -838,10 +823,15 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { break } - // Checks passed; perform the stash + // Checks passed; perform the stash. Note that we optimistically + // show the status message. m.common.filesStashed[md.stashID] = struct{}{} m.common.filesStashing[md.stashID] = struct{}{} - cmds = append(cmds, stashDocument(m.common.cc, *md)) + m.common.latestFileStashed = md.stashID + cmds = append(cmds, + stashDocument(m.common.cc, *md), + m.newStatusMessage(stashedStatusMessage), + ) // If we're stashing a filtered item, optimistically convert the // filtered item into a stashed item. @@ -853,6 +843,10 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { } } + // The spinner subtly shows the stash state in a non-optimistic + // fashion, namely because it was originally implemented this way. + // If this stash succeeds quickly enough, the spinner won't run + // at all. if m.loadingDone() && !m.spinner.Visible() { m.spinner.Start() cmds = append(cmds, spinner.Tick) diff --git a/ui/ui.go b/ui/ui.go index 4f21aea..e281fa5 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -410,7 +410,6 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { md := markdown(msg) m.stash.addMarkdowns(&md) m.common.filesStashed[msg.stashID] = struct{}{} - m.common.latestFileStashed = msg.stashID delete(m.common.filesStashing, md.stashID) if m.stash.filterApplied() { From 025dcee3da8e4a2e5cf46bf2acb5eca4fa591940 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 18 Dec 2020 15:59:49 -0500 Subject: [PATCH 654/911] Fix case where stashDocument could erroneously return a command in a command --- ui/ui.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index e281fa5..3f1417b 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -647,13 +647,11 @@ func saveDocumentNote(cc *charm.Client, id int, note string) tea.Cmd { func stashDocument(cc *charm.Client, md markdown) tea.Cmd { return func() tea.Msg { if cc == nil { - return func() tea.Msg { - err := errors.New("can't stash; no charm client") - if debug { - log.Println("error stashing document:", err) - } - return stashFailMsg{err, md} + err := errors.New("can't stash; no charm client") + if debug { + log.Println("error stashing document:", err) } + return stashFailMsg{err, md} } // Is the document missing a body? If so, it likely means it needs to From 35f1ed21c3ba5ddb06dde911fab6d4ff3f85f048 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 18 Dec 2020 16:25:44 -0500 Subject: [PATCH 655/911] More logging around markdown stash failures --- ui/ui.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 3f1417b..e167a2c 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -655,7 +655,7 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { } // Is the document missing a body? If so, it likely means it needs to - // be loaded. But...if it turnsout the document body really is empty + // be loaded. But...if it turns out the document body really is empty // then we'll stash it anyway. if len(md.Body) == 0 { switch md.docType { @@ -673,6 +673,9 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { case NewsDoc: newMD, err := fetchMarkdown(cc, md.ID, md.docType) if err != nil { + if debug { + log.Println(err) + } return stashFailMsg{err, md} } md.Body = newMD.Body @@ -686,8 +689,6 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { } } - md.convertToStashed() - newMd, err := cc.StashMarkdown(md.Note, md.Body) if err != nil { if debug { @@ -696,6 +697,8 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { return stashFailMsg{err, md} } + md.convertToStashed() + // The server sends the whole stashed document back, but we really just // need to know the ID so we can operate on this newly stashed // markdown. From 6be1af410323807f44ac0c774edd3933e9b2ea48 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 18 Dec 2020 16:26:03 -0500 Subject: [PATCH 656/911] Add more context to stash fail status messages + make them red --- ui/stash.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 7b87da7..eab362b 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -132,6 +132,7 @@ type statusMessageType int const ( normalStatusMessage statusMessageType = iota subtleStatusMessage + errorStatusMessage ) // statusMessage is an ephemeral note displayed in the UI. @@ -146,6 +147,8 @@ func (s statusMessage) String() string { switch s.status { case subtleStatusMessage: return dimGreenFg(s.message) + case errorStatusMessage: + return redFg(s.message) default: return greenFg(s.message) } @@ -652,8 +655,8 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { // update function. case stashFailMsg: cmds = append(cmds, m.newStatusMessage(statusMessage{ - status: normalStatusMessage, - message: "Couldn’t stash :(", + status: errorStatusMessage, + message: fmt.Sprintf("Couldn’t stash ‘%s’", msg.markdown.Note), })) case statusMessageTimeoutMsg: @@ -1151,7 +1154,7 @@ func (m stashModel) view() string { logoOrFilter += " " + m.statusMessage.String() } } - logoOrFilter = truncate.StringWithTail(logoOrFilter, uint(m.common.width), ellipsis) + logoOrFilter = truncate.StringWithTail(logoOrFilter, uint(m.common.width-1), ellipsis) help, helpHeight := m.helpView() From fd2a6ecbdfa3c093980e5da66217355c754e14cd Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 18 Dec 2020 17:07:48 -0500 Subject: [PATCH 657/911] Show stash error details in the error message view --- ui/stash.go | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/stash.go b/ui/stash.go index eab362b..2accdca 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -654,6 +654,7 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { // Note: mechanical stuff related to stash failure is handled in the parent // update function. case stashFailMsg: + m.err = msg.err cmds = append(cmds, m.newStatusMessage(statusMessage{ status: errorStatusMessage, message: fmt.Sprintf("Couldn’t stash ‘%s’", msg.markdown.Note), From 2e6f5c336c4fe448b42e52c707e5a933d9ef8271 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 24 Dec 2020 15:45:42 -0500 Subject: [PATCH 658/911] Update demo GIF in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9826bc5..778f2de 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Render markdown on the CLI, with _pizzazz_!

- Glow UI Demo + Glow UI Demo

## What is it? From 0a8304948834682d64df7c138f5bfb1e65af5fb6 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 24 Dec 2020 17:06:48 -0500 Subject: [PATCH 659/911] Other README updates for better dark mode compatibility --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 778f2de..582a83e 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Render markdown on the CLI, with _pizzazz_!

- Glow Logo + Glow Logo Latest Release GoDoc Build Status @@ -209,7 +209,7 @@ machine and not our server, so we never see any unencrypted data. Part of [Charm](https://charm.sh). -the Charm logo +The Charm logo Charm热爱开源! / Charm loves open source! From 3d15953707324361ff10c7901a149f27fb449349 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 Jan 2021 14:50:59 -0500 Subject: [PATCH 660/911] Update outdated comment --- ui/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/config.go b/ui/config.go index 8fafec5..e96e34a 100644 --- a/ui/config.go +++ b/ui/config.go @@ -8,7 +8,7 @@ type Config struct { GlamourMaxWidth uint GlamourStyle string - // Which document types shall we show? We work though this with bitmasking. + // Which document types shall we show? DocumentTypes DocTypeSet // For debugging the UI From 8d0ebb7249ee1eac48bc9710790f52692acbaa25 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 Jan 2021 15:58:58 -0500 Subject: [PATCH 661/911] If the only arguement is a directory open a TUI at that path (see #234) --- main.go | 41 ++++++++++++++++++++++++++++------------- stash_cmd.go | 2 +- ui/config.go | 3 +++ ui/ui.go | 22 +++++++++++++++++++++- 4 files changed, 53 insertions(+), 15 deletions(-) diff --git a/main.go b/main.go index aaf5df2..2b8fc3f 100644 --- a/main.go +++ b/main.go @@ -39,7 +39,7 @@ var ( mouse bool rootCmd = &cobra.Command{ - Use: "glow SOURCE", + Use: "glow [SOURCE|DIR]", Short: "Render markdown on the CLI, with pizzazz!", Long: formatBlock(fmt.Sprintf("\nRender markdown on the CLI, %s!", common.Keyword("with pizzazz"))), SilenceErrors: false, @@ -182,24 +182,38 @@ func execute(cmd *cobra.Command, args []string) error { return err } - if len(args) == 0 { - return executeArg(cmd, "", os.Stdout) - } + switch len(args) { - for _, arg := range args { - if err := executeArg(cmd, arg, os.Stdout); err != nil { - return err + // TUI running on cwd + case 0: + return runTUI("", false) + + // TUI with possible dir argument + case 1: + // Validate that the argument is a directory. If it's not treat it as + // an argument to the non-TUI version of Glow (via fallthrough). + info, err := os.Stat(args[0]) + if err == nil && info.IsDir() { + p, err := filepath.Abs(args[0]) + if err == nil { + return runTUI(p, false) + } + } + fallthrough + + // CLI + default: + for _, arg := range args { + if err := executeArg(cmd, arg, os.Stdout); err != nil { + return err + } } } + return nil } func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { - // Only run TUI if there are no arguments (excluding flags) - if arg == "" { - return runTUI(false) - } - // create an io.Reader from the markdown source in cli-args src, err := sourceFromArg(arg) if err != nil { @@ -273,7 +287,7 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { return nil } -func runTUI(stashedOnly bool) error { +func runTUI(workingDirectory string, stashedOnly bool) error { // Read environment to get debugging stuff var cfg ui.Config if err := babyenv.Parse(&cfg); err != nil { @@ -289,6 +303,7 @@ func runTUI(stashedOnly bool) error { defer f.Close() } + cfg.WorkingDirectory = workingDirectory cfg.DocumentTypes = ui.NewDocTypeSet() cfg.ShowAllFiles = showAllFiles cfg.GlamourMaxWidth = width diff --git a/stash_cmd.go b/stash_cmd.go index e1d69a7..e6b3ea4 100644 --- a/stash_cmd.go +++ b/stash_cmd.go @@ -27,7 +27,7 @@ var ( RunE: func(cmd *cobra.Command, args []string) error { initConfig() if len(args) == 0 { - return runTUI(true) + return runTUI("", true) } filePath := args[0] diff --git a/ui/config.go b/ui/config.go index e96e34a..67d94d6 100644 --- a/ui/config.go +++ b/ui/config.go @@ -8,6 +8,9 @@ type Config struct { GlamourMaxWidth uint GlamourStyle string + // Which directory should we start from? + WorkingDirectory string + // Which document types shall we show? DocumentTypes DocTypeSet diff --git a/ui/ui.go b/ui/ui.go index e167a2c..2fb335d 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -6,6 +6,7 @@ import ( "io/ioutil" "log" "os" + "path/filepath" "strings" "time" @@ -493,7 +494,22 @@ func errorView(err error, fatal bool) string { func findLocalFiles(m model) tea.Cmd { return func() tea.Msg { - cwd, err := os.Getwd() + var ( + cwd = m.common.cfg.WorkingDirectory + err error + ) + + if cwd == "" { + cwd, err = os.Getwd() + } else { + var info os.FileInfo + info, err = os.Stat(cwd) + if err == nil && info.IsDir() { + cwd, err = filepath.Abs(cwd) + } + } + + // Note that this is one error check for both cases above if err != nil { if debug { log.Println("error finding local files:", err) @@ -501,6 +517,10 @@ func findLocalFiles(m model) tea.Cmd { return errMsg{err} } + if debug { + log.Println("local directory is:", cwd) + } + var ignore []string if !m.common.cfg.ShowAllFiles { ignore = ignorePatterns(m) From e1d81624286c9dfd63164b090b79e2690955db9f Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 Jan 2021 13:37:36 -0500 Subject: [PATCH 662/911] Add missing newline in pager --- ui/pager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index 876844f..7f43019 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -345,7 +345,7 @@ func (m pagerModel) View() string { } if m.showHelp { - fmt.Fprint(&b, m.helpView()) + fmt.Fprint(&b, "\n"+m.helpView()) } return b.String() From 542133c42b93bf4a9c9a3048c7749b90fef6a11e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 15 Jan 2021 13:38:47 -0500 Subject: [PATCH 663/911] Bump Bubble Tea and Bubbles dependencies --- go.mod | 13 +++++++------ go.sum | 25 +++++++++++++++++++++---- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 82a3be2..1986328 100644 --- a/go.mod +++ b/go.mod @@ -4,27 +4,28 @@ go 1.13 require ( github.com/alecthomas/chroma v0.8.0 // indirect - github.com/charmbracelet/bubbles v0.7.6-0.20201212003737-11f56f9b6b3f - github.com/charmbracelet/bubbletea v0.12.2 + github.com/charmbracelet/bubbles v0.7.6 + github.com/charmbracelet/bubbletea v0.12.4 github.com/charmbracelet/charm v0.8.2 github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/google/uuid v1.1.2 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/mattn/go-runewidth v0.0.9 + github.com/mattn/go-runewidth v0.0.10 github.com/meowgorithm/babyenv v1.3.0 github.com/microcosm-cc/bluemonday v1.0.4 // indirect github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6 github.com/muesli/go-app-paths v0.2.1 - github.com/muesli/reflow v0.2.1-0.20201126184510-3bcb929042f2 + github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68 github.com/muesli/termenv v0.7.4 github.com/sahilm/fuzzy v0.1.0 github.com/segmentio/ksuid v1.0.3 github.com/spf13/cobra v1.1.1 github.com/spf13/viper v1.7.0 - golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 + golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect - golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a + golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 + golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect golang.org/x/text v0.3.2 ) diff --git a/go.sum b/go.sum index cf2fc0e..bb967bd 100644 --- a/go.sum +++ b/go.sum @@ -43,12 +43,14 @@ github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8 github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/charmbracelet/bubbles v0.6.0/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= -github.com/charmbracelet/bubbles v0.7.6-0.20201212003737-11f56f9b6b3f h1:6g/MQxdygWh8Ga0c5uR1Z8uz5wa3uaQjW0Hive/XBWw= -github.com/charmbracelet/bubbles v0.7.6-0.20201212003737-11f56f9b6b3f/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZSG46SFauoZj22s= +github.com/charmbracelet/bubbles v0.7.6 h1:SCAp4ZEUf2tBNEsufo+Xxxu2dvbFhYSDPrX45toQZrM= +github.com/charmbracelet/bubbles v0.7.6/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZSG46SFauoZj22s= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= github.com/charmbracelet/bubbletea v0.10.5/go.mod h1:Nay5oWkkSZvc6E/be+W3nDFXAsVytNUNKV9jbXcuae0= github.com/charmbracelet/bubbletea v0.12.2 h1:y9Yo2Pv8tcm3mAJsWONGsmHhzrbNxJVxpVtemikxE9A= github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= +github.com/charmbracelet/bubbletea v0.12.4 h1:2cfryCnDOe7SvQF/Dj99irXKpFlfoPgQjEDdvP1pLpk= +github.com/charmbracelet/bubbletea v0.12.4/go.mod h1:tp9tr9Dadh0PLhgiwchE5zZJXm5543JYjHG9oY+5qSg= github.com/charmbracelet/charm v0.8.2 h1:sYJhP7YopJUvjWE8VKlNrcAHAaRZsEgKn8z2FoIhHOI= github.com/charmbracelet/charm v0.8.2/go.mod h1:xi3evUxj8hw+dMApaXRczb2SiEzrn8a3NYobj0off+c= github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 h1:XgXVfMdJTNTq/ajMvwiB1OW3Tg/TXHtM3tYr/vYF76w= @@ -173,6 +175,8 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/meowgorithm/babyenv v1.2.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/meowgorithm/babyenv v1.3.0 h1:klb7ugoZt0/Xlqkd5kLxM7eLZX8waiwxHZWW5nfEZ0Q= @@ -202,8 +206,8 @@ github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQ github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/reflow v0.2.0 h1:2o0UBJPHHH4fa2GCXU4Rg4DwOtWPMekCeyc5EWbAQp0= github.com/muesli/reflow v0.2.0/go.mod h1:qT22vjVmM9MIUeLgsVYe/Ye7eZlbv9dZjL3dVhUqLX8= -github.com/muesli/reflow v0.2.1-0.20201126184510-3bcb929042f2 h1:+cpkcmASpeBn4qXz2tU+x+njyKe91NoHXqrJdhoDnZo= -github.com/muesli/reflow v0.2.1-0.20201126184510-3bcb929042f2/go.mod h1:qT22vjVmM9MIUeLgsVYe/Ye7eZlbv9dZjL3dVhUqLX8= +github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68 h1:y1p/ycavWjGT9FnmSjdbWUlLGvcxrY0Rw3ATltrxOhk= +github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= @@ -235,6 +239,9 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -303,6 +310,8 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -359,6 +368,7 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -370,6 +380,13 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a h1:e3IU37lwO4aq3uoRKINC7JikojFmE5gO7xhfxs8VC34= golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 h1:nVuTkr9L6Bq62qpUqKo/RnZCFfzDBL0bYo6w9OJUqZY= +golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= From 0da9927f37351a6523a6c444e8dc59cb01003f84 Mon Sep 17 00:00:00 2001 From: Bruno Arueira Date: Sun, 31 Jan 2021 20:02:32 -0300 Subject: [PATCH 664/911] Removes duplicate doc about stashing --- README.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/README.md b/README.md index 582a83e..ecfbf0f 100644 --- a/README.md +++ b/README.md @@ -89,16 +89,6 @@ Glow works with the Charm Cloud to allow you to store any markdown files in your own private collection. You can stash a local document from the Glow TUI by pressing `s`. -You can also stash from the CLI: - -```bash -glow stash README.md -``` - -Then, when you run `glow` without arguments will you can browse through your -stashed documents. This is a great way to keep track of things that you need to -reference often. - Stashing is private, its contents will not be exposed publicly, and it's encrypted end-to-end. More on encryption below. From 2088bac668b7d918dde4c98e7a6abaa622de82e9 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 1 Feb 2021 04:52:13 +0100 Subject: [PATCH 665/911] Make TUI find markdowns with a variety of file extensions List from GitHub's supported extensions: - .md - .markdown - .mdown - .mkdn - .mkd Fixes #233. --- ui/ui.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/ui.go b/ui/ui.go index 2fb335d..08df524 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -32,6 +32,10 @@ var ( config Config glowLogoTextColor = lib.Color("#ECFD65") + markdownExtensions = []string{ + "*.md", "*.mdown", "*.mkdn", "*.mkd", "*.markdown", + } + // True if we're logging to a file, in which case we'll log more stuff. debug = false @@ -526,7 +530,7 @@ func findLocalFiles(m model) tea.Cmd { ignore = ignorePatterns(m) } - ch, err := gitcha.FindFilesExcept(cwd, []string{"*.md"}, ignore) + ch, err := gitcha.FindFilesExcept(cwd, markdownExtensions, ignore) if err != nil { if debug { log.Println("error finding local files:", err) From 3285903aae57c98ab06ee2182a12e559f03982bb Mon Sep 17 00:00:00 2001 From: lestrrat <49281+lestrrat@users.noreply.github.com> Date: Thu, 4 Feb 2021 09:34:44 +0900 Subject: [PATCH 666/911] Enable/Disable pager from config (#242) --- main.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index 2b8fc3f..44fd333 100644 --- a/main.go +++ b/main.go @@ -140,6 +140,7 @@ func validateOptions(cmd *cobra.Command) error { width = viper.GetUint("width") localOnly = viper.GetBool("local") mouse = viper.GetBool("mouse") + pager = viper.GetBool("pager") // validate the glamour style style = viper.GetString("style") @@ -270,13 +271,13 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { } // display - if cmd.Flags().Changed("pager") { - pager := os.Getenv("PAGER") - if pager == "" { - pager = "less -r" + if pager || cmd.Flags().Changed("pager") { + pagerCmd := os.Getenv("PAGER") + if pagerCmd == "" { + pagerCmd = "less -r" } - pa := strings.Split(pager, " ") + pa := strings.Split(pagerCmd, " ") c := exec.Command(pa[0], pa[1:]...) c.Stdin = strings.NewReader(content) c.Stdout = os.Stdout From b67e23e7dfe00b7e09fade087629ba842c5b560f Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 4 Feb 2021 01:38:52 +0100 Subject: [PATCH 667/911] Update default config and documentation --- README.md | 4 ++++ config_cmd.go | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/README.md b/README.md index ecfbf0f..1ee57fa 100644 --- a/README.md +++ b/README.md @@ -176,6 +176,10 @@ Here's an example config: style: "light" # show local files only; no network (TUI-mode only) local: true +# mouse support (TUI-mode only) +mouse: true +# use pager to display markdown +pager: true # word-wrap at width width: 80 ``` diff --git a/config_cmd.go b/config_cmd.go index 8d73b1f..a90b903 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -16,6 +16,10 @@ const defaultConfig = `# style name or JSON path (default "auto") style: "auto" # show local files only; no network (TUI-mode only) local: false +# mouse support (TUI-mode only) +mouse: false +# use pager to display markdown +pager: false # word-wrap at width width: 80` From 2279690267c1b19b934460e2990fc505cb1d0113 Mon Sep 17 00:00:00 2001 From: purofle <3272912942@qq.com> Date: Tue, 16 Feb 2021 15:03:01 +0800 Subject: [PATCH 668/911] Add termux support to README (#248) --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 1ee57fa..7edbca1 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,9 @@ eopkg install glow # Windows (with Scoop) scoop install glow + +# Android (with termux) +pkg install glow ``` Or download a binary from the [releases][releases] page. MacOS, Linux, Windows, From 08a8d4b5edb123a19b5f84662ce94a469fa5f71d Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 1 Mar 2021 11:44:38 +0100 Subject: [PATCH 669/911] Bump gitcha to v0.2.0 --- go.mod | 2 +- go.sum | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 1986328..0ca3f48 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/meowgorithm/babyenv v1.3.0 github.com/microcosm-cc/bluemonday v1.0.4 // indirect github.com/mitchellh/go-homedir v1.1.0 - github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6 + github.com/muesli/gitcha v0.2.0 github.com/muesli/go-app-paths v0.2.1 github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68 github.com/muesli/termenv v0.7.4 diff --git a/go.sum b/go.sum index bb967bd..52efd9f 100644 --- a/go.sum +++ b/go.sum @@ -47,7 +47,6 @@ github.com/charmbracelet/bubbles v0.7.6 h1:SCAp4ZEUf2tBNEsufo+Xxxu2dvbFhYSDPrX45 github.com/charmbracelet/bubbles v0.7.6/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZSG46SFauoZj22s= github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= github.com/charmbracelet/bubbletea v0.10.5/go.mod h1:Nay5oWkkSZvc6E/be+W3nDFXAsVytNUNKV9jbXcuae0= -github.com/charmbracelet/bubbletea v0.12.2 h1:y9Yo2Pv8tcm3mAJsWONGsmHhzrbNxJVxpVtemikxE9A= github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= github.com/charmbracelet/bubbletea v0.12.4 h1:2cfryCnDOe7SvQF/Dj99irXKpFlfoPgQjEDdvP1pLpk= github.com/charmbracelet/bubbletea v0.12.4/go.mod h1:tp9tr9Dadh0PLhgiwchE5zZJXm5543JYjHG9oY+5qSg= @@ -173,7 +172,6 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= @@ -199,12 +197,11 @@ github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQz github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6 h1:CUOAyrZoFRlGHfl6vljna20J++p8sPRlw9KF7fySgpA= -github.com/muesli/gitcha v0.1.2-0.20200908172931-5aa4fdccf2f6/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= +github.com/muesli/gitcha v0.2.0 h1:+wOgT2dI9s2Tznj1t1rb/qkK5e0cb6qD8c4IX2TR/YY= +github.com/muesli/gitcha v0.2.0/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= -github.com/muesli/reflow v0.2.0 h1:2o0UBJPHHH4fa2GCXU4Rg4DwOtWPMekCeyc5EWbAQp0= github.com/muesli/reflow v0.2.0/go.mod h1:qT22vjVmM9MIUeLgsVYe/Ye7eZlbv9dZjL3dVhUqLX8= github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68 h1:y1p/ycavWjGT9FnmSjdbWUlLGvcxrY0Rw3ATltrxOhk= github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= @@ -308,7 +305,6 @@ golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= @@ -378,12 +374,10 @@ golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a h1:e3IU37lwO4aq3uoRKINC7JikojFmE5gO7xhfxs8VC34= golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 h1:nVuTkr9L6Bq62qpUqKo/RnZCFfzDBL0bYo6w9OJUqZY= golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= From 851d21f6c483d43b666cface3b026a88c35ea772 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 1 Mar 2021 15:49:47 -0500 Subject: [PATCH 670/911] Implement String method on some enum types for easier debugging --- ui/stash.go | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/ui/stash.go b/ui/stash.go index 2accdca..c5e571c 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -64,6 +64,14 @@ const ( stashStateShowingError ) +func (s stashViewState) String() string { + return map[stashViewState]string{ + stashStateReady: "ready", + stashStateLoadingDocument: "loading document", + stashStateShowingError: "showing error", + }[s] +} + // The types of documents we are currently showing to the user. type sectionKey int @@ -74,6 +82,15 @@ const ( filterSection ) +func (s sectionKey) String() string { + return map[sectionKey]string{ + localSection: "local", + stashedSection: "stashed", + newsSection: "news", + filterSection: "filtered", + }[s] +} + // section contains definitions and state information for displaying a tab and // its contents in the file listing view. type section struct { @@ -116,6 +133,14 @@ const ( filterApplied // a filter is applied and user is not editing filter ) +func (f filterState) String() string { + return map[filterState]string{ + unfiltered: "unfiltered", + filtering: "filtering", + filterApplied: "filter applied", + }[f] +} + // selectionState is the state of the currently selected document. type selectionState int @@ -125,6 +150,14 @@ const ( selectionPromptingDelete ) +func (s selectionState) String() string { + return map[selectionState]string{ + selectionIdle: "idle", + selectionSettingNote: "setting note", + selectionPromptingDelete: "prompting for deletion", + }[s] +} + // statusMessageType adds some context to the status message being sent. type statusMessageType int @@ -135,6 +168,14 @@ const ( errorStatusMessage ) +func (s statusMessageType) String() string { + return map[statusMessageType]string{ + normalStatusMessage: "normal", + subtleStatusMessage: "subtle", + errorStatusMessage: "error", + }[s] +} + // statusMessage is an ephemeral note displayed in the UI. type statusMessage struct { status statusMessageType From 3a572216ade19cde289618eb16ea2435b76b0afa Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 1 Mar 2021 16:10:28 -0500 Subject: [PATCH 671/911] Update pagintion after changing sections when resetting the filter Fixes #251 --- ui/stash.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index c5e571c..927a7fb 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -313,14 +313,21 @@ func (m *stashModel) resetFiltering() { m.bakeConvertedDocs() sort.Stable(markdownsByLocalFirst(m.markdowns)) - m.updatePagination() + // If the filtered section is present (it's always at the end) slice it out + // of the sections slice to remove it from the UI. if m.sections[len(m.sections)-1].key == filterSection { m.sections = m.sections[:len(m.sections)-1] } + + // If the current section is out of bounds (it would be if we cut down the + // slice above) then return to the first section. if m.sectionIndex > len(m.sections)-1 { m.sectionIndex = 0 } + + // Update pagination after we've switched sections. + m.updatePagination() } // Is a filter currently being applied? From da08ebc0dae6126970a56c8fad766ac4f04f1464 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 1 Mar 2021 17:57:54 -0500 Subject: [PATCH 672/911] Don't mutate paginators in the view!! --- ui/stash.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 927a7fb..30fd35e 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -1224,10 +1224,19 @@ func (m stashModel) view() string { pagination = m.paginator().View() // If the dot pagination is wider than the width of the window - // switch to the arabic paginator. + // use the arabic paginator. if ansi.PrintableRuneWidth(pagination) > m.common.width-stashViewHorizontalPadding { - m.paginator().Type = paginator.Arabic - pagination = lib.Subtle(m.paginator().View()) + // Copy the paginator since m.paginator() returns a pointer to + // the active paginator and we don't want to mutate it. In + // normal cases, where the paginator is not a pointer, we could + // safely change the model parameters for rendering here as the + // current model is discarded after reuturning from a View(). + // One could argue, in fact, that using pointers in + // a functional framework is an antipattern and our use of + // pointers in our model should be refactored away. + var p paginator.Model = *(m.paginator()) + p.Type = paginator.Arabic + pagination = lib.Subtle(p.View()) } // We could also look at m.stashFullyLoaded and add an indicator From dedf7967b0ff10935194f3f2ecab67b6852613b8 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 1 Mar 2021 18:09:12 -0500 Subject: [PATCH 673/911] Bump Bubble Tea dependency --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0ca3f48..18bb2c6 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.13 require ( github.com/alecthomas/chroma v0.8.0 // indirect github.com/charmbracelet/bubbles v0.7.6 - github.com/charmbracelet/bubbletea v0.12.4 + github.com/charmbracelet/bubbletea v0.12.6-0.20210301230553-cd676fab5a41 github.com/charmbracelet/charm v0.8.2 github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac diff --git a/go.sum b/go.sum index 52efd9f..756c8ad 100644 --- a/go.sum +++ b/go.sum @@ -48,8 +48,8 @@ github.com/charmbracelet/bubbles v0.7.6/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZS github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= github.com/charmbracelet/bubbletea v0.10.5/go.mod h1:Nay5oWkkSZvc6E/be+W3nDFXAsVytNUNKV9jbXcuae0= github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= -github.com/charmbracelet/bubbletea v0.12.4 h1:2cfryCnDOe7SvQF/Dj99irXKpFlfoPgQjEDdvP1pLpk= -github.com/charmbracelet/bubbletea v0.12.4/go.mod h1:tp9tr9Dadh0PLhgiwchE5zZJXm5543JYjHG9oY+5qSg= +github.com/charmbracelet/bubbletea v0.12.6-0.20210301230553-cd676fab5a41 h1:JmQR0xSwM87HIe63/qBu5KfyDiEOXSdMfVBF6EtBo/s= +github.com/charmbracelet/bubbletea v0.12.6-0.20210301230553-cd676fab5a41/go.mod h1:tp9tr9Dadh0PLhgiwchE5zZJXm5543JYjHG9oY+5qSg= github.com/charmbracelet/charm v0.8.2 h1:sYJhP7YopJUvjWE8VKlNrcAHAaRZsEgKn8z2FoIhHOI= github.com/charmbracelet/charm v0.8.2/go.mod h1:xi3evUxj8hw+dMApaXRczb2SiEzrn8a3NYobj0off+c= github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 h1:XgXVfMdJTNTq/ajMvwiB1OW3Tg/TXHtM3tYr/vYF76w= From 4a94b87f499107f53a6aa92be50b2bf8bb27fa7b Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 2 Mar 2021 13:10:53 -0500 Subject: [PATCH 674/911] Drop string methods various some types (again) They were only for debugging and are prone to falling out of sync. --- ui/stash.go | 41 ----------------------------------------- 1 file changed, 41 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 30fd35e..38760d4 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -64,14 +64,6 @@ const ( stashStateShowingError ) -func (s stashViewState) String() string { - return map[stashViewState]string{ - stashStateReady: "ready", - stashStateLoadingDocument: "loading document", - stashStateShowingError: "showing error", - }[s] -} - // The types of documents we are currently showing to the user. type sectionKey int @@ -82,15 +74,6 @@ const ( filterSection ) -func (s sectionKey) String() string { - return map[sectionKey]string{ - localSection: "local", - stashedSection: "stashed", - newsSection: "news", - filterSection: "filtered", - }[s] -} - // section contains definitions and state information for displaying a tab and // its contents in the file listing view. type section struct { @@ -133,14 +116,6 @@ const ( filterApplied // a filter is applied and user is not editing filter ) -func (f filterState) String() string { - return map[filterState]string{ - unfiltered: "unfiltered", - filtering: "filtering", - filterApplied: "filter applied", - }[f] -} - // selectionState is the state of the currently selected document. type selectionState int @@ -150,14 +125,6 @@ const ( selectionPromptingDelete ) -func (s selectionState) String() string { - return map[selectionState]string{ - selectionIdle: "idle", - selectionSettingNote: "setting note", - selectionPromptingDelete: "prompting for deletion", - }[s] -} - // statusMessageType adds some context to the status message being sent. type statusMessageType int @@ -168,14 +135,6 @@ const ( errorStatusMessage ) -func (s statusMessageType) String() string { - return map[statusMessageType]string{ - normalStatusMessage: "normal", - subtleStatusMessage: "subtle", - errorStatusMessage: "error", - }[s] -} - // statusMessage is an ephemeral note displayed in the UI. type statusMessage struct { status statusMessageType From 1f6e2ff1872ed3cb6ddbbc20df17edbb9bae1ec9 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Mon, 8 Mar 2021 23:01:07 -0300 Subject: [PATCH 675/911] feat: snapcraft packages Signed-off-by: Carlos Alexandro Becker --- .goreleaser.yml | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 82f666b..04f31e0 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -3,9 +3,9 @@ env: - CGO_ENABLED=0 before: hooks: - - go mod download + - go mod tidy builds: - - id: "glow" + - binary: glow ldflags: -s -w -X main.Version={{ .Version }} -X main.CommitSHA={{ .Commit }} goos: @@ -24,7 +24,7 @@ builds: - 7 archives: - - id: default + - builds: - glow format_overrides: @@ -37,9 +37,7 @@ archives: amd64: x86_64 nfpms: - - builds: - - glow - + - vendor: charmbracelet homepage: "https://charm.sh/" maintainer: "Christian Muehlhaeuser " @@ -63,6 +61,25 @@ brews: description: "Render markdown on the CLI" # skip_upload: true +snapcrafts: + - + name: glow + publish: true + summary: Render markdown on the CLI, with pizzazz! + description: | + Glow is a terminal based markdown reader designed from the ground up to bring out the beauty—and power—of the CLI. + Use it to discover markdown files, read documentation directly on the command line and stash markdown files to your own private collection so you can read them anywhere. Glow will find local markdown files in subdirectories or a local Git repository. + By the way, all data stashed is encrypted end-to-end: only you can decrypt it. More on that below. + + grade: stable + confinement: strict + license: MIT + base: core20 + + apps: + glow: + plugs: ["home", "network"] + signs: - artifacts: checksum From a5d4a512b708ecaebf872e3fea031540847bff37 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 9 Mar 2021 13:27:02 +0100 Subject: [PATCH 676/911] Add goreleaser workflow (#257) --- .github/workflows/goreleaser.yml | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/goreleaser.yml diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml new file mode 100644 index 0000000..e865c5a --- /dev/null +++ b/.github/workflows/goreleaser.yml @@ -0,0 +1,34 @@ +name: goreleaser + +on: + pull_request: + push: + +jobs: + goreleaser: + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - + name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: ~1.16 + - + name: Set up Snapcraft + env: + SNAPCRAFT_LOGIN: ${{ secrets.SNAPCRAFT_LOGIN }} + run: | + sudo apt-get update + sudo apt-get -yq --no-install-suggests --no-install-recommends install snapcraft + snapcraft login --with <(echo "$SNAPCRAFT_LOGIN") + - + name: Run GoReleaser + uses: goreleaser/goreleaser-action@v2 + with: + version: latest + args: release --snapshot --skip-publish --skip-sign --rm-dist From cfb746e66a97085e2b68a36559074c0d8abc4add Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 9 Mar 2021 13:24:24 +0100 Subject: [PATCH 677/911] Pass through all keys when editing filter --- ui/ui.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/ui.go b/ui/ui.go index 08df524..f0a916c 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -254,6 +254,11 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Send q/esc through to stash switch m.state { case stateShowStash: + // pass through all keys if we're editing the filter + if m.stash.filterState == filtering { + m.stash, cmd = m.stash.update(msg) + return m, cmd + } // Q quits if we're filtering, but we still send esc though. if m.stash.filterApplied() { @@ -267,7 +272,6 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { // Send q/esc through in these cases switch m.stash.viewState { case stashStateReady: - // Q also quits glow when displaying only newsitems. Esc // still passes through. if msg.String() == "q" { From 02ad6ad3643ef3aaf387d23f254acf65c04d8cc4 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 9 Mar 2021 14:16:17 +0100 Subject: [PATCH 678/911] Simplify key event handling --- ui/ui.go | 49 ++++++++----------------------------------------- 1 file changed, 8 insertions(+), 41 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index f0a916c..5a15f7c 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -248,40 +248,19 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { - case "q", "esc": + case "esc": + if m.state == stateShowDocument { + batch := m.unloadDocument() + return m, tea.Batch(batch...) + } + + case "q": var cmd tea.Cmd - // Send q/esc through to stash switch m.state { case stateShowStash: // pass through all keys if we're editing the filter - if m.stash.filterState == filtering { - m.stash, cmd = m.stash.update(msg) - return m, cmd - } - - // Q quits if we're filtering, but we still send esc though. - if m.stash.filterApplied() { - if msg.String() == "q" { - return m, tea.Quit - } - m.stash, cmd = m.stash.update(msg) - return m, cmd - } - - // Send q/esc through in these cases - switch m.stash.viewState { - case stashStateReady: - // Q also quits glow when displaying only newsitems. Esc - // still passes through. - if msg.String() == "q" { - return m, tea.Quit - } - - m.stash, cmd = m.stash.update(msg) - return m, cmd - - case stashStateShowingError: + if m.stash.filterState == filtering || m.stash.selectionState == selectionSettingNote { m.stash, cmd = m.stash.update(msg) return m, cmd } @@ -296,18 +275,6 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.pager = newPagerModel batch = append(batch, cmd) return m, tea.Batch(batch...) - - // Otherwise let the user exit the view or application as - // normal. - default: - switch msg.String() { - case "q": - return m, tea.Quit - case "esc": - var batch []tea.Cmd - batch = m.unloadDocument() - return m, tea.Batch(batch...) - } } } From 5b29a023bf541323ee64d5cbe0d967a689a9e611 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 11 Mar 2021 16:33:53 +0100 Subject: [PATCH 679/911] Bump charm, babyenv, termenv, cobra, and viper dependencies --- go.mod | 10 +++++----- go.sum | 37 +++++++++++++++---------------------- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index 18bb2c6..62b4a91 100644 --- a/go.mod +++ b/go.mod @@ -6,23 +6,23 @@ require ( github.com/alecthomas/chroma v0.8.0 // indirect github.com/charmbracelet/bubbles v0.7.6 github.com/charmbracelet/bubbletea v0.12.6-0.20210301230553-cd676fab5a41 - github.com/charmbracelet/charm v0.8.2 + github.com/charmbracelet/charm v0.8.6 github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/google/uuid v1.1.2 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/mattn/go-runewidth v0.0.10 - github.com/meowgorithm/babyenv v1.3.0 + github.com/meowgorithm/babyenv v1.3.1 github.com/microcosm-cc/bluemonday v1.0.4 // indirect github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.2.0 github.com/muesli/go-app-paths v0.2.1 github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68 - github.com/muesli/termenv v0.7.4 + github.com/muesli/termenv v0.8.0 github.com/sahilm/fuzzy v0.1.0 github.com/segmentio/ksuid v1.0.3 - github.com/spf13/cobra v1.1.1 - github.com/spf13/viper v1.7.0 + github.com/spf13/cobra v1.1.3 + github.com/spf13/viper v1.7.1 golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 diff --git a/go.sum b/go.sum index 756c8ad..64b4fde 100644 --- a/go.sum +++ b/go.sum @@ -42,16 +42,14 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/charmbracelet/bubbles v0.6.0/go.mod h1:MxySU+YRGbAhZQJavZlW2os+fIeOW69MI3iXqA+2/WA= +github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGimk1BE6cmHijOkM= github.com/charmbracelet/bubbles v0.7.6 h1:SCAp4ZEUf2tBNEsufo+Xxxu2dvbFhYSDPrX45toQZrM= github.com/charmbracelet/bubbles v0.7.6/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZSG46SFauoZj22s= -github.com/charmbracelet/bubbletea v0.10.3/go.mod h1:fB1bVmlaXBYYv4G0jtuGSP/m8V2sMM97pq7QqQnubWI= -github.com/charmbracelet/bubbletea v0.10.5/go.mod h1:Nay5oWkkSZvc6E/be+W3nDFXAsVytNUNKV9jbXcuae0= github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= github.com/charmbracelet/bubbletea v0.12.6-0.20210301230553-cd676fab5a41 h1:JmQR0xSwM87HIe63/qBu5KfyDiEOXSdMfVBF6EtBo/s= github.com/charmbracelet/bubbletea v0.12.6-0.20210301230553-cd676fab5a41/go.mod h1:tp9tr9Dadh0PLhgiwchE5zZJXm5543JYjHG9oY+5qSg= -github.com/charmbracelet/charm v0.8.2 h1:sYJhP7YopJUvjWE8VKlNrcAHAaRZsEgKn8z2FoIhHOI= -github.com/charmbracelet/charm v0.8.2/go.mod h1:xi3evUxj8hw+dMApaXRczb2SiEzrn8a3NYobj0off+c= +github.com/charmbracelet/charm v0.8.6 h1:/U6rxGj4J6zZ1Ex8+wTr4hNMr4ESBzNZbC1UyrJPVbg= +github.com/charmbracelet/charm v0.8.6/go.mod h1:8dE3uX+TYSpa7Q6e/CmjN6WSd7koSAKNQTGWugFREx4= github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 h1:XgXVfMdJTNTq/ajMvwiB1OW3Tg/TXHtM3tYr/vYF76w= github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5/go.mod h1:CGH6KT1ovzvGpaQFxkm9ulKx6BlfV4dThCDaOMi54qI= github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= @@ -161,8 +159,9 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -176,9 +175,9 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/meowgorithm/babyenv v1.2.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= -github.com/meowgorithm/babyenv v1.3.0 h1:klb7ugoZt0/Xlqkd5kLxM7eLZX8waiwxHZWW5nfEZ0Q= github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= +github.com/meowgorithm/babyenv v1.3.1 h1:18ZEYIgbzoFQfRLF9+lxjRfk/ui6w8U0FWl07CgWvvc= +github.com/meowgorithm/babyenv v1.3.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg= github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= @@ -207,10 +206,10 @@ github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68 h1:y1p/ycavWjGT9Fn github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= -github.com/muesli/termenv v0.7.0/go.mod h1:SohX91w6swWA4AYU+QmPx+aSgXhWO0juiyID9UZmbpA= github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= -github.com/muesli/termenv v0.7.4 h1:/pBqvU5CpkY53tU0vVn+xgs2ZTX63aH5nY+SSps5Xa8= github.com/muesli/termenv v0.7.4/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= +github.com/muesli/termenv v0.8.0 h1:HxhDOZbpf9nSUhOiMUNk5jsL3XaKWAbHucoGYZf+nag= +github.com/muesli/termenv v0.8.0/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= @@ -222,8 +221,6 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03/go.mod h1:Z9+Ul5bCbBKnbCvdOWbLqTHhJiYV414CURZJba6L8qA= -github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -265,16 +262,17 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -301,9 +299,7 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= @@ -369,10 +365,7 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -439,8 +432,8 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From b6ec7ae14c520b69a20227e3848b0d361f07483c Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 11 Mar 2021 16:39:18 +0100 Subject: [PATCH 680/911] Bump glamour dependency --- go.mod | 4 +--- go.sum | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 62b4a91..a7fc50a 100644 --- a/go.mod +++ b/go.mod @@ -3,17 +3,15 @@ module github.com/charmbracelet/glow go 1.13 require ( - github.com/alecthomas/chroma v0.8.0 // indirect github.com/charmbracelet/bubbles v0.7.6 github.com/charmbracelet/bubbletea v0.12.6-0.20210301230553-cd676fab5a41 github.com/charmbracelet/charm v0.8.6 - github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 + github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/google/uuid v1.1.2 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/mattn/go-runewidth v0.0.10 github.com/meowgorithm/babyenv v1.3.1 - github.com/microcosm-cc/bluemonday v1.0.4 // indirect github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.2.0 github.com/muesli/go-app-paths v0.2.1 diff --git a/go.sum b/go.sum index 64b4fde..65f7626 100644 --- a/go.sum +++ b/go.sum @@ -17,9 +17,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= -github.com/alecthomas/chroma v0.7.3/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= -github.com/alecthomas/chroma v0.8.0 h1:HS+HE97sgcqjQGu5uVr8jIE55Mmh5UeQ7kckAhHg2pY= -github.com/alecthomas/chroma v0.8.0/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= +github.com/alecthomas/chroma v0.8.2 h1:x3zkuE2lUk/RIekyAJ3XRqSCP4zwWDfcw/YJCuCAACg= +github.com/alecthomas/chroma v0.8.2/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= @@ -50,8 +49,8 @@ github.com/charmbracelet/bubbletea v0.12.6-0.20210301230553-cd676fab5a41 h1:JmQR github.com/charmbracelet/bubbletea v0.12.6-0.20210301230553-cd676fab5a41/go.mod h1:tp9tr9Dadh0PLhgiwchE5zZJXm5543JYjHG9oY+5qSg= github.com/charmbracelet/charm v0.8.6 h1:/U6rxGj4J6zZ1Ex8+wTr4hNMr4ESBzNZbC1UyrJPVbg= github.com/charmbracelet/charm v0.8.6/go.mod h1:8dE3uX+TYSpa7Q6e/CmjN6WSd7koSAKNQTGWugFREx4= -github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5 h1:XgXVfMdJTNTq/ajMvwiB1OW3Tg/TXHtM3tYr/vYF76w= -github.com/charmbracelet/glamour v0.2.1-0.20200829234023-6c0e29c4dae5/go.mod h1:CGH6KT1ovzvGpaQFxkm9ulKx6BlfV4dThCDaOMi54qI= +github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400 h1:vj8zwTsLNE37zzcmkkBsG+HBtniUtLdQe6J206C+i30= +github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400/go.mod h1:VO5pQW96Vj3qJy9ikwb5Zo8lcvt2ZDFoE3UXl+SduQs= github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -178,7 +177,6 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/meowgorithm/babyenv v1.3.1 h1:18ZEYIgbzoFQfRLF9+lxjRfk/ui6w8U0FWl07CgWvvc= github.com/meowgorithm/babyenv v1.3.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg= github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -212,8 +210,8 @@ github.com/muesli/termenv v0.8.0 h1:HxhDOZbpf9nSUhOiMUNk5jsL3XaKWAbHucoGYZf+nag= github.com/muesli/termenv v0.8.0/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -285,8 +283,11 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1 github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.1 h1:eVwehsLsZlCJCwXyGLgg+Q4iFWE/eTIMG0e8waCmm/I= +github.com/yuin/goldmark v1.3.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark-emoji v1.0.1 h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os= +github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= From e9aa60740040f794202d44b543ee3d1b995e99b6 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 11 Mar 2021 10:48:27 -0500 Subject: [PATCH 681/911] Fix tab contrast in light mode, particularly in macOS terminal --- ui/stash.go | 4 ++-- ui/styles.go | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 38760d4..0df8a52 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -1289,9 +1289,9 @@ func (m stashModel) headerView() string { } if m.sectionIndex == i && len(m.sections) > 1 { - s = brightGrayFg(s) + s = selectedTabColor(s) } else { - s = grayFg(s) + s = tabColor(s) } sections = append(sections, s) } diff --git a/ui/styles.go b/ui/styles.go index cd90d61..ed527f4 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -42,6 +42,10 @@ var ( dullYellowFg = newFgStyle(lib.NewColorPair("#9BA92F", "#6BCB94")) // renders light green on light backgrounds redFg = newFgStyle(lib.Red) faintRedFg = newFgStyle(lib.FaintRed) + + // Ultimately, we should transition to named styles + tabColor = newFgStyle(lib.NewColorPair("#626262", "#909090")) + selectedTabColor = newFgStyle(lib.NewColorPair("#979797", "#332F33")) ) // Returns a termenv style with foreground and background options. From 8b4cae02da7b69f5d206973b5552d7e5c18621a4 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 12 Mar 2021 02:20:07 +0100 Subject: [PATCH 682/911] Enable golint as linter --- .golangci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.golangci.yml b/.golangci.yml index 36f9966..d4530e4 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -14,6 +14,7 @@ linters: - godot - godox - goimports + - golint - gomnd - goprintffuncname - gosec From 0333e8825278268054d93ce69ab5223142cc2b75 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 12 Mar 2021 12:57:45 +0100 Subject: [PATCH 683/911] Bump bubbletea dependency --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a7fc50a..8e57857 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.7.6 - github.com/charmbracelet/bubbletea v0.12.6-0.20210301230553-cd676fab5a41 + github.com/charmbracelet/bubbletea v0.13.0 github.com/charmbracelet/charm v0.8.6 github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac diff --git a/go.sum b/go.sum index 65f7626..cac858d 100644 --- a/go.sum +++ b/go.sum @@ -45,8 +45,8 @@ github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGim github.com/charmbracelet/bubbles v0.7.6 h1:SCAp4ZEUf2tBNEsufo+Xxxu2dvbFhYSDPrX45toQZrM= github.com/charmbracelet/bubbles v0.7.6/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZSG46SFauoZj22s= github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= -github.com/charmbracelet/bubbletea v0.12.6-0.20210301230553-cd676fab5a41 h1:JmQR0xSwM87HIe63/qBu5KfyDiEOXSdMfVBF6EtBo/s= -github.com/charmbracelet/bubbletea v0.12.6-0.20210301230553-cd676fab5a41/go.mod h1:tp9tr9Dadh0PLhgiwchE5zZJXm5543JYjHG9oY+5qSg= +github.com/charmbracelet/bubbletea v0.13.0 h1:dYz4RMpsnY2H2w4rof0sVWzM+KwoXmleI/xkKOm5m2o= +github.com/charmbracelet/bubbletea v0.13.0/go.mod h1:tp9tr9Dadh0PLhgiwchE5zZJXm5543JYjHG9oY+5qSg= github.com/charmbracelet/charm v0.8.6 h1:/U6rxGj4J6zZ1Ex8+wTr4hNMr4ESBzNZbC1UyrJPVbg= github.com/charmbracelet/charm v0.8.6/go.mod h1:8dE3uX+TYSpa7Q6e/CmjN6WSd7koSAKNQTGWugFREx4= github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400 h1:vj8zwTsLNE37zzcmkkBsG+HBtniUtLdQe6J206C+i30= From 2d8f8c2d64a82f744f938efd60cb5d227cb96ac1 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 12 Mar 2021 13:28:38 +0100 Subject: [PATCH 684/911] Fix typo --- ui/stashhelp.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stashhelp.go b/ui/stashhelp.go index 4dbe530..fea1fdf 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -16,7 +16,7 @@ type helpEntry struct{ key, val string } type helpColumn []helpEntry // newHelpColumn creates a help column from pairs of string arguments -// represeting keys and values. If the arguements are not even (and therein +// represeting keys and values. If the arguments are not even (and therein // not every key has a matching value) the function will panic. func newHelpColumn(pairs ...string) (h helpColumn) { if len(pairs)%2 != 0 { From e5ec06b3b99e436cb776bacf81c466db6075168b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 12 Mar 2021 13:30:30 +0100 Subject: [PATCH 685/911] Simplify code by removing else block --- ui/stash.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 0df8a52..6e85d58 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -1236,13 +1236,12 @@ func (m stashModel) headerView() string { if m.filterState == filtering { if localCount+stashedCount+newsCount == 0 { return grayFg("Nothing found.") - } else { - if localCount > 0 { - sections = append(sections, fmt.Sprintf("%d local", localCount)) - } - if stashedCount > 0 { - sections = append(sections, fmt.Sprintf("%d stashed", stashedCount)) - } + } + if localCount > 0 { + sections = append(sections, fmt.Sprintf("%d local", localCount)) + } + if stashedCount > 0 { + sections = append(sections, fmt.Sprintf("%d stashed", stashedCount)) } for i := range sections { From 4f9ad6721c8294de75b80a86d7560786f66dc632 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 13 Mar 2021 04:38:54 +0100 Subject: [PATCH 686/911] Bump bubbletea dependency to v0.13.1 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8e57857..b7e6c74 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.7.6 - github.com/charmbracelet/bubbletea v0.13.0 + github.com/charmbracelet/bubbletea v0.13.1 github.com/charmbracelet/charm v0.8.6 github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac diff --git a/go.sum b/go.sum index cac858d..27c528d 100644 --- a/go.sum +++ b/go.sum @@ -45,8 +45,8 @@ github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGim github.com/charmbracelet/bubbles v0.7.6 h1:SCAp4ZEUf2tBNEsufo+Xxxu2dvbFhYSDPrX45toQZrM= github.com/charmbracelet/bubbles v0.7.6/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZSG46SFauoZj22s= github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= -github.com/charmbracelet/bubbletea v0.13.0 h1:dYz4RMpsnY2H2w4rof0sVWzM+KwoXmleI/xkKOm5m2o= -github.com/charmbracelet/bubbletea v0.13.0/go.mod h1:tp9tr9Dadh0PLhgiwchE5zZJXm5543JYjHG9oY+5qSg= +github.com/charmbracelet/bubbletea v0.13.1 h1:huvX8mPaeMZ8DLulT50iEWRF+iitY5FNEDqDVLu69nM= +github.com/charmbracelet/bubbletea v0.13.1/go.mod h1:tp9tr9Dadh0PLhgiwchE5zZJXm5543JYjHG9oY+5qSg= github.com/charmbracelet/charm v0.8.6 h1:/U6rxGj4J6zZ1Ex8+wTr4hNMr4ESBzNZbC1UyrJPVbg= github.com/charmbracelet/charm v0.8.6/go.mod h1:8dE3uX+TYSpa7Q6e/CmjN6WSd7koSAKNQTGWugFREx4= github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400 h1:vj8zwTsLNE37zzcmkkBsG+HBtniUtLdQe6J206C+i30= From 3ff9a5dfd6f29c47dba76cdf682770462d4017b2 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 27 Mar 2021 13:32:36 +0100 Subject: [PATCH 687/911] Always use latest version of golangci-lint --- .github/workflows/lint.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index e917f47..6249b5b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,5 +1,7 @@ name: lint -on: [push, pull_request] +on: + push: + pull_request: jobs: golangci: @@ -10,11 +12,7 @@ jobs: - name: golangci-lint uses: golangci/golangci-lint-action@v2 with: - # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. - version: v1.30 # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 - # Optional: working directory, useful for monorepos - # working-directory: somedir # Optional: show only new issues if it's a pull request. The default value is `false`. only-new-issues: true From ca833c733cfe88899c51b054951bf619b01f1f37 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sun, 28 Mar 2021 08:05:15 +0200 Subject: [PATCH 688/911] Only login to snapcraft when secret is available in goreleaser workflow --- .github/workflows/goreleaser.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index e865c5a..8940d0d 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -8,26 +8,26 @@ jobs: goreleaser: runs-on: ubuntu-latest steps: - - - name: Checkout + - name: Checkout uses: actions/checkout@v2 with: fetch-depth: 0 - - - name: Set up Go + - name: Set up Go uses: actions/setup-go@v2 with: go-version: ~1.16 - - - name: Set up Snapcraft - env: - SNAPCRAFT_LOGIN: ${{ secrets.SNAPCRAFT_LOGIN }} + - name: Set up Snapcraft run: | sudo apt-get update sudo apt-get -yq --no-install-suggests --no-install-recommends install snapcraft - snapcraft login --with <(echo "$SNAPCRAFT_LOGIN") - - - name: Run GoReleaser + mkdir -p $HOME/.cache/snapcraft/download + mkdir -p $HOME/.cache/snapcraft/stage-packages + - name: Login Snapcraft + env: + SNAPCRAFT_LOGIN: ${{ secrets.SNAPCRAFT_LOGIN }} + if: env.SNAPCRAFT_LOGIN != null + run: snapcraft login --with <(echo "$SNAPCRAFT_LOGIN") + - name: Run GoReleaser uses: goreleaser/goreleaser-action@v2 with: version: latest From 92b86072a49dbe0d0e0539a75035c9ae660bf7d0 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 3 Apr 2021 01:47:38 +0200 Subject: [PATCH 689/911] Bump termenv to v0.8.1 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index b7e6c74..46ad71f 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/muesli/gitcha v0.2.0 github.com/muesli/go-app-paths v0.2.1 github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68 - github.com/muesli/termenv v0.8.0 + github.com/muesli/termenv v0.8.1 github.com/sahilm/fuzzy v0.1.0 github.com/segmentio/ksuid v1.0.3 github.com/spf13/cobra v1.1.3 diff --git a/go.sum b/go.sum index 27c528d..433a434 100644 --- a/go.sum +++ b/go.sum @@ -206,8 +206,9 @@ github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9 github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= github.com/muesli/termenv v0.7.4/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= -github.com/muesli/termenv v0.8.0 h1:HxhDOZbpf9nSUhOiMUNk5jsL3XaKWAbHucoGYZf+nag= github.com/muesli/termenv v0.8.0/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0= +github.com/muesli/termenv v0.8.1 h1:9q230czSP3DHVpkaPDXGp0TOfAwyjyYwXlUCQxQSaBk= +github.com/muesli/termenv v0.8.1/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= From 4863f57cea794c62b6667b9d6aec478e9a49080c Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 8 Apr 2021 16:31:00 +0200 Subject: [PATCH 690/911] Bump bubbletea, glamour, and go-runewidth deps --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 46ad71f..7cfb24c 100644 --- a/go.mod +++ b/go.mod @@ -4,13 +4,13 @@ go 1.13 require ( github.com/charmbracelet/bubbles v0.7.6 - github.com/charmbracelet/bubbletea v0.13.1 + github.com/charmbracelet/bubbletea v0.13.2 github.com/charmbracelet/charm v0.8.6 - github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400 + github.com/charmbracelet/glamour v0.2.1-0.20210402234443-abe9cda419ba github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/google/uuid v1.1.2 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/mattn/go-runewidth v0.0.10 + github.com/mattn/go-runewidth v0.0.12 github.com/meowgorithm/babyenv v1.3.1 github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.2.0 diff --git a/go.sum b/go.sum index 433a434..55f8f83 100644 --- a/go.sum +++ b/go.sum @@ -45,12 +45,12 @@ github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGim github.com/charmbracelet/bubbles v0.7.6 h1:SCAp4ZEUf2tBNEsufo+Xxxu2dvbFhYSDPrX45toQZrM= github.com/charmbracelet/bubbles v0.7.6/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZSG46SFauoZj22s= github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= -github.com/charmbracelet/bubbletea v0.13.1 h1:huvX8mPaeMZ8DLulT50iEWRF+iitY5FNEDqDVLu69nM= -github.com/charmbracelet/bubbletea v0.13.1/go.mod h1:tp9tr9Dadh0PLhgiwchE5zZJXm5543JYjHG9oY+5qSg= +github.com/charmbracelet/bubbletea v0.13.2 h1:fSOx3q0/VbA3ChWeiNcUsNeNysD9FFWD1tZypShBuCQ= +github.com/charmbracelet/bubbletea v0.13.2/go.mod h1:okqaA5VF0aSpEZ2HB+L/cxVw2HthIDZ1dmWoRZs8/4g= github.com/charmbracelet/charm v0.8.6 h1:/U6rxGj4J6zZ1Ex8+wTr4hNMr4ESBzNZbC1UyrJPVbg= github.com/charmbracelet/charm v0.8.6/go.mod h1:8dE3uX+TYSpa7Q6e/CmjN6WSd7koSAKNQTGWugFREx4= -github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400 h1:vj8zwTsLNE37zzcmkkBsG+HBtniUtLdQe6J206C+i30= -github.com/charmbracelet/glamour v0.2.1-0.20210311152407-2b8307dcb400/go.mod h1:VO5pQW96Vj3qJy9ikwb5Zo8lcvt2ZDFoE3UXl+SduQs= +github.com/charmbracelet/glamour v0.2.1-0.20210402234443-abe9cda419ba h1:smKYYwwVPZyMK2LCirIi2WY25tZZW0IU7GYe1ASGCe4= +github.com/charmbracelet/glamour v0.2.1-0.20210402234443-abe9cda419ba/go.mod h1:nHP5wEbsv2eOJ7XfiScQV3p5dpZSM051R0VkxnOIPgg= github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -171,8 +171,9 @@ github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHX github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/meowgorithm/babyenv v1.3.1 h1:18ZEYIgbzoFQfRLF9+lxjRfk/ui6w8U0FWl07CgWvvc= @@ -206,7 +207,6 @@ github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9 github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= github.com/muesli/termenv v0.7.4/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= -github.com/muesli/termenv v0.8.0/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0= github.com/muesli/termenv v0.8.1 h1:9q230czSP3DHVpkaPDXGp0TOfAwyjyYwXlUCQxQSaBk= github.com/muesli/termenv v0.8.1/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= From 1f2b3671c715f4a84d8103f617ee35d821fb347b Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Thu, 29 Apr 2021 15:11:55 +0200 Subject: [PATCH 691/911] Use golang.org/x/term The golang.org/x/crypto/ssh/terminal package is deprecated and merely a wrapper around golang.org/x/term. Use the latter directly and avoid a direct dependency on the former. --- go.mod | 4 ++-- main.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 7cfb24c..b0ca2af 100644 --- a/go.mod +++ b/go.mod @@ -21,9 +21,9 @@ require ( github.com/segmentio/ksuid v1.0.3 github.com/spf13/cobra v1.1.3 github.com/spf13/viper v1.7.1 - golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad + golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 - golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect + golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf golang.org/x/text v0.3.2 ) diff --git a/main.go b/main.go index 44fd333..b36d902 100644 --- a/main.go +++ b/main.go @@ -16,7 +16,7 @@ import ( gap "github.com/muesli/go-app-paths" "github.com/spf13/cobra" "github.com/spf13/viper" - "golang.org/x/crypto/ssh/terminal" + "golang.org/x/term" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm/ui/common" @@ -153,7 +153,7 @@ func validateOptions(cmd *cobra.Command) error { } } - isTerminal := terminal.IsTerminal(int(os.Stdout.Fd())) + isTerminal := term.IsTerminal(int(os.Stdout.Fd())) // We want to use a special no-TTY style, when stdout is not a terminal // and there was no specific style passed by arg if !isTerminal && !cmd.Flags().Changed("style") { @@ -162,7 +162,7 @@ func validateOptions(cmd *cobra.Command) error { // Detect terminal width if isTerminal && width == 0 && !cmd.Flags().Changed("width") { - w, _, err := terminal.GetSize(int(os.Stdout.Fd())) + w, _, err := term.GetSize(int(os.Stdout.Fd())) if err == nil { width = uint(w) } From 442333d77c5bedc3695e5c1b4150ac2b3728fbbc Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 18 May 2021 20:54:34 +0200 Subject: [PATCH 692/911] Fix goreportcard badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7edbca1..5343368 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Render markdown on the CLI, with _pizzazz_! Latest Release GoDoc Build Status - Go ReportCard + Go ReportCard

From 24fc70e56bfab3872e008cf6e1560a3041aef0b4 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 18 May 2021 16:53:03 -0400 Subject: [PATCH 693/911] Update date in LICENSE --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index beda40d..2e0a4da 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Charmbracelet, Inc +Copyright (c) 2019-2021 Charmbracelet, Inc Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From d0737b41af48960a341e24327d9d5acb5b7d92aa Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 18 May 2021 16:53:12 -0400 Subject: [PATCH 694/911] Update README footer per the newer Charm repos --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5343368..cf9e43d 100644 --- a/README.md +++ b/README.md @@ -204,9 +204,11 @@ machine and not our server, so we never see any unencrypted data. [MIT](https://github.com/charmbracelet/glow/raw/master/LICENSE) +* * * + Part of [Charm](https://charm.sh). The Charm logo -Charm热爱开源! / Charm loves open source! +Charm热爱开源 • Charm loves open source From adfc2b1c2a39b381d55fff652dce52a342c30f53 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 4 Jun 2021 11:55:45 +0200 Subject: [PATCH 695/911] Update linter config --- .golangci.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index d4530e4..85cfb6d 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -2,6 +2,13 @@ run: tests: false issues: + include: + - EXC0001 + - EXC0005 + - EXC0011 + - EXC0012 + - EXC0013 + max-issues-per-linter: 0 max-same-issues: 0 @@ -14,12 +21,12 @@ linters: - godot - godox - goimports - - golint - - gomnd - goprintffuncname - gosec + - ifshort - misspell - prealloc + - revive - rowserrcheck - sqlclosecheck - unconvert From 8fc9a300a4494bd6f9dc0255f638c42163a168a4 Mon Sep 17 00:00:00 2001 From: Sebastian Cohnen Date: Sat, 14 Aug 2021 08:35:51 +0200 Subject: [PATCH 696/911] Update README.md adds macOS to the list of releases that are available for ARM --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf9e43d..79160f0 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ pkg install glow Or download a binary from the [releases][releases] page. MacOS, Linux, Windows, FreeBSD, and OpenBSD binaries are available, as well as Debian, RPM, and Alpine -packages. ARM builds are also available for Linux, FreeBSD, and OpenBSD. +packages. ARM builds are also available for macOS, Linux, FreeBSD, and OpenBSD. Or just build it yourself (requires Go 1.13+): From 8138788b0a24428e4950d0f0beb280650a9a896e Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Thu, 21 Oct 2021 10:40:37 -0400 Subject: [PATCH 697/911] Automatically read from stdin if stdin is a pipe --- main.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/main.go b/main.go index b36d902..47424e4 100644 --- a/main.go +++ b/main.go @@ -177,12 +177,33 @@ func validateOptions(cmd *cobra.Command) error { return nil } +func stdinIsPipe() (bool, error) { + stat, err := os.Stdin.Stat() + if err != nil { + return false, err + } + if stat.Mode()&os.ModeCharDevice == 0 || stat.Size() > 0 { + return true, nil + } + return false, nil +} + func execute(cmd *cobra.Command, args []string) error { initConfig() if err := validateOptions(cmd); err != nil { return err } + // if stdin is a pipe then use stdin for input. note that you can also + // explicitly use a - to read from stdin. + if yes, err := stdinIsPipe(); err != nil { + return err + } else if yes { + src := &source{reader: os.Stdin} + defer src.reader.Close() + return executeCLI(cmd, src, os.Stdout) + } + switch len(args) { // TUI running on cwd @@ -221,6 +242,10 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { return err } defer src.reader.Close() + return executeCLI(cmd, src, w) +} + +func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { b, err := ioutil.ReadAll(src.reader) if err != nil { return err From a8a1b98c7384ff0b06035a71cb0cd32327fdee95 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 24 Jan 2022 01:53:57 +0100 Subject: [PATCH 698/911] glow is now in the community repo and can directly be installed with pacman --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 79160f0..f59d9fe 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ brew install glow sudo port install glow # Arch Linux (btw) -yay -S glow +pacman -S glow # Void Linux xbps-install -S glow From b36e5ad810b6ef9ee3b32869d2af5d7ce461c2fc Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Mon, 24 Jan 2022 17:11:42 -0500 Subject: [PATCH 699/911] feat: sync glow with git.charm.sh --- .github/workflows/soft-serve.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/workflows/soft-serve.yml diff --git a/.github/workflows/soft-serve.yml b/.github/workflows/soft-serve.yml new file mode 100644 index 0000000..8eb3221 --- /dev/null +++ b/.github/workflows/soft-serve.yml @@ -0,0 +1,12 @@ +name: soft-serve + +on: + push: + branches: + - master + +jobs: + soft-serve: + uses: charmbracelet/meta/.github/workflows/soft-serve.yml@main + secrets: + ssh-key: "${{ secrets.CHARM_SOFT_SERVE_KEY }}" From c75609322fc5c684b75bb9aef1d409013a33c47e Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Thu, 26 May 2022 16:35:24 -0300 Subject: [PATCH 700/911] feat(deps): update cobra and viper (#346) Signed-off-by: Carlos A Becker --- go.mod | 4 +- go.sum | 177 ++------------------------------------------------------- 2 files changed, 8 insertions(+), 173 deletions(-) diff --git a/go.mod b/go.mod index b0ca2af..1a1c576 100644 --- a/go.mod +++ b/go.mod @@ -19,8 +19,8 @@ require ( github.com/muesli/termenv v0.8.1 github.com/sahilm/fuzzy v0.1.0 github.com/segmentio/ksuid v1.0.3 - github.com/spf13/cobra v1.1.3 - github.com/spf13/viper v1.7.1 + github.com/spf13/cobra v1.4.0 + github.com/spf13/viper v1.4.0 golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 diff --git a/go.sum b/go.sum index 55f8f83..b2779fd 100644 --- a/go.sum +++ b/go.sum @@ -1,19 +1,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= @@ -26,18 +13,13 @@ github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkx github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY= github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -58,12 +40,11 @@ github.com/containerd/console v1.0.1 h1:u7SFAJyRqWcG6ogaMAx3KjSTy1e3hT9QxqX7Jco7 github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -76,11 +57,9 @@ github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac h1:opbrjaN/L8gg6Xh5D04Tem+8xVcz6ajZlGCs49mQgyg= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -90,62 +69,25 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -161,12 +103,9 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+ github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -180,21 +119,12 @@ github.com/meowgorithm/babyenv v1.3.1 h1:18ZEYIgbzoFQfRLF9+lxjRfk/ui6w8U0FWl07Cg github.com/meowgorithm/babyenv v1.3.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg= github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a h1:eU8j/ClY2Ty3qdHnn0TyW3ivFoPC/0F1gQZz8yTxbbE= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/muesli/gitcha v0.2.0 h1:+wOgT2dI9s2Tznj1t1rb/qkK5e0cb6qD8c4IX2TR/YY= github.com/muesli/gitcha v0.2.0/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= @@ -213,7 +143,6 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -222,7 +151,6 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -236,24 +164,18 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/ksuid v1.0.3 h1:FoResxvleQwYiPAVKe1tMUlEirodZqlqglIuFsdDntY= github.com/segmentio/ksuid v1.0.3/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= @@ -261,25 +183,21 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= -github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= @@ -290,78 +208,37 @@ github.com/yuin/goldmark v1.3.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark-emoji v1.0.1 h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os= github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc h1:zK/HqS5bZxDptfPJNq8v7vJfXtkU7r9TLIoSr1bXaP4= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -377,69 +254,27 @@ golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXR golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= From 84b2e5bc42b982ba0bdfc6f3b6cbbe1321ba7a93 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Fri, 8 Jul 2022 12:06:55 -0400 Subject: [PATCH 701/911] docs: add apt/yum repos to readme --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index f59d9fe..aa256d3 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,18 @@ scoop install glow # Android (with termux) pkg install glow + +# Debian/Ubuntu +echo 'deb [trusted=yes] https://repo.charm.sh/apt/ /' | sudo tee /etc/apt/sources.list.d/charm.list +sudo apt update && sudo apt install glow + +# Fedora +echo '[charm] +name=Charm +baseurl=https://repo.charm.sh/yum/ +enabled=1 +gpgcheck=0' | sudo tee /etc/yum.repos.d/charm.repo +sudo yum install glow ``` Or download a binary from the [releases][releases] page. MacOS, Linux, Windows, From 01d9858f7c77c1b806d1968fbcf4781cb279bdc2 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Fri, 8 Jul 2022 15:30:10 -0300 Subject: [PATCH 702/911] fix: goreleaser workflow (#358) Signed-off-by: Carlos A Becker --- .goreleaser.yml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 04f31e0..56423d2 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -7,21 +7,26 @@ before: builds: - binary: glow - ldflags: -s -w -X main.Version={{ .Version }} -X main.CommitSHA={{ .Commit }} + ldflags: -s -w -X main.Version=v{{ .Version }} -X main.CommitSHA={{ .Commit }} -X main.CommitDate={{ .CommitDate }} goos: - linux - - freebsd - - openbsd - darwin - windows + - freebsd + - openbsd + - netbsd goarch: - amd64 - arm64 - - 386 + - "386" - arm goarm: - - 6 - - 7 + - "7" + ignore: + - goos: windows + goarch: arm64 + - goos: windows + goarm: "7" archives: - From e0789536674a25eeced8a12bd2fa17a1b6ef01a1 Mon Sep 17 00:00:00 2001 From: tploss Date: Tue, 12 Jul 2022 10:07:47 +0200 Subject: [PATCH 703/911] Remove exit message As already discussed in https://github.com/charmbracelet/glow/issues/329 the exit message can be a bit irritating, especially when integrating glow into scripts/etc. PR https://github.com/charmbracelet/glow/pull/331 did more than just remove the exit message but was since closed by the requestor. --- main.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/main.go b/main.go index 47424e4..5c605b2 100644 --- a/main.go +++ b/main.go @@ -353,8 +353,6 @@ func runTUI(workingDirectory string, stashedOnly bool) error { return err } - // Exit message - fmt.Printf("\n Thanks for using Glow!\n\n") return nil } From 7f810bfc9f5d570bfb4e0d79fe884a6d2f9ca0f4 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 10 Sep 2022 04:26:52 +0200 Subject: [PATCH 704/911] docs: add Chocolatey install instructions to README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index aa256d3..63af95c 100644 --- a/README.md +++ b/README.md @@ -53,8 +53,9 @@ pkg install glow # Solus eopkg install glow -# Windows (with Scoop) +# Windows (with Scoop or Chocolatey) scoop install glow +choco install glow # Android (with termux) pkg install glow From e0d667a48c914ef517fdf35d07ae2ab8bdcb7959 Mon Sep 17 00:00:00 2001 From: Christopher Murphy Date: Thu, 15 Sep 2022 17:41:28 -0600 Subject: [PATCH 705/911] fix: use filepath.Dir instead of path.Dir Use the `filepath` implementation of `Dir` instead of `path`. Resolve path resolution with Windows paths containing `\\` separators. --- config_cmd.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config_cmd.go b/config_cmd.go index a90b903..22c3825 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -6,6 +6,7 @@ import ( "os" "os/exec" "path" + "path/filepath" "github.com/charmbracelet/charm/ui/common" gap "github.com/muesli/go-app-paths" @@ -53,7 +54,7 @@ var configCmd = &cobra.Command{ if _, err := os.Stat(configFile); os.IsNotExist(err) { // File doesn't exist yet, create all necessary directories and // write the default config file - if err := os.MkdirAll(path.Dir(configFile), 0700); err != nil { + if err := os.MkdirAll(filepath.Dir(configFile), 0700); err != nil { return err } From 3607b402a6d0c8f0cf75ca73b2c99bdc4ce586a3 Mon Sep 17 00:00:00 2001 From: Jon Austin Date: Sat, 24 Sep 2022 17:47:35 -0700 Subject: [PATCH 706/911] docs: streamline install instructions (#308) * update to mimic the melt readme Add a note to just use `go install` for installation. --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 63af95c..02443a4 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ More on that below. ## Installation -Use your fave package manager: +### Package Manager ```bash # macOS or Linux @@ -77,7 +77,14 @@ Or download a binary from the [releases][releases] page. MacOS, Linux, Windows, FreeBSD, and OpenBSD binaries are available, as well as Debian, RPM, and Alpine packages. ARM builds are also available for macOS, Linux, FreeBSD, and OpenBSD. -Or just build it yourself (requires Go 1.13+): +### Go + +Or just install it with `go`: +```bash +go install github.com/charmbracelet/glow@latest +``` + +### Build (requires Go 1.13+) ```bash git clone https://github.com/charmbracelet/glow.git From 1237ee6bf0b297e6bf16080656560084db84eb37 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 6 Oct 2022 17:20:42 -0400 Subject: [PATCH 707/911] docs: update apt/yum installation instructions --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 02443a4..a15f995 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,8 @@ choco install glow pkg install glow # Debian/Ubuntu -echo 'deb [trusted=yes] https://repo.charm.sh/apt/ /' | sudo tee /etc/apt/sources.list.d/charm.list +echo "deb https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list +curl https://repo.charm.sh/apt/gpg.key | sudo apt-key add - sudo apt update && sudo apt install glow # Fedora @@ -69,7 +70,8 @@ echo '[charm] name=Charm baseurl=https://repo.charm.sh/yum/ enabled=1 -gpgcheck=0' | sudo tee /etc/yum.repos.d/charm.repo +gpgcheck=1 +gpgkey=https://repo.charm.sh/yum/gpg.key' | sudo tee /etc/yum.repos.d/charm.repo sudo yum install glow ``` From 580642af8b1b9f1bfb5e9b6a38ed95b33a8a4640 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Mon, 17 Oct 2022 16:48:40 -0400 Subject: [PATCH 708/911] docs: apt-key deprecation Use the recommended keyrings path /etc/apt/keyrings Per: https://manpages.debian.org/unstable/apt/apt-key.8.en.html#DEPRECATION --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a15f995..8bb15b5 100644 --- a/README.md +++ b/README.md @@ -61,11 +61,12 @@ choco install glow pkg install glow # Debian/Ubuntu -echo "deb https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list -curl https://repo.charm.sh/apt/gpg.key | sudo apt-key add - +sudo mkdir -p /etc/apt/keyrings +curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg +echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list sudo apt update && sudo apt install glow -# Fedora +# Fedora/RHEL echo '[charm] name=Charm baseurl=https://repo.charm.sh/yum/ From 1e8666011bc8ae134a6a238aedea4cdf2af9fa21 Mon Sep 17 00:00:00 2001 From: Carlos A Becker Date: Tue, 25 Oct 2022 11:07:35 -0300 Subject: [PATCH 709/911] docs: fix missing commas Signed-off-by: Carlos A Becker --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8bb15b5..9985d73 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Glow is a terminal based markdown reader designed from the ground up to bring out the beauty—and power—of the CLI. Use it to discover markdown files, read documentation directly on the command -line and stash markdown files to your own private collection so you can read +line and stash markdown files to your own private collection, so you can read them anywhere. Glow will find local markdown files in subdirectories or a local Git repository. @@ -77,8 +77,8 @@ sudo yum install glow ``` Or download a binary from the [releases][releases] page. MacOS, Linux, Windows, -FreeBSD, and OpenBSD binaries are available, as well as Debian, RPM, and Alpine -packages. ARM builds are also available for macOS, Linux, FreeBSD, and OpenBSD. +FreeBSD and OpenBSD binaries are available, as well as Debian, RPM, and Alpine +packages. ARM builds are also available for macOS, Linux, FreeBSD and OpenBSD. ### Go From 5e24b49e3e90673269c6968cf0b4efbaa83a213e Mon Sep 17 00:00:00 2001 From: Carlos A Becker Date: Tue, 25 Oct 2022 14:59:44 -0300 Subject: [PATCH 710/911] chore: dependabot Signed-off-by: Carlos A Becker --- .github/dependabot.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..d0b49cd --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,22 @@ +version: 2 +updates: + - package-ecosystem: "gomod" + directory: "/" + schedule: + interval: "daily" + time: "08:00" + labels: + - "dependencies" + commit-message: + prefix: "feat" + include: "scope" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + time: "08:00" + labels: + - "dependencies" + commit-message: + prefix: "chore" + include: "scope" From 7486c604d7f5d619e982b657807a6ae818b8d911 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Oct 2022 15:00:48 -0300 Subject: [PATCH 711/911] chore(deps): bump actions/checkout from 2 to 3 (#400) Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- .github/workflows/coverage.yml | 2 +- .github/workflows/goreleaser.yml | 2 +- .github/workflows/lint.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b0c9f68..81c4353 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,7 +16,7 @@ jobs: go-version: ${{ matrix.go-version }} - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Download Go modules run: go mod download diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 01c10d2..09c963b 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -17,7 +17,7 @@ jobs: go-version: ${{ matrix.go-version }} - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Coverage env: diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index 8940d0d..d119516 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 - name: Set up Go diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 6249b5b..ea4b007 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,7 +8,7 @@ jobs: name: lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: golangci-lint uses: golangci/golangci-lint-action@v2 with: From 06f85dda9aab50a801d2d61bf6e86455d4def9e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Oct 2022 15:01:12 -0300 Subject: [PATCH 712/911] chore(deps): bump golangci/golangci-lint-action from 2 to 3 (#401) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 2 to 3. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v2...v3) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ea4b007..d0bb996 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: golangci-lint - uses: golangci/golangci-lint-action@v2 + uses: golangci/golangci-lint-action@v3 with: # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 From 8eede63988a9e5857a7c727a7d9e9a6812570075 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Oct 2022 15:01:26 -0300 Subject: [PATCH 713/911] chore(deps): bump goreleaser/goreleaser-action from 2 to 3 (#402) Bumps [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action) from 2 to 3. - [Release notes](https://github.com/goreleaser/goreleaser-action/releases) - [Commits](https://github.com/goreleaser/goreleaser-action/compare/v2...v3) --- updated-dependencies: - dependency-name: goreleaser/goreleaser-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/goreleaser.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index d119516..4eb942f 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -28,7 +28,7 @@ jobs: if: env.SNAPCRAFT_LOGIN != null run: snapcraft login --with <(echo "$SNAPCRAFT_LOGIN") - name: Run GoReleaser - uses: goreleaser/goreleaser-action@v2 + uses: goreleaser/goreleaser-action@v3 with: version: latest args: release --snapshot --skip-publish --skip-sign --rm-dist From 74b70644bafe332f2fbc810f5fbfa652024f8298 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Oct 2022 15:01:50 -0300 Subject: [PATCH 714/911] chore(deps): bump actions/setup-go from 2 to 3 (#405) Bumps [actions/setup-go](https://github.com/actions/setup-go) from 2 to 3. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- .github/workflows/coverage.yml | 2 +- .github/workflows/goreleaser.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 81c4353..546ea3e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,7 @@ jobs: GO111MODULE: "on" steps: - name: Install Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: ${{ matrix.go-version }} diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 09c963b..bcc6721 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -12,7 +12,7 @@ jobs: GO111MODULE: "on" steps: - name: Install Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: ${{ matrix.go-version }} diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index 4eb942f..9c0bd0b 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -13,7 +13,7 @@ jobs: with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: ~1.16 - name: Set up Snapcraft From 44b078e44a45e79f88bb0d904ba4ea05eb278104 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 25 Oct 2022 20:26:53 +0200 Subject: [PATCH 715/911] docs: new readme footer (#396) --- README.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9985d73..fbe46b2 100644 --- a/README.md +++ b/README.md @@ -223,15 +223,22 @@ machine and not our server, so we never see any unencrypted data. [charmlib]: https://github.com/charmbracelet/charm +## Feedback + +We’d love to hear your thoughts on this project. Feel free to drop us a note! + +* [Twitter](https://twitter.com/charmcli) +* [The Fediverse](https://mastodon.social/@charmcli) +* [Discord](https://charm.sh/chat) + ## License [MIT](https://github.com/charmbracelet/glow/raw/master/LICENSE) -* * * +*** Part of [Charm](https://charm.sh). -The Charm logo +The Charm logo Charm热爱开源 • Charm loves open source - From 5f14914b7e698523145ee4a5031201f394947b0e Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 25 Oct 2022 15:35:12 -0300 Subject: [PATCH 716/911] fix: editor with args (#364) * fix: editor with args Signed-off-by: Carlos A Becker * Update config_cmd.go Signed-off-by: Carlos A Becker --- config_cmd.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/config_cmd.go b/config_cmd.go index 22c3825..8ec0c4b 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -6,6 +6,7 @@ import ( "os" "os/exec" "path" + "strings" "path/filepath" "github.com/charmbracelet/charm/ui/common" @@ -32,8 +33,8 @@ var configCmd = &cobra.Command{ Example: formatBlock("glow config\nglow config --config path/to/config.yml"), Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { - editor := os.Getenv("EDITOR") - if editor == "" { + editor := strings.Fields(os.Getenv("EDITOR")) + if len(editor) == 0 { return errors.New("no EDITOR environment variable set") } @@ -48,7 +49,7 @@ var configCmd = &cobra.Command{ } if ext := path.Ext(configFile); ext != ".yaml" && ext != ".yml" { - return fmt.Errorf("'%s' is not a supported config type: use '%s' or '%s'\n", ext, ".yaml", ".yml") + return fmt.Errorf("'%s' is not a supported config type: use '%s' or '%s'", ext, ".yaml", ".yml") } if _, err := os.Stat(configFile); os.IsNotExist(err) { @@ -62,7 +63,7 @@ var configCmd = &cobra.Command{ if err != nil { return err } - defer f.Close() + defer func() { _ = f.Close() }() if _, err := f.WriteString(defaultConfig); err != nil { return err @@ -71,7 +72,11 @@ var configCmd = &cobra.Command{ return err } - c := exec.Command(editor, configFile) + var eargs []string + if len(editor) > 1 { + eargs = editor[1:] + } + c := exec.Command(editor[0], append(eargs, configFile)...) // nolint: gosec c.Stdin = os.Stdin c.Stdout = os.Stdout c.Stderr = os.Stderr From dec59a219902fca8fdf460ff7ed513132e9941d4 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Wed, 26 Oct 2022 15:05:52 -0400 Subject: [PATCH 717/911] feat(ci): use config files from meta repo (#389) * chore: bump cobra & viper * feat(ci): use config files from meta repo * publish docker images * generate shell completions * generate man pages * feat(ci): use shared workflows from meta repo --- .github/workflows/build.yml | 32 +- .github/workflows/goreleaser.yml | 43 +- .gitignore | 2 + .goreleaser.yml | 110 +---- Dockerfile | 3 + go.mod | 13 +- go.sum | 803 +++++++++++++++++++++++++++++-- 7 files changed, 819 insertions(+), 187 deletions(-) create mode 100644 Dockerfile diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 546ea3e..20a7a22 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,28 +1,12 @@ name: build + on: [push, pull_request] + jobs: - test: - strategy: - matrix: - go-version: [~1.13, ^1] - os: [ubuntu-latest, macos-latest, windows-latest] - runs-on: ${{ matrix.os }} - env: - GO111MODULE: "on" - steps: - - name: Install Go - uses: actions/setup-go@v3 - with: - go-version: ${{ matrix.go-version }} + build: + uses: charmbracelet/meta/.github/workflows/build.yml@main - - name: Checkout code - uses: actions/checkout@v3 - - - name: Download Go modules - run: go mod download - - - name: Build - run: go build -v ./... - - - name: Test - run: go test ./... + snapshot: + uses: charmbracelet/meta/.github/workflows/snapshot.yml@main + secrets: + goreleaser_key: ${{ secrets.GORELEASER_KEY }} diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index 9c0bd0b..cbe25e8 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -1,34 +1,23 @@ name: goreleaser on: - pull_request: push: + tags: + - v*.*.* + +concurrency: + group: goreleaser + cancel-in-progress: true jobs: goreleaser: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Set up Go - uses: actions/setup-go@v3 - with: - go-version: ~1.16 - - name: Set up Snapcraft - run: | - sudo apt-get update - sudo apt-get -yq --no-install-suggests --no-install-recommends install snapcraft - mkdir -p $HOME/.cache/snapcraft/download - mkdir -p $HOME/.cache/snapcraft/stage-packages - - name: Login Snapcraft - env: - SNAPCRAFT_LOGIN: ${{ secrets.SNAPCRAFT_LOGIN }} - if: env.SNAPCRAFT_LOGIN != null - run: snapcraft login --with <(echo "$SNAPCRAFT_LOGIN") - - name: Run GoReleaser - uses: goreleaser/goreleaser-action@v3 - with: - version: latest - args: release --snapshot --skip-publish --skip-sign --rm-dist + uses: charmbracelet/meta/.github/workflows/goreleaser.yml@main + secrets: + docker_username: ${{ secrets.DOCKERHUB_USERNAME }} + docker_token: ${{ secrets.DOCKERHUB_TOKEN }} + gh_pat: ${{ secrets.PERSONAL_ACCESS_TOKEN }} + goreleaser_key: ${{ secrets.GORELEASER_KEY }} + fury_token: ${{ secrets.FURY_TOKEN }} + nfpm_gpg_key: ${{ secrets.NFPM_GPG_KEY }} + nfpm_passphrase: ${{ secrets.NFPM_PASSPHRASE }} + snapcraft_token: ${{ secrets.SNAPCRAFT_TOKEN }} diff --git a/.gitignore b/.gitignore index d3003c1..a9d459b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ glow dist/ .envrc +completions/ +manpages/ \ No newline at end of file diff --git a/.goreleaser.yml b/.goreleaser.yml index 56423d2..469279a 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -1,100 +1,12 @@ -env: - - GO111MODULE=on - - CGO_ENABLED=0 -before: - hooks: - - go mod tidy -builds: - - - binary: glow - ldflags: -s -w -X main.Version=v{{ .Version }} -X main.CommitSHA={{ .Commit }} -X main.CommitDate={{ .CommitDate }} - goos: - - linux - - darwin - - windows - - freebsd - - openbsd - - netbsd - goarch: - - amd64 - - arm64 - - "386" - - arm - goarm: - - "7" - ignore: - - goos: windows - goarch: arm64 - - goos: windows - goarm: "7" +includes: + - from_url: + url: charmbracelet/meta/main/goreleaser-glow.yaml -archives: - - - builds: - - glow - format_overrides: - - goos: windows - format: zip - replacements: - windows: Windows - darwin: Darwin - 386: i386 - amd64: x86_64 - -nfpms: - - - vendor: charmbracelet - homepage: "https://charm.sh/" - maintainer: "Christian Muehlhaeuser " - description: "Render markdown on the CLI" - license: MIT - formats: - - apk - - deb - - rpm - bindir: /usr/bin - -brews: - - goarm: 6 - tap: - owner: charmbracelet - name: homebrew-tap - commit_author: - name: "Christian Muehlhaeuser" - email: "muesli@gmail.com" - homepage: "https://charm.sh/" - description: "Render markdown on the CLI" - # skip_upload: true - -snapcrafts: - - - name: glow - publish: true - summary: Render markdown on the CLI, with pizzazz! - description: | - Glow is a terminal based markdown reader designed from the ground up to bring out the beauty—and power—of the CLI. - Use it to discover markdown files, read documentation directly on the command line and stash markdown files to your own private collection so you can read them anywhere. Glow will find local markdown files in subdirectories or a local Git repository. - By the way, all data stashed is encrypted end-to-end: only you can decrypt it. More on that below. - - grade: stable - confinement: strict - license: MIT - base: core20 - - apps: - glow: - plugs: ["home", "network"] - -signs: - - artifacts: checksum - -checksum: - name_template: "checksums.txt" -snapshot: - name_template: "{{ .Tag }}-next" -changelog: - sort: asc - filters: - exclude: - - "^docs:" - - "^test:" +variables: + main: "." + binary_name: glow + description: "Render markdown on the CLI, with pizzazz! 💅🏻" + github_url: "https://github.com/charmbracelet/soft-serve" + maintainer: "Christian Muehlhaeuser " + brew_commit_author_name: "Christian Muehlhaeuser" + brew_commit_author_email: "muesli@charm.sh" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8719b4e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,3 @@ +FROM gcr.io/distroless/static +COPY glow /usr/local/bin/glow +ENTRYPOINT [ "/usr/local/bin/glow" ] diff --git a/go.mod b/go.mod index 1a1c576..2310aea 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,6 @@ require ( github.com/charmbracelet/charm v0.8.6 github.com/charmbracelet/glamour v0.2.1-0.20210402234443-abe9cda419ba github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac - github.com/google/uuid v1.1.2 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/mattn/go-runewidth v0.0.12 github.com/meowgorithm/babyenv v1.3.1 @@ -19,11 +18,9 @@ require ( github.com/muesli/termenv v0.8.1 github.com/sahilm/fuzzy v0.1.0 github.com/segmentio/ksuid v1.0.3 - github.com/spf13/cobra v1.4.0 - github.com/spf13/viper v1.4.0 - golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect - golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect - golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 - golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf - golang.org/x/text v0.3.2 + github.com/spf13/cobra v1.5.0 + github.com/spf13/viper v1.13.0 + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 + golang.org/x/text v0.3.7 ) diff --git a/go.sum b/go.sum index b2779fd..2142522 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,62 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= @@ -12,17 +68,30 @@ github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY= github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGimk1BE6cmHijOkM= github.com/charmbracelet/bubbles v0.7.6 h1:SCAp4ZEUf2tBNEsufo+Xxxu2dvbFhYSDPrX45toQZrM= github.com/charmbracelet/bubbles v0.7.6/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZSG46SFauoZj22s= @@ -35,16 +104,33 @@ github.com/charmbracelet/glamour v0.2.1-0.20210402234443-abe9cda419ba h1:smKYYww github.com/charmbracelet/glamour v0.2.1-0.20210402234443-abe9cda419ba/go.mod h1:nHP5wEbsv2eOJ7XfiScQV3p5dpZSM051R0VkxnOIPgg= github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/containerd/console v1.0.1 h1:u7SFAJyRqWcG6ogaMAx3KjSTy1e3hT9QxqX7Jco7dRc= github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -55,59 +141,211 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac h1:opbrjaN/L8gg6Xh5D04Tem+8xVcz6ajZlGCs49mQgyg= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= @@ -119,12 +357,24 @@ github.com/meowgorithm/babyenv v1.3.1 h1:18ZEYIgbzoFQfRLF9+lxjRfk/ui6w8U0FWl07Cg github.com/meowgorithm/babyenv v1.3.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg= github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a h1:eU8j/ClY2Ty3qdHnn0TyW3ivFoPC/0F1gQZz8yTxbbE= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/muesli/gitcha v0.2.0 h1:+wOgT2dI9s2Tznj1t1rb/qkK5e0cb6qD8c4IX2TR/YY= github.com/muesli/gitcha v0.2.0/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= @@ -140,141 +390,636 @@ github.com/muesli/termenv v0.7.4/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotC github.com/muesli/termenv v0.8.1 h1:9q230czSP3DHVpkaPDXGp0TOfAwyjyYwXlUCQxQSaBk= github.com/muesli/termenv v0.8.1/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/ksuid v1.0.3 h1:FoResxvleQwYiPAVKe1tMUlEirodZqlqglIuFsdDntY= github.com/segmentio/ksuid v1.0.3/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.1 h1:eVwehsLsZlCJCwXyGLgg+Q4iFWE/eTIMG0e8waCmm/I= github.com/yuin/goldmark v1.3.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.3.5 h1:dPmz1Snjq0kmkz159iL7S6WzdahUTHnHB5M56WFVifs= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark-emoji v1.0.1 h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os= github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc h1:zK/HqS5bZxDptfPJNq8v7vJfXtkU7r9TLIoSr1bXaP4= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 h1:nVuTkr9L6Bq62qpUqKo/RnZCFfzDBL0bYo6w9OJUqZY= -golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= -golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From d2870afb3d9aa0c8100dae976f601c1306ffb0a1 Mon Sep 17 00:00:00 2001 From: Carlos A Becker Date: Tue, 25 Oct 2022 11:09:41 -0300 Subject: [PATCH 718/911] chore: go 1.16 Signed-off-by: Carlos A Becker --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 2310aea..e4b9fb0 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/charmbracelet/glow -go 1.13 +go 1.16 require ( github.com/charmbracelet/bubbles v0.7.6 From 9c9b3e6087221bef885601ce61c60939cab85b18 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 14 Jun 2021 16:52:00 -0400 Subject: [PATCH 719/911] Bump Bubble Tea, Bubbles, Glamour, Lip Gloss, and Termenv and do related updates This update also removes any usage of the charm/common package Co-authored-by: Christian Rocha Signed-off-by: Carlos A Becker --- config_cmd.go | 5 +- formatting.go | 15 ------ go.mod | 16 +++---- go.sum | 88 +++++++++++++++++++---------------- main.go | 22 +++------ stash_cmd.go | 11 ++--- style.go | 16 +++++++ ui/config.go | 1 + ui/pager.go | 104 +++++++++++++++++++++++++++++------------ ui/stash.go | 54 +++++++++++++--------- ui/stashhelp.go | 3 +- ui/stashitem.go | 23 +++++----- ui/styles.go | 120 ++++++++++++++++++++++++++++-------------------- ui/ui.go | 63 +++++++++++++------------ 14 files changed, 311 insertions(+), 230 deletions(-) delete mode 100644 formatting.go create mode 100644 style.go diff --git a/config_cmd.go b/config_cmd.go index 8ec0c4b..9601ea6 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -9,7 +9,6 @@ import ( "strings" "path/filepath" - "github.com/charmbracelet/charm/ui/common" gap "github.com/muesli/go-app-paths" "github.com/spf13/cobra" ) @@ -29,8 +28,8 @@ var configCmd = &cobra.Command{ Use: "config", Hidden: false, Short: "Edit the glow config file", - Long: formatBlock(fmt.Sprintf("\n%s the glow config file. We’ll use EDITOR to determine which editor to use. If the config file doesn't exist, it will be created.", common.Keyword("Edit"))), - Example: formatBlock("glow config\nglow config --config path/to/config.yml"), + Long: paragraph(fmt.Sprintf("\n%s the glow config file. We’ll use EDITOR to determine which editor to use. If the config file doesn't exist, it will be created.", keyword("Edit"))), + Example: paragraph("glow config\nglow config --config path/to/config.yml"), Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { editor := strings.Fields(os.Getenv("EDITOR")) diff --git a/formatting.go b/formatting.go deleted file mode 100644 index 6e3dffa..0000000 --- a/formatting.go +++ /dev/null @@ -1,15 +0,0 @@ -package main - -import ( - "github.com/muesli/reflow/indent" - "github.com/muesli/reflow/wordwrap" -) - -const ( - wrapAt = 78 - indentAmount = 2 -) - -func formatBlock(s string) string { - return indent.String(wordwrap.String(s, wrapAt-indentAmount), indentAmount) -} diff --git a/go.mod b/go.mod index e4b9fb0..cbe7820 100644 --- a/go.mod +++ b/go.mod @@ -3,24 +3,24 @@ module github.com/charmbracelet/glow go 1.16 require ( - github.com/charmbracelet/bubbles v0.7.6 - github.com/charmbracelet/bubbletea v0.13.2 + github.com/charmbracelet/bubbles v0.14.0 + github.com/charmbracelet/bubbletea v0.23.0 github.com/charmbracelet/charm v0.8.6 - github.com/charmbracelet/glamour v0.2.1-0.20210402234443-abe9cda419ba + github.com/charmbracelet/glamour v0.6.0 + github.com/charmbracelet/lipgloss v0.6.0 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac - github.com/kylelemons/godebug v1.1.0 // indirect - github.com/mattn/go-runewidth v0.0.12 + github.com/mattn/go-runewidth v0.0.14 github.com/meowgorithm/babyenv v1.3.1 github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.2.0 github.com/muesli/go-app-paths v0.2.1 - github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68 - github.com/muesli/termenv v0.8.1 + github.com/muesli/reflow v0.3.0 + github.com/muesli/termenv v0.13.0 github.com/sahilm/fuzzy v0.1.0 github.com/segmentio/ksuid v1.0.3 github.com/spf13/cobra v1.5.0 github.com/spf13/viper v1.13.0 - golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 golang.org/x/text v0.3.7 ) diff --git a/go.sum b/go.sum index 2142522..0d36d23 100644 --- a/go.sum +++ b/go.sum @@ -58,15 +58,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= -github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= -github.com/alecthomas/chroma v0.8.2 h1:x3zkuE2lUk/RIekyAJ3XRqSCP4zwWDfcw/YJCuCAACg= -github.com/alecthomas/chroma v0.8.2/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= -github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo= -github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= -github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= -github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= -github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= +github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= +github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -79,8 +72,11 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY= github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aymanbagabas/go-osc52 v1.0.3 h1:DTwqENW7X9arYimJrPeGZcV0ln14sGMt3pHZspWD+Mg= +github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -93,17 +89,20 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGimk1BE6cmHijOkM= -github.com/charmbracelet/bubbles v0.7.6 h1:SCAp4ZEUf2tBNEsufo+Xxxu2dvbFhYSDPrX45toQZrM= -github.com/charmbracelet/bubbles v0.7.6/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZSG46SFauoZj22s= +github.com/charmbracelet/bubbles v0.14.0 h1:DJfCwnARfWjZLvMglhSQzo76UZ2gucuHPy9jLWX45Og= +github.com/charmbracelet/bubbles v0.14.0/go.mod h1:bbeTiXwPww4M031aGi8UK2HT9RDWoiNibae+1yCMtcc= github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= -github.com/charmbracelet/bubbletea v0.13.2 h1:fSOx3q0/VbA3ChWeiNcUsNeNysD9FFWD1tZypShBuCQ= -github.com/charmbracelet/bubbletea v0.13.2/go.mod h1:okqaA5VF0aSpEZ2HB+L/cxVw2HthIDZ1dmWoRZs8/4g= +github.com/charmbracelet/bubbletea v0.21.0/go.mod h1:GgmJMec61d08zXsOhqRC/AiOx4K4pmz+VIcRIm1FKr4= +github.com/charmbracelet/bubbletea v0.23.0 h1:oGChhsNcm7kltiTdjxJbVlyh93N5fycluO7MsA2JEeg= +github.com/charmbracelet/bubbletea v0.23.0/go.mod h1:JAfGK/3/pPKHTnAS8JIE2u9f61BjWTQY57RbT25aMXU= github.com/charmbracelet/charm v0.8.6 h1:/U6rxGj4J6zZ1Ex8+wTr4hNMr4ESBzNZbC1UyrJPVbg= github.com/charmbracelet/charm v0.8.6/go.mod h1:8dE3uX+TYSpa7Q6e/CmjN6WSd7koSAKNQTGWugFREx4= -github.com/charmbracelet/glamour v0.2.1-0.20210402234443-abe9cda419ba h1:smKYYwwVPZyMK2LCirIi2WY25tZZW0IU7GYe1ASGCe4= -github.com/charmbracelet/glamour v0.2.1-0.20210402234443-abe9cda419ba/go.mod h1:nHP5wEbsv2eOJ7XfiScQV3p5dpZSM051R0VkxnOIPgg= -github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= -github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE= +github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc= +github.com/charmbracelet/glamour v0.6.0/go.mod h1:taqWV4swIMMbWALc0m7AfE9JkPSU8om2538k9ITBxOc= +github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= +github.com/charmbracelet/lipgloss v0.5.0/go.mod h1:EZLha/HbzEt7cYqdFPovlqy5FZPj0xFhg5SaqxScmgs= +github.com/charmbracelet/lipgloss v0.6.0 h1:1StyZB9vBSOyuZxQUcUwGr17JmojPNm87inij9N3wJY= +github.com/charmbracelet/lipgloss v0.6.0/go.mod h1:tHh2wr34xcHjC2HCXIlGSG1jaDF0S0atAUvBMP6Ppuk= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -119,8 +118,9 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/containerd/console v1.0.1 h1:u7SFAJyRqWcG6ogaMAx3KjSTy1e3hT9QxqX7Jco7dRc= github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -131,16 +131,14 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= -github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= -github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= +github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac h1:opbrjaN/L8gg6Xh5D04Tem+8xVcz6ajZlGCs49mQgyg= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -344,19 +342,24 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= +github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/meowgorithm/babyenv v1.3.1 h1:18ZEYIgbzoFQfRLF9+lxjRfk/ui6w8U0FWl07CgWvvc= github.com/meowgorithm/babyenv v1.3.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= -github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg= -github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= +github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg= +github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a h1:eU8j/ClY2Ty3qdHnn0TyW3ivFoPC/0F1gQZz8yTxbbE= @@ -375,20 +378,27 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34= +github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= +github.com/muesli/cancelreader v0.2.0/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/gitcha v0.2.0 h1:+wOgT2dI9s2Tznj1t1rb/qkK5e0cb6qD8c4IX2TR/YY= github.com/muesli/gitcha v0.2.0/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= -github.com/muesli/reflow v0.2.0/go.mod h1:qT22vjVmM9MIUeLgsVYe/Ye7eZlbv9dZjL3dVhUqLX8= -github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68 h1:y1p/ycavWjGT9FnmSjdbWUlLGvcxrY0Rw3ATltrxOhk= github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= +github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= +github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= github.com/muesli/termenv v0.7.4/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= -github.com/muesli/termenv v0.8.1 h1:9q230czSP3DHVpkaPDXGp0TOfAwyjyYwXlUCQxQSaBk= -github.com/muesli/termenv v0.8.1/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0= +github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= +github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= +github.com/muesli/termenv v0.13.0 h1:wK20DRpJdDX8b7Ek2QfhvqhRQFZ237RGRO0RQ/Iqdy0= +github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -403,7 +413,6 @@ github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwb github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -452,8 +461,6 @@ github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/ksuid v1.0.3 h1:FoResxvleQwYiPAVKe1tMUlEirodZqlqglIuFsdDntY= github.com/segmentio/ksuid v1.0.3/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= -github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -502,9 +509,9 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.3.5 h1:dPmz1Snjq0kmkz159iL7S6WzdahUTHnHB5M56WFVifs= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.5.2 h1:ALmeCk/px5FSm1MAcFBAsVKZjDuMVj8Tm7FFIlMJnqU= +github.com/yuin/goldmark v1.5.2/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark-emoji v1.0.1 h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os= github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -623,8 +630,9 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20221002022538-bcab6841153b h1:6e93nYa3hNqAvLr0pD4PN1fFS+gKzp2zAXqrnTCstqU= +golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -690,7 +698,6 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -734,13 +741,16 @@ golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/main.go b/main.go index 5c605b2..2e42ade 100644 --- a/main.go +++ b/main.go @@ -12,17 +12,15 @@ import ( "path/filepath" "strings" + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/glamour" + "github.com/charmbracelet/glow/ui" + "github.com/charmbracelet/glow/utils" "github.com/meowgorithm/babyenv" gap "github.com/muesli/go-app-paths" "github.com/spf13/cobra" "github.com/spf13/viper" "golang.org/x/term" - - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/charm/ui/common" - "github.com/charmbracelet/glamour" - "github.com/charmbracelet/glow/ui" - "github.com/charmbracelet/glow/utils" ) var ( @@ -41,7 +39,7 @@ var ( rootCmd = &cobra.Command{ Use: "glow [SOURCE|DIR]", Short: "Render markdown on the CLI, with pizzazz!", - Long: formatBlock(fmt.Sprintf("\nRender markdown on the CLI, %s!", common.Keyword("with pizzazz"))), + Long: paragraph(fmt.Sprintf("\nRender markdown on the CLI, %s!", keyword("with pizzazz"))), SilenceErrors: false, SilenceUsage: false, TraverseChildren: true, @@ -334,6 +332,7 @@ func runTUI(workingDirectory string, stashedOnly bool) error { cfg.ShowAllFiles = showAllFiles cfg.GlamourMaxWidth = width cfg.GlamourStyle = style + cfg.EnableMouse = mouse if stashedOnly { cfg.DocumentTypes.Add(ui.StashedDoc, ui.NewsDoc) @@ -342,14 +341,7 @@ func runTUI(workingDirectory string, stashedOnly bool) error { } // Run Bubble Tea program - p := ui.NewProgram(cfg) - p.EnterAltScreen() - defer p.ExitAltScreen() - if mouse { - p.EnableMouseCellMotion() - defer p.DisableMouseCellMotion() - } - if err := p.Start(); err != nil { + if _, err := ui.NewProgram(cfg).Run(); err != nil { return err } diff --git a/stash_cmd.go b/stash_cmd.go index e6b3ea4..f4bcdcb 100644 --- a/stash_cmd.go +++ b/stash_cmd.go @@ -9,20 +9,20 @@ import ( "strings" "github.com/charmbracelet/charm" - "github.com/charmbracelet/charm/ui/common" - "github.com/muesli/termenv" + "github.com/charmbracelet/lipgloss" "github.com/spf13/cobra" ) var ( memo string + dot = lipgloss.NewStyle().Foreground(lipgloss.Color("#04B575")).Render("•") stashCmd = &cobra.Command{ Use: "stash [SOURCE]", Hidden: false, Short: "Stash a markdown", - Long: formatBlock(fmt.Sprintf("\nDo %s stuff. Run with no arguments to browse your stash or pass a path to a markdown file to stash it.", common.Keyword("stash"))), - Example: formatBlock("glow stash\nglow stash README.md\nglow stash -m \"secret notes\" path/to/notes.md"), + Long: paragraph(fmt.Sprintf("\nDo %s stuff. Run with no arguments to browse your stash or pass a path to a markdown file to stash it.", keyword("stash"))), + Example: paragraph("glow stash\nglow stash README.md\nglow stash -m \"secret notes\" path/to/notes.md"), Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { initConfig() @@ -53,7 +53,6 @@ var ( return fmt.Errorf("error stashing markdown") } - dot := termenv.String("•").Foreground(common.Green.Color()).String() fmt.Println(dot + " Stashed!") return nil }, @@ -73,7 +72,7 @@ func initCharmClient() *charm.Client { cfg := getCharmConfig() cc, err := charm.NewClient(cfg) if err == charm.ErrMissingSSHAuth { - fmt.Println(formatBlock("We had some trouble authenticating via SSH. If this continues to happen the Charm tool may be able to help you. More info at https://github.com/charmbracelet/charm.")) + fmt.Println(paragraph("We had some trouble authenticating via SSH. If this continues to happen the Charm tool may be able to help you. More info at https://github.com/charmbracelet/charm.")) os.Exit(1) } else if err != nil { fmt.Println(err) diff --git a/style.go b/style.go new file mode 100644 index 0000000..7737dd2 --- /dev/null +++ b/style.go @@ -0,0 +1,16 @@ +package main + +import ( + . "github.com/charmbracelet/lipgloss" +) + +var ( + keyword = NewStyle(). + Foreground(AdaptiveColor{Light: "#04B575", Dark: "#04B575"}). + Render + + paragraph = NewStyle(). + Width(78). + Padding(0, 0, 0, 2). + Render +) diff --git a/ui/config.go b/ui/config.go index 67d94d6..b046795 100644 --- a/ui/config.go +++ b/ui/config.go @@ -7,6 +7,7 @@ type Config struct { HomeDir string `env:"HOME"` GlamourMaxWidth uint GlamourStyle string + EnableMouse bool // Which directory should we start from? WorkingDirectory string diff --git a/ui/pager.go b/ui/pager.go index 7f43019..ff3dcd6 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -12,12 +12,11 @@ import ( "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" - lib "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glamour" + "github.com/charmbracelet/lipgloss" runewidth "github.com/mattn/go-runewidth" "github.com/muesli/reflow/ansi" "github.com/muesli/reflow/truncate" - te "github.com/muesli/termenv" ) const statusBarHeight = 1 @@ -25,27 +24,78 @@ const statusBarHeight = 1 var ( pagerHelpHeight int - mintGreen = lib.NewColorPair("#89F0CB", "#89F0CB") - darkGreen = lib.NewColorPair("#1C8760", "#1C8760") + mintGreen = lipgloss.AdaptiveColor{Light: "#89F0CB", Dark: "#89F0CB"} + darkGreen = lipgloss.AdaptiveColor{Light: "#1C8760", Dark: "#1C8760"} - noteHeading = te.String(" Set Memo "). - Foreground(lib.Cream.Color()). - Background(lib.Green.Color()). - String() + noteHeading = lipgloss.NewStyle(). + Foreground(cream). + Background(green). + Padding(0, 1). + Render("Set Memo") - statusBarNoteFg = lib.NewColorPair("#7D7D7D", "#656565") - statusBarBg = lib.NewColorPair("#242424", "#E6E6E6") + statusBarNoteFg = lipgloss.AdaptiveColor{Light: "#656565", Dark: "#7D7D7D"} + statusBarBg = lipgloss.AdaptiveColor{Light: "#E6E6E6", Dark: "#242424"} - // Styling funcs. - statusBarScrollPosStyle = newStyle(lib.NewColorPair("#5A5A5A", "#949494"), statusBarBg, false) - statusBarNoteStyle = newStyle(statusBarNoteFg, statusBarBg, false) - statusBarHelpStyle = newStyle(statusBarNoteFg, lib.NewColorPair("#323232", "#DCDCDC"), false) - statusBarStashDotStyle = newStyle(lib.Green, statusBarBg, false) - statusBarMessageStyle = newStyle(mintGreen, darkGreen, false) - statusBarMessageStashIconStyle = newStyle(mintGreen, darkGreen, false) - statusBarMessageScrollPosStyle = newStyle(mintGreen, darkGreen, false) - statusBarMessageHelpStyle = newStyle(lib.NewColorPair("#B6FFE4", "#B6FFE4"), lib.Green, false) - helpViewStyle = newStyle(statusBarNoteFg, lib.NewColorPair("#1B1B1B", "#f2f2f2"), false) + statusBarScrollPosStyle = lipgloss.NewStyle(). + Foreground(lipgloss.AdaptiveColor{Light: "#949494", Dark: "#5A5A5A"}). + Background(statusBarBg). + Render + + statusBarNoteStyle = lipgloss.NewStyle(). + Foreground(statusBarNoteFg). + Background(statusBarBg). + Render + + statusBarHelpStyle = lipgloss.NewStyle(). + Foreground(statusBarNoteFg). + Background(lipgloss.AdaptiveColor{Light: "#DCDCDC", Dark: "#323232"}). + Render + + statusBarStashDotStyle = lipgloss.NewStyle(). + Foreground(green). + Background(statusBarBg). + Render + + statusBarMessageStyle = lipgloss.NewStyle(). + Foreground(mintGreen). + Background(darkGreen). + Render + + statusBarMessageStashIconStyle = lipgloss.NewStyle(). + Foreground(mintGreen). + Background(darkGreen). + Render + + statusBarMessageScrollPosStyle = lipgloss.NewStyle(). + Foreground(mintGreen). + Background(darkGreen). + Render + + statusBarMessageHelpStyle = lipgloss.NewStyle(). + Foreground(lipgloss.Color("#B6FFE4")). + Background(green). + Render + + helpViewStyle = lipgloss.NewStyle(). + Foreground(statusBarNoteFg). + Background(lipgloss.AdaptiveColor{Light: "#f2f2f2", Dark: "#1B1B1B"}). + Render + + spinnerStyle = lipgloss.NewStyle(). + Foreground(statusBarNoteFg). + Background(statusBarBg) + + pagerNoteInputPromptStyle = lipgloss.NewStyle(). + Foreground(darkGray). + Background(yellowGreen). + Padding(0, 1) + + pagerNoteInputStyle = lipgloss.NewStyle(). + Foreground(darkGray). + Background(yellowGreen) + + pagerNoteInputCursorStyle = lipgloss.NewStyle(). + Foreground(fuschia) ) type contentRenderedMsg string @@ -89,20 +139,16 @@ func newPagerModel(common *commonModel) pagerModel { // Text input for notes/memos ti := textinput.NewModel() - ti.Prompt = te.String(" > "). - Foreground(lib.Color(darkGray)). - Background(lib.YellowGreen.Color()). - String() - ti.TextColor = darkGray - ti.BackgroundColor = lib.YellowGreen.String() - ti.CursorColor = lib.Fuschia.String() + ti.Prompt = " > " + ti.PromptStyle = pagerNoteInputPromptStyle + ti.TextStyle = pagerNoteInputStyle + ti.CursorStyle = pagerNoteInputCursorStyle ti.CharLimit = noteCharacterLimit ti.Focus() // Text input for search sp := spinner.NewModel() - sp.ForegroundColor = statusBarNoteFg.String() - sp.BackgroundColor = statusBarBg.String() + sp.Style = spinnerStyle sp.HideFor = time.Millisecond * 50 sp.MinimumLifetime = time.Millisecond * 180 diff --git a/ui/stash.go b/ui/stash.go index 6e85d58..5098581 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -14,10 +14,9 @@ import ( "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" - lib "github.com/charmbracelet/charm/ui/common" + "github.com/charmbracelet/lipgloss" "github.com/muesli/reflow/ansi" "github.com/muesli/reflow/truncate" - te "github.com/muesli/termenv" "github.com/sahilm/fuzzy" ) @@ -35,10 +34,23 @@ var ( ) var ( - stashTextInputPromptStyle styleFunc = newFgStyle(lib.YellowGreen) - dividerDot string = darkGrayFg(" • ") - dividerBar string = darkGrayFg(" │ ") - offlineHeaderNote string = darkGrayFg("(Offline)") + dividerDot = darkGrayFg(" • ") + dividerBar = darkGrayFg(" │ ") + offlineHeaderNote = darkGrayFg("(Offline)") + + logoStyle = lipgloss.NewStyle(). + Foreground(lipgloss.Color("#ECFD65")). + Background(fuschia). + Bold(true) + + stashSpinnerStyle = lipgloss.NewStyle(). + Foreground(gray) + stashInputPromptStyle = lipgloss.NewStyle(). + Foreground(yellowGreen). + MarginRight(1) + stashInputCursorStyle = lipgloss.NewStyle(). + Foreground(fuschia). + MarginRight(1) ) // MSG @@ -499,20 +511,22 @@ func (m *stashModel) moveCursorDown() { func newStashModel(common *commonModel) stashModel { sp := spinner.NewModel() sp.Spinner = spinner.Line - sp.ForegroundColor = lib.SpinnerColor.String() + sp.Style = stashSpinnerStyle sp.HideFor = time.Millisecond * 100 sp.MinimumLifetime = time.Millisecond * 180 sp.Start() ni := textinput.NewModel() - ni.Prompt = stashTextInputPromptStyle("Memo: ") - ni.CursorColor = lib.Fuschia.String() + ni.Prompt = "Memo:" + ni.PromptStyle = stashInputPromptStyle + ni.CursorStyle = stashInputCursorStyle ni.CharLimit = noteCharacterLimit ni.Focus() si := textinput.NewModel() - si.Prompt = stashTextInputPromptStyle("Find: ") - si.CursorColor = lib.Fuschia.String() + si.Prompt = "Find:" + si.PromptStyle = stashInputPromptStyle + si.CursorStyle = stashInputCursorStyle si.CharLimit = noteCharacterLimit si.Focus() @@ -1195,7 +1209,7 @@ func (m stashModel) view() string { // pointers in our model should be refactored away. var p paginator.Model = *(m.paginator()) p.Type = paginator.Arabic - pagination = lib.Subtle(p.View()) + pagination = paginationStyle.Render(p.View()) } // We could also look at m.stashFullyLoaded and add an indicator @@ -1218,11 +1232,7 @@ func (m stashModel) view() string { } func glowLogoView(text string) string { - return te.String(text). - Bold(). - Foreground(glowLogoTextColor). - Background(lib.Fuschia.Color()). - String() + return logoStyle.Render(text) } func (m stashModel) headerView() string { @@ -1258,9 +1268,9 @@ func (m stashModel) headerView() string { } if m.stashedOnly() { - return lib.Subtle("Can’t load stash") + maybeOffline + return subtleStyle.Render("Can’t load stash") + maybeOffline } - return lib.Subtle("No markdown files found") + maybeOffline + return subtleStyle.Render("No markdown files found") + maybeOffline } // Tabs @@ -1288,9 +1298,9 @@ func (m stashModel) headerView() string { } if m.sectionIndex == i && len(m.sections) > 1 { - s = selectedTabColor(s) + s = selectedTabStyle.Render(s) } else { - s = tabColor(s) + s = tabStyle.Render(s) } sections = append(sections, s) } @@ -1379,7 +1389,7 @@ func loadRemoteMarkdown(cc *charm.Client, md *markdown) tea.Cmd { newMD, err := fetchMarkdown(cc, md.ID, md.docType) if err != nil { if debug { - log.Printf("error loading %s markdown (ID %d, Note: '%s'): %v", md.docType, md.ID, md.Note, err) + log.Printf("error loading %s markdown (ID %s, Note: '%s'): %v", md.docType, md.ID, md.Note, err) } return markdownFetchFailedMsg{ err: err, diff --git a/ui/stashhelp.go b/ui/stashhelp.go index fea1fdf..a53dfca 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -4,7 +4,6 @@ import ( "fmt" "strings" - lib "github.com/charmbracelet/charm/ui/common" "github.com/muesli/reflow/ansi" ) @@ -195,7 +194,7 @@ func (m stashModel) miniHelpView(entries ...string) string { } var ( - truncationChar = lib.Subtle("…") + truncationChar = subtleStyle.Render("…") truncationWidth = ansi.PrintableRuneWidth(truncationChar) ) diff --git a/ui/stashitem.go b/ui/stashitem.go index 7c5005e..4389754 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -5,10 +5,9 @@ import ( "log" "strings" - lib "github.com/charmbracelet/charm/ui/common" + "github.com/charmbracelet/lipgloss" "github.com/muesli/reflow/ansi" "github.com/muesli/reflow/truncate" - "github.com/muesli/termenv" "github.com/sahilm/fuzzy" ) @@ -77,8 +76,8 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { icon = dullFuchsiaFg(icon) if m.currentSection().key == filterSection && m.filterState == filterApplied || singleFilteredItem { - s := termenv.Style{}.Foreground(lib.Fuschia.Color()) - title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) + s := lipgloss.NewStyle().Foreground(fuschia) + title = styleFilteredText(title, m.filterInput.Value(), s, s.Copy().Underline(true)) } else { title = fuchsiaFg(title) } @@ -100,8 +99,8 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { title = dimIndigoFg(title) date = dimSubtleIndigoFg(date) } else { - s := termenv.Style{}.Foreground(lib.Indigo.Color()) - title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) + s := lipgloss.NewStyle().Foreground(indigo) + title = styleFilteredText(title, m.filterInput.Value(), s, s.Copy().Underline(true)) date = subtleIndigoFg(date) } } else if isFiltering && m.filterInput.Value() == "" { @@ -117,8 +116,8 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { if title == noMemoTitle { title = brightGrayFg(title) } else { - s := termenv.Style{}.Foreground(lib.NewColorPair("#dddddd", "#1a1a1a").Color()) - title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) + s := lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "#1a1a1a", Dark: "#dddddd"}) + title = styleFilteredText(title, m.filterInput.Value(), s, s.Copy().Underline(true)) } date = brightGrayFg(date) } @@ -128,7 +127,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { fmt.Fprintf(b, "%s %s", gutter, date) } -func styleFilteredText(haystack, needles string, defaultStyle, matchedStyle termenv.Style) string { +func styleFilteredText(haystack, needles string, defaultStyle, matchedStyle lipgloss.Style) string { b := strings.Builder{} normalizedHay, err := normalize(haystack) @@ -138,7 +137,7 @@ func styleFilteredText(haystack, needles string, defaultStyle, matchedStyle term matches := fuzzy.Find(needles, []string{normalizedHay}) if len(matches) == 0 { - return defaultStyle.Styled(haystack) + return defaultStyle.Render(haystack) } m := matches[0] // only one match exists @@ -146,12 +145,12 @@ func styleFilteredText(haystack, needles string, defaultStyle, matchedStyle term styled := false for _, mi := range m.MatchedIndexes { if i == mi { - b.WriteString(matchedStyle.Styled(string(rune))) + b.WriteString(matchedStyle.Render(string(rune))) styled = true } } if !styled { - b.WriteString(defaultStyle.Styled(string(rune))) + b.WriteString(defaultStyle.Render(string(rune))) } } diff --git a/ui/styles.go b/ui/styles.go index ed527f4..fe7c0ff 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -1,63 +1,85 @@ package ui import ( - lib "github.com/charmbracelet/charm/ui/common" - te "github.com/muesli/termenv" + . "github.com/charmbracelet/lipgloss" ) -type styleFunc func(string) string +// Colors. +var ( + normal = AdaptiveColor{Light: "#1A1A1A", Dark: "#dddddd"} + normalDim = AdaptiveColor{Light: "#A49FA5", Dark: "#777777"} + gray = AdaptiveColor{Light: "#909090", Dark: "#626262"} + midGray = AdaptiveColor{Light: "#B2B2B2", Dark: "#4A4A4A"} + darkGray = AdaptiveColor{Light: "#DDDADA", Dark: "#3C3C3C"} + brightGray = AdaptiveColor{Light: "#847A85", Dark: "#979797"} + dimBrightGray = AdaptiveColor{Light: "#C2B8C2", Dark: "#4D4D4D"} + indigo = AdaptiveColor{Light: "#5A56E0", Dark: "#7571F9"} + dimIndigo = AdaptiveColor{Light: "#9498FF", Dark: "#494690"} + subtleIndigo = AdaptiveColor{Light: "#7D79F6", Dark: "#514DC1"} + dimSubtleIndigo = AdaptiveColor{Light: "#BBBDFF", Dark: "#383584"} + cream = AdaptiveColor{Light: "#FFFDF5", Dark: "#FFFDF5"} + yellowGreen = AdaptiveColor{Light: "#04B575", Dark: "#ECFD65"} + dullYellowGreen = AdaptiveColor{Light: "#6BCB94", Dark: "#9BA92F"} + fuschia = AdaptiveColor{Light: "#EE6FF8", Dark: "#EE6FF8"} + dimFuchsia = AdaptiveColor{Light: "#F1A8FF", Dark: "#99519E"} + dullFuchsia = AdaptiveColor{Dark: "#AD58B4", Light: "#F793FF"} + dimDullFuchsia = AdaptiveColor{Light: "#F6C9FF", Dark: "#6B3A6F"} + green = Color("#04B575") + red = AdaptiveColor{Light: "#FF4672", Dark: "#ED567A"} + faintRed = AdaptiveColor{Light: "#FF6F91", Dark: "#C74665"} -const ( - darkGray = "#333333" + semiDimGreen = AdaptiveColor{Light: "#35D79C", Dark: "#036B46"} + dimGreen = AdaptiveColor{Light: "#72D2B0", Dark: "#0B5137"} +) + +// Ulimately, we'll transition to named styles. +var ( + normalFg = NewStyle().Foreground(normal).Render + dimNormalFg = NewStyle().Foreground(normalDim).Render + + brightGrayFg = NewStyle().Foreground(brightGray).Render + dimBrightGrayFg = NewStyle().Foreground(dimBrightGray).Render + + grayFg = NewStyle().Foreground(gray).Render + midGrayFg = NewStyle().Foreground(midGray).Render + darkGrayFg = NewStyle().Foreground(darkGray).Render + + greenFg = NewStyle().Foreground(green).Render + semiDimGreenFg = NewStyle().Foreground(semiDimGreen).Render + dimGreenFg = NewStyle().Foreground(dimGreen).Render + + fuchsiaFg = NewStyle().Foreground(fuschia).Render + dimFuchsiaFg = NewStyle().Foreground(dimFuchsia).Render + + dullFuchsiaFg = NewStyle().Foreground(dullFuchsia).Render + dimDullFuchsiaFg = NewStyle().Foreground(dimDullFuchsia).Render + + indigoFg = NewStyle().Foreground(fuschia).Render + dimIndigoFg = NewStyle().Foreground(dimIndigo).Render + + subtleIndigoFg = NewStyle().Foreground(subtleIndigo).Render + dimSubtleIndigoFg = NewStyle().Foreground(dimSubtleIndigo).Render + + yellowFg = NewStyle().Foreground(yellowGreen).Render // renders light green on light backgrounds + dullYellowFg = NewStyle().Foreground(dullYellowGreen).Render // renders light green on light backgrounds + redFg = NewStyle().Foreground(red).Render + faintRedFg = NewStyle().Foreground(faintRed).Render ) var ( - normalFg = newFgStyle(lib.NewColorPair("#dddddd", "#1a1a1a")) - dimNormalFg = newFgStyle(lib.NewColorPair("#777777", "#A49FA5")) + tabStyle = NewStyle(). + Foreground(AdaptiveColor{Light: "#909090", Dark: "#626262"}) - brightGrayFg = newFgStyle(lib.NewColorPair("#979797", "#847A85")) - dimBrightGrayFg = newFgStyle(lib.NewColorPair("#4D4D4D", "#C2B8C2")) + selectedTabStyle = NewStyle(). + Foreground(AdaptiveColor{Light: "#333333", Dark: "#979797"}) - grayFg = newFgStyle(lib.NewColorPair("#626262", "#909090")) - midGrayFg = newFgStyle(lib.NewColorPair("#4A4A4A", "#B2B2B2")) - darkGrayFg = newFgStyle(lib.NewColorPair("#3C3C3C", "#DDDADA")) + errorTitleStyle = NewStyle(). + Foreground(cream). + Background(red). + Padding(0, 1) - greenFg = newFgStyle(lib.NewColorPair("#04B575", "#04B575")) - semiDimGreenFg = newFgStyle(lib.NewColorPair("#036B46", "#35D79C")) - dimGreenFg = newFgStyle(lib.NewColorPair("#0B5137", "#72D2B0")) + subtleStyle = NewStyle(). + Foreground(AdaptiveColor{Light: "#9B9B9B", Dark: "#5C5C5C"}) - fuchsiaFg = newFgStyle(lib.Fuschia) - dimFuchsiaFg = newFgStyle(lib.NewColorPair("#99519E", "#F1A8FF")) - - dullFuchsiaFg = newFgStyle(lib.NewColorPair("#AD58B4", "#F793FF")) - dimDullFuchsiaFg = newFgStyle(lib.NewColorPair("#6B3A6F", "#F6C9FF")) - - indigoFg = newFgStyle(lib.Indigo) - dimIndigoFg = newFgStyle(lib.NewColorPair("#494690", "#9498FF")) - - subtleIndigoFg = newFgStyle(lib.NewColorPair("#514DC1", "#7D79F6")) - dimSubtleIndigoFg = newFgStyle(lib.NewColorPair("#383584", "#BBBDFF")) - - yellowFg = newFgStyle(lib.YellowGreen) // renders light green on light backgrounds - dullYellowFg = newFgStyle(lib.NewColorPair("#9BA92F", "#6BCB94")) // renders light green on light backgrounds - redFg = newFgStyle(lib.Red) - faintRedFg = newFgStyle(lib.FaintRed) - - // Ultimately, we should transition to named styles - tabColor = newFgStyle(lib.NewColorPair("#626262", "#909090")) - selectedTabColor = newFgStyle(lib.NewColorPair("#979797", "#332F33")) + paginationStyle = subtleStyle.Copy() ) - -// Returns a termenv style with foreground and background options. -func newStyle(fg, bg lib.ColorPair, bold bool) func(string) string { - s := te.Style{}.Foreground(fg.Color()).Background(bg.Color()) - if bold { - s = s.Bold() - } - return s.Styled -} - -// Returns a new termenv style with background options only. -func newFgStyle(c lib.ColorPair) styleFunc { - return te.Style{}.Foreground(c.Color()).Styled -} diff --git a/ui/ui.go b/ui/ui.go index 5a15f7c..ce91ef5 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -14,8 +14,7 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/keygen" - "github.com/charmbracelet/charm/ui/common" - lib "github.com/charmbracelet/charm/ui/common" + "github.com/charmbracelet/charm/ui/keygen" "github.com/charmbracelet/glow/utils" "github.com/muesli/gitcha" te "github.com/muesli/termenv" @@ -29,8 +28,7 @@ const ( ) var ( - config Config - glowLogoTextColor = lib.Color("#ECFD65") + config Config markdownExtensions = []string{ "*.md", "*.mdown", "*.mkdn", "*.mkd", "*.markdown", @@ -53,33 +51,41 @@ func NewProgram(cfg Config) *tea.Program { debug = true } config = cfg - return tea.NewProgram(newModel(cfg)) + opts := []tea.ProgramOption{tea.WithAltScreen()} + if cfg.EnableMouse { + opts = append(opts, tea.WithMouseCellMotion()) + } + return tea.NewProgram(newModel(cfg), opts...) } type errMsg struct{ err error } func (e errMsg) Error() string { return e.err.Error() } -type newCharmClientMsg *charm.Client -type sshAuthErrMsg struct{} -type keygenFailedMsg struct{ err error } -type keygenSuccessMsg struct{} -type initLocalFileSearchMsg struct { - cwd string - ch chan gitcha.SearchResult -} -type foundLocalFileMsg gitcha.SearchResult -type localFileSearchFinished struct{} -type gotStashMsg []*charm.Markdown -type stashLoadErrMsg struct{ err error } -type gotNewsMsg []*charm.Markdown -type statusMessageTimeoutMsg applicationContext -type newsLoadErrMsg struct{ err error } -type stashSuccessMsg markdown -type stashFailMsg struct { - err error - markdown markdown -} +type ( + newCharmClientMsg *charm.Client + sshAuthErrMsg struct{} + keygenFailedMsg struct{ err error } + keygenSuccessMsg struct{} + initLocalFileSearchMsg struct { + cwd string + ch chan gitcha.SearchResult + } +) +type ( + foundLocalFileMsg gitcha.SearchResult + localFileSearchFinished struct{} + gotStashMsg []*charm.Markdown + stashLoadErrMsg struct{ err error } + gotNewsMsg []*charm.Markdown + statusMessageTimeoutMsg applicationContext + newsLoadErrMsg struct{ err error } + stashSuccessMsg markdown + stashFailMsg struct { + err error + markdown markdown + } +) // applicationContext indicates the area of the application something appies // to. Occasionally used as an argument to commands and messages. @@ -455,12 +461,9 @@ func errorView(err error, fatal bool) string { exitMsg += "return" } s := fmt.Sprintf("%s\n\n%v\n\n%s", - te.String(" ERROR "). - Foreground(lib.Cream.Color()). - Background(lib.Red.Color()). - String(), + errorTitleStyle.Render("ERROR"), err, - common.Subtle(exitMsg), + subtleStyle.Render(exitMsg), ) return "\n" + indent(s, 3) } From db7f49b445e38c4649e098be1b16f195cecd2c0c Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Sat, 29 Jan 2022 19:42:38 -0500 Subject: [PATCH 720/911] Bump Bubbles to v0.14.0, update accordingly, and simplify spinners * Re-implement spinner min/max lifetimes in pager * Remove generalized spin commands in favor of model-level commands * Update textinput, viewport, and spinner constructors --- ui/config.go | 2 +- ui/pager.go | 53 +++++++++++++++++++++++++++++++------------------ ui/stash.go | 53 ++++++++++++++++++++++--------------------------- ui/stashitem.go | 4 ++-- ui/ui.go | 13 ++++++++---- 5 files changed, 70 insertions(+), 55 deletions(-) diff --git a/ui/config.go b/ui/config.go index b046795..ef58c0e 100644 --- a/ui/config.go +++ b/ui/config.go @@ -7,7 +7,7 @@ type Config struct { HomeDir string `env:"HOME"` GlamourMaxWidth uint GlamourStyle string - EnableMouse bool + EnableMouse bool // Which directory should we start from? WorkingDirectory string diff --git a/ui/pager.go b/ui/pager.go index ff3dcd6..4b50820 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -117,7 +117,9 @@ type pagerModel struct { state pagerState showHelp bool textInput textinput.Model - spinner spinner.Model + + spinner spinner.Model + spinnerStart time.Time statusMessage string statusMessageTimer *time.Timer @@ -133,12 +135,12 @@ type pagerModel struct { func newPagerModel(common *commonModel) pagerModel { // Init viewport - vp := viewport.Model{} + vp := viewport.New(0, 0) vp.YPosition = 0 vp.HighPerformanceRendering = config.HighPerformancePager // Text input for notes/memos - ti := textinput.NewModel() + ti := textinput.New() ti.Prompt = " > " ti.PromptStyle = pagerNoteInputPromptStyle ti.TextStyle = pagerNoteInputStyle @@ -147,10 +149,8 @@ func newPagerModel(common *commonModel) pagerModel { ti.Focus() // Text input for search - sp := spinner.NewModel() + sp := spinner.New() sp.Style = spinnerStyle - sp.HideFor = time.Millisecond * 50 - sp.MinimumLifetime = time.Millisecond * 180 return pagerModel{ common: common, @@ -297,11 +297,11 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { // Stash a local document if m.state != pagerStateStashing && stashableDocTypes.Contains(md.docType) { m.state = pagerStateStashing - m.spinner.Start() + m.spinnerStart = time.Now() cmds = append( cmds, stashDocument(m.common.cc, md), - spinner.Tick, + m.spinner.Tick, ) } case "?": @@ -313,15 +313,19 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { } case spinner.TickMsg: - if m.state == pagerStateStashing || m.spinner.Visible() { - // If we're still stashing, or if the spinner still needs to - // finish, spin it along. - newSpinnerModel, cmd := m.spinner.Update(msg) - m.spinner = newSpinnerModel + spinnerMinTimeout := m.spinnerStart. + Add(spinnerVisibilityTimeout). + Add(spinnerMinLifetime) + + if m.state == pagerStateStashing || time.Now().Before(spinnerMinTimeout) { + // We're either still stashing or we haven't reached the spinner's + // full lifetime. In either case we need to spin the spinner + // irrespective of it's more fine-grained visibility rules. + var cmd tea.Cmd + m.spinner, cmd = m.spinner.Update(msg) cmds = append(cmds, cmd) - } else if m.state == pagerStateStashSuccess && !m.spinner.Visible() { - // If the spinner's finished and we haven't told the user the - // stash was successful, do that. + } else if m.state == pagerStateStashSuccess { + // Successful stash. Stop spinning and update accordingly. m.state = pagerStateBrowse m.currentDocument = *m.stashedDocument m.stashedDocument = nil @@ -346,7 +350,8 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { // message in the main update function where we're adding this stashed // item to the stash listing. m.state = pagerStateStashSuccess - if !m.spinner.Visible() { + + if !m.spinnerVisible() { // The spinner has finished spinning, so tell the user the stash // was successful. m.state = pagerStateBrowse @@ -378,6 +383,14 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { return m, tea.Batch(cmds...) } +// spinnerVisible returns whether or not the spinner should be drawn. +func (m pagerModel) spinnerVisible() bool { + windowStart := m.spinnerStart.Add(spinnerVisibilityTimeout) + windowEnd := windowStart.Add(spinnerMinLifetime) + now := time.Now() + return now.After(windowStart) && now.Before(windowEnd) +} + func (m pagerModel) View() string { var b strings.Builder fmt.Fprint(&b, m.viewport.View()+"\n") @@ -431,9 +444,11 @@ func (m pagerModel) statusBarView(b *strings.Builder) { // Status indicator; spinner or stash dot var statusIndicator string if m.state == pagerStateStashing || m.state == pagerStateStashSuccess { - if m.spinner.Visible() { - statusIndicator = statusBarNoteStyle(" ") + m.spinner.View() + var spinner string + if m.spinnerVisible() { + spinner = m.spinner.View() } + statusIndicator = statusBarNoteStyle(" ") + spinner } else if isStashed && showStatusMessage { statusIndicator = statusBarMessageStashIconStyle(" " + pagerStashIcon) } else if isStashed { diff --git a/ui/stash.go b/ui/stash.go index 5098581..2d0dfa3 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -29,7 +29,7 @@ const ( ) var ( - stashedStatusMessage = statusMessage{normalStatusMessage, "Stashed!"} + stashingStatusMessage = statusMessage{normalStatusMessage, "Stashing..."} alreadyStashedStatusMessage = statusMessage{subtleStatusMessage, "Already stashed"} ) @@ -253,6 +253,14 @@ func (m stashModel) online() bool { return !m.localOnly() && m.common.authStatus == authOK } +// Whether or not the spinner should be spinning. +func (m stashModel) shouldSpin() bool { + loading := !m.loadingDone() + stashing := m.common.isStashing() + openingDocument := m.viewState == stashStateLoadingDocument + return loading || stashing || openingDocument +} + func (m *stashModel) setSize(width, height int) { m.common.width = width m.common.height = height @@ -444,7 +452,7 @@ func (m *stashModel) openMarkdown(md *markdown) tea.Cmd { cmd = loadRemoteMarkdown(m.common.cc, md) } - return tea.Batch(cmd, spinner.Tick) + return tea.Batch(cmd, m.spinner.Tick) } func (m *stashModel) newStatusMessage(sm statusMessage) tea.Cmd { @@ -509,21 +517,18 @@ func (m *stashModel) moveCursorDown() { // INIT func newStashModel(common *commonModel) stashModel { - sp := spinner.NewModel() + sp := spinner.New() sp.Spinner = spinner.Line sp.Style = stashSpinnerStyle - sp.HideFor = time.Millisecond * 100 - sp.MinimumLifetime = time.Millisecond * 180 - sp.Start() - ni := textinput.NewModel() + ni := textinput.New() ni.Prompt = "Memo:" ni.PromptStyle = stashInputPromptStyle ni.CursorStyle = stashInputCursorStyle ni.CharLimit = noteCharacterLimit ni.Focus() - si := textinput.NewModel() + si := textinput.New() si.Prompt = "Find:" si.PromptStyle = stashInputPromptStyle si.CursorStyle = stashInputCursorStyle @@ -647,14 +652,9 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { return m, nil case spinner.TickMsg: - loading := !m.loadingDone() - stashing := m.common.isStashing() - openingDocument := m.viewState == stashStateLoadingDocument - spinnerVisible := m.spinner.Visible() - - if loading || stashing || openingDocument || spinnerVisible { - newSpinnerModel, cmd := m.spinner.Update(msg) - m.spinner = newSpinnerModel + if m.shouldSpin() { + var cmd tea.Cmd + m.spinner, cmd = m.spinner.Update(msg) cmds = append(cmds, cmd) } @@ -667,10 +667,9 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { } } - // Note: mechanical stuff related to stash success is handled in the parent - // update function. case stashSuccessMsg: - m.spinner.Finish() + // No-op: mechanical stuff related to stash success is handled in the + // parent update function. // Note: mechanical stuff related to stash failure is handled in the parent // update function. @@ -848,14 +847,13 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { break } - // Checks passed; perform the stash. Note that we optimistically - // show the status message. + // Checks passed; perform the stash. m.common.filesStashed[md.stashID] = struct{}{} m.common.filesStashing[md.stashID] = struct{}{} m.common.latestFileStashed = md.stashID cmds = append(cmds, stashDocument(m.common.cc, *md), - m.newStatusMessage(stashedStatusMessage), + m.newStatusMessage(stashingStatusMessage), ) // If we're stashing a filtered item, optimistically convert the @@ -870,12 +868,9 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // The spinner subtly shows the stash state in a non-optimistic // fashion, namely because it was originally implemented this way. - // If this stash succeeds quickly enough, the spinner won't run - // at all. - if m.loadingDone() && !m.spinner.Visible() { - m.spinner.Start() - cmds = append(cmds, spinner.Tick) - } + // Ideally, if this stash succeeds quickly enough, the spinner + // wouldn't run at all. + cmds = append(cmds, m.spinner.Tick) // Prompt for deletion case "x": @@ -1146,7 +1141,7 @@ func (m stashModel) view() string { case stashStateReady: loadingIndicator := " " - if !m.loadingDone() || m.spinner.Visible() { + if m.shouldSpin() { loadingIndicator = m.spinner.View() } diff --git a/ui/stashitem.go b/ui/stashitem.go index 4389754..0206364 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -66,7 +66,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { date = dullYellowFg(date) default: if m.common.latestFileStashed == md.stashID && - m.statusMessage == stashedStatusMessage { + m.statusMessage == stashingStatusMessage { gutter = greenFg(verticalLine) icon = dimGreenFg(icon) title = greenFg(title) @@ -90,7 +90,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { gutter = " " if m.common.latestFileStashed == md.stashID && - m.statusMessage == stashedStatusMessage { + m.statusMessage == stashingStatusMessage { icon = dimGreenFg(icon) title = greenFg(title) date = semiDimGreenFg(date) diff --git a/ui/ui.go b/ui/ui.go index ce91ef5..cef9885 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -10,7 +10,6 @@ import ( "strings" "time" - "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/keygen" @@ -25,6 +24,12 @@ const ( noteCharacterLimit = 256 // should match server statusMessageTimeout = time.Second * 2 // how long to show status messages like "stashed!" ellipsis = "…" + + // Only show the spinner if it spins for at least this amount of time. + spinnerVisibilityTimeout = time.Millisecond * 140 + + // Minimum amount of time the spinner should be visible once it starts. + spinnerMinLifetime = time.Millisecond * 550 ) var ( @@ -188,8 +193,8 @@ func (m *model) unloadDocument() []tea.Cmd { batch = append(batch, tea.ClearScrollArea) } - if !m.stash.loadingDone() { - batch = append(batch, spinner.Tick) + if !m.stash.shouldSpin() { + batch = append(batch, m.stash.spinner.Tick) } return batch } @@ -230,7 +235,7 @@ func (m model) Init() tea.Cmd { if d.Contains(StashedDoc) || d.Contains(NewsDoc) { cmds = append(cmds, newCharmClient, - spinner.Tick, + m.stash.spinner.Tick, ) } From 60d98a01e55f73c175de6e6068f96ba74b9dbeb9 Mon Sep 17 00:00:00 2001 From: Carlos A Becker Date: Tue, 25 Oct 2022 11:39:41 -0300 Subject: [PATCH 721/911] feat: bump deps --- go.mod | 12 +-- go.sum | 304 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 269 insertions(+), 47 deletions(-) diff --git a/go.mod b/go.mod index cbe7820..19157b2 100644 --- a/go.mod +++ b/go.mod @@ -13,14 +13,14 @@ require ( github.com/meowgorithm/babyenv v1.3.1 github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.2.0 - github.com/muesli/go-app-paths v0.2.1 + github.com/muesli/go-app-paths v0.2.2 github.com/muesli/reflow v0.3.0 github.com/muesli/termenv v0.13.0 github.com/sahilm/fuzzy v0.1.0 - github.com/segmentio/ksuid v1.0.3 - github.com/spf13/cobra v1.5.0 - github.com/spf13/viper v1.13.0 - golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab + github.com/segmentio/ksuid v1.0.4 + github.com/spf13/cobra v1.6.1 + github.com/spf13/viper v1.14.0 + golang.org/x/sys v0.0.0-20220908164124-27713097b956 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 - golang.org/x/text v0.3.7 + golang.org/x/text v0.4.0 ) diff --git a/go.sum b/go.sum index 0d36d23..6f325cc 100644 --- a/go.sum +++ b/go.sum @@ -29,30 +29,157 @@ cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/firestore v1.8.0/go.mod h1:r3KB8cAdRIe8znzoPWLw8S6gpDVd9treohhn8b09424= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -70,6 +197,7 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= @@ -79,6 +207,7 @@ github.com/aymanbagabas/go-osc52 v1.0.3 h1:DTwqENW7X9arYimJrPeGZcV0ln14sGMt3pHZs github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -158,8 +287,8 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -223,8 +352,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -248,8 +378,12 @@ github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -257,6 +391,9 @@ github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0 github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= @@ -265,25 +402,31 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmg github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/consul/api v1.15.3/go.mod h1:/g/qgcoBcEXALCNZgRRisyTW0nY86++L0KbeAMXYCeY= +github.com/hashicorp/consul/sdk v0.11.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= @@ -292,12 +435,14 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.8/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -318,6 +463,7 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -364,13 +510,14 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a h1:eU8j/ClY2Ty3qdHnn0TyW3ivFoPC/0F1gQZz8yTxbbE= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -385,8 +532,9 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/gitcha v0.2.0 h1:+wOgT2dI9s2Tznj1t1rb/qkK5e0cb6qD8c4IX2TR/YY= github.com/muesli/gitcha v0.2.0/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= -github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= +github.com/muesli/go-app-paths v0.2.2 h1:NqG4EEZwNIhBq/pREgfBmgDmt3h1Smr1MjZiXbpZUnI= +github.com/muesli/go-app-paths v0.2.2/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= @@ -453,14 +601,15 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= -github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= +github.com/sagikazarmark/crypt v0.8.0/go.mod h1:TmKwZAo97S4Fy4sfMH/HX/cQP5D+ijra2NyLpNNmttY= github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/segmentio/ksuid v1.0.3 h1:FoResxvleQwYiPAVKe1tMUlEirodZqlqglIuFsdDntY= -github.com/segmentio/ksuid v1.0.3/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= +github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c= +github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -468,14 +617,14 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -483,11 +632,12 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= -github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/spf13/viper v1.14.0 h1:Rg7d3Lo706X9tHsJMUjdiwMpHB7W8WnSVOssIY+JElU= +github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -496,8 +646,9 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -510,15 +661,16 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.5.2 h1:ALmeCk/px5FSm1MAcFBAsVKZjDuMVj8Tm7FFIlMJnqU= github.com/yuin/goldmark v1.5.2/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark-emoji v1.0.1 h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os= github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= -go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/v2 v2.305.5/go.mod h1:zQjKllfqfBVyVStbt4FaosoX2iYd8fV/GRy/PbowgP4= +go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -529,10 +681,14 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -544,9 +700,10 @@ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -582,6 +739,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -625,14 +783,20 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20221002022538-bcab6841153b h1:6e93nYa3hNqAvLr0pD4PN1fFS+gKzp2zAXqrnTCstqU= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b h1:tvrvnPFcdzp294diPnrdZZZ8XUt2Tyj7svb7X52iDuU= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -648,11 +812,15 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -664,7 +832,10 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -691,7 +862,6 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -736,7 +906,6 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -747,10 +916,16 @@ golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956 h1:XeJjHH1KiLpKGb6lvMiksZ9l0fVUh+AmGcm0nOMEBOY= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -762,11 +937,13 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -823,12 +1000,15 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -858,7 +1038,6 @@ google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6 google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= @@ -866,8 +1045,19 @@ google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/S google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -916,6 +1106,7 @@ google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -933,8 +1124,6 @@ google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= @@ -951,8 +1140,34 @@ google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -980,10 +1195,16 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -999,6 +1220,7 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 4dd3ba1d3c2b47a68b3ee4a7f30f97b0e5b18c78 Mon Sep 17 00:00:00 2001 From: Carlos A Becker Date: Tue, 25 Oct 2022 11:40:51 -0300 Subject: [PATCH 722/911] chore: fmt & lint issues --- .github/workflows/goreleaser.yml | 2 ++ .goreleaser.yml | 2 ++ config_cmd.go | 4 ++-- github.go | 2 ++ gitlab.go | 2 ++ main.go | 19 ++++++++------- stash_cmd.go | 6 ++--- style.go | 4 +--- ui/config.go | 4 ---- ui/consts_unix.go | 1 + ui/ignore_general.go | 1 + ui/keys.go | 6 +++++ ui/markdown.go | 3 +-- ui/pager.go | 19 ++++++++------- ui/stash.go | 40 ++++++++++++-------------------- ui/stashhelp.go | 8 +++---- ui/styles.go | 5 ++-- ui/ui.go | 12 ++++------ utils/utils.go | 1 + 19 files changed, 69 insertions(+), 72 deletions(-) create mode 100644 ui/keys.go diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index cbe25e8..1ccf980 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -21,3 +21,5 @@ jobs: nfpm_gpg_key: ${{ secrets.NFPM_GPG_KEY }} nfpm_passphrase: ${{ secrets.NFPM_PASSPHRASE }} snapcraft_token: ${{ secrets.SNAPCRAFT_TOKEN }} + +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json diff --git a/.goreleaser.yml b/.goreleaser.yml index 469279a..6f6fead 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -10,3 +10,5 @@ variables: maintainer: "Christian Muehlhaeuser " brew_commit_author_name: "Christian Muehlhaeuser" brew_commit_author_email: "muesli@charm.sh" + +# yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json diff --git a/config_cmd.go b/config_cmd.go index 9601ea6..6dfc835 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -6,8 +6,8 @@ import ( "os" "os/exec" "path" - "strings" "path/filepath" + "strings" gap "github.com/muesli/go-app-paths" "github.com/spf13/cobra" @@ -54,7 +54,7 @@ var configCmd = &cobra.Command{ if _, err := os.Stat(configFile); os.IsNotExist(err) { // File doesn't exist yet, create all necessary directories and // write the default config file - if err := os.MkdirAll(filepath.Dir(configFile), 0700); err != nil { + if err := os.MkdirAll(filepath.Dir(configFile), 0o700); err != nil { return err } diff --git a/github.go b/github.go index 7cf29bc..b824cf5 100644 --- a/github.go +++ b/github.go @@ -33,6 +33,8 @@ func findGitHubREADME(s string) (*source, error) { v := u v.Path += "/master/" + r + // nolint:bodyclose + // it is closed on the caller resp, err := http.Get(v.String()) if err != nil { return nil, err diff --git a/gitlab.go b/gitlab.go index 5ec89c7..e8c8a57 100644 --- a/gitlab.go +++ b/gitlab.go @@ -32,6 +32,8 @@ func findGitLabREADME(s string) (*source, error) { v := u v.Path += "/raw/master/" + r + // nolint:bodyclose + // it is closed on the caller resp, err := http.Get(v.String()) if err != nil { return nil, err diff --git a/main.go b/main.go index 2e42ade..bb7e60c 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net/http" "net/url" "os" @@ -24,7 +23,9 @@ import ( ) var ( - Version = "" + // Version as provided by goreleaser. + Version = "" + // CommitSHA as provided by goreleaser. CommitSHA = "" readmeNames = []string{"README.md", "README"} @@ -87,6 +88,7 @@ func sourceFromArg(arg string) (*source, error) { if err != nil { return nil, err } + defer resp.Body.Close() //nolint:errcheck if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("HTTP status %d", resp.StatusCode) } @@ -198,12 +200,11 @@ func execute(cmd *cobra.Command, args []string) error { return err } else if yes { src := &source{reader: os.Stdin} - defer src.reader.Close() + defer src.reader.Close() //nolint:errcheck return executeCLI(cmd, src, os.Stdout) } switch len(args) { - // TUI running on cwd case 0: return runTUI("", false) @@ -239,12 +240,12 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { if err != nil { return err } - defer src.reader.Close() + defer src.reader.Close() //nolint:errcheck return executeCLI(cmd, src, w) } func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { - b, err := ioutil.ReadAll(src.reader) + b, err := io.ReadAll(src.reader) if err != nil { return err } @@ -301,7 +302,7 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { } pa := strings.Split(pagerCmd, " ") - c := exec.Command(pa[0], pa[1:]...) + c := exec.Command(pa[0], pa[1:]...) // nolint:gosec c.Stdin = strings.NewReader(content) c.Stdout = os.Stdout return c.Run() @@ -324,7 +325,7 @@ func runTUI(workingDirectory string, stashedOnly bool) error { if err != nil { return err } - defer f.Close() + defer f.Close() //nolint:errcheck } cfg.WorkingDirectory = workingDirectory @@ -375,7 +376,7 @@ func init() { rootCmd.Flags().BoolVarP(&showAllFiles, "all", "a", false, "show system files and directories (TUI-mode only)") rootCmd.Flags().BoolVarP(&localOnly, "local", "l", false, "show local files only; no network (TUI-mode only)") rootCmd.Flags().BoolVarP(&mouse, "mouse", "m", false, "enable mouse wheel (TUI-mode only)") - rootCmd.Flags().MarkHidden("mouse") + _ = rootCmd.Flags().MarkHidden("mouse") // Config bindings _ = viper.BindPFlag("style", rootCmd.Flags().Lookup("style")) diff --git a/stash_cmd.go b/stash_cmd.go index f4bcdcb..efb8bbd 100644 --- a/stash_cmd.go +++ b/stash_cmd.go @@ -2,7 +2,7 @@ package main import ( "fmt" - "io/ioutil" + "io" "log" "os" "path" @@ -42,8 +42,8 @@ var ( return fmt.Errorf("bad filename") } - defer f.Close() - b, err := ioutil.ReadAll(f) + defer f.Close() //nolint:errcheck + b, err := io.ReadAll(f) if err != nil { return fmt.Errorf("error reading file") } diff --git a/style.go b/style.go index 7737dd2..366bbc4 100644 --- a/style.go +++ b/style.go @@ -1,8 +1,6 @@ package main -import ( - . "github.com/charmbracelet/lipgloss" -) +import . "github.com/charmbracelet/lipgloss" //nolint:revive var ( keyword = NewStyle(). diff --git a/ui/config.go b/ui/config.go index ef58c0e..9db2340 100644 --- a/ui/config.go +++ b/ui/config.go @@ -21,10 +21,6 @@ type Config struct { GlamourEnabled bool `env:"GLOW_ENABLE_GLAMOUR" default:"true"` } -func (c Config) showLocalFiles() bool { - return c.DocumentTypes.Contains(LocalDoc) -} - func (c Config) localOnly() bool { return c.DocumentTypes.Equals(NewDocTypeSet(LocalDoc)) } diff --git a/ui/consts_unix.go b/ui/consts_unix.go index fd13ad3..57f75dd 100644 --- a/ui/consts_unix.go +++ b/ui/consts_unix.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package ui diff --git a/ui/ignore_general.go b/ui/ignore_general.go index 21f4734..43c1dd1 100644 --- a/ui/ignore_general.go +++ b/ui/ignore_general.go @@ -1,3 +1,4 @@ +//go:build !darwin // +build !darwin package ui diff --git a/ui/keys.go b/ui/keys.go new file mode 100644 index 0000000..8e13f95 --- /dev/null +++ b/ui/keys.go @@ -0,0 +1,6 @@ +package ui + +const ( + keyEnter = "enter" + keyEsc = "esc" +) diff --git a/ui/markdown.go b/ui/markdown.go index f6f8f2c..c5fbff4 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -168,8 +168,7 @@ func wrapMarkdowns(t DocType, md []*charm.Markdown) (m []*markdown) { // Return the time in a human-readable format relative to the current time. func relativeTime(then time.Time) string { now := time.Now() - ago := now.Sub(then) - if ago < time.Minute { + if ago := now.Sub(then); ago < time.Minute { return "just now" } else if ago < humanize.Week { return humanize.CustomRelTime(then, now, "ago", "from now", magnitudes) diff --git a/ui/pager.go b/ui/pager.go index 4b50820..dea001b 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -98,8 +98,10 @@ var ( Foreground(fuschia) ) -type contentRenderedMsg string -type noteSavedMsg *charm.Markdown +type ( + contentRenderedMsg string + noteSavedMsg *charm.Markdown +) type pagerState int @@ -227,10 +229,10 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { switch m.state { case pagerStateSetNote: switch msg.String() { - case "esc": + case keyEsc: m.state = pagerStateBrowse return m, nil - case "enter": + case keyEnter: var cmd tea.Cmd if m.textInput.Value() != m.currentDocument.Note { // don't update if the note didn't change m.currentDocument.Note = m.textInput.Value() // update optimistically @@ -242,7 +244,7 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { } default: switch msg.String() { - case "q", "esc": + case "q", keyEsc: if m.state != pagerStateBrowse { m.state = pagerStateBrowse return m, nil @@ -416,10 +418,9 @@ func (m pagerModel) statusBarView(b *strings.Builder) { maxPercent float64 = 1.0 percentToStringMagnitude float64 = 100.0 ) - var ( - isStashed bool = m.currentDocument.docType == StashedDoc || m.currentDocument.docType == ConvertedDoc - showStatusMessage bool = m.state == pagerStateStatusMessage - ) + + isStashed := m.currentDocument.docType == StashedDoc || m.currentDocument.docType == ConvertedDoc + showStatusMessage := m.state == pagerStateStatusMessage // Logo logo := glowLogoView(" Glow ") diff --git a/ui/stash.go b/ui/stash.go index 2d0dfa3..e4ba115 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -3,8 +3,8 @@ package ui import ( "errors" "fmt" - "io/ioutil" "log" + "os" "sort" "strings" "time" @@ -55,9 +55,11 @@ var ( // MSG -type deletedStashedItemMsg int -type filteredMarkdownMsg []*markdown -type fetchedMarkdownMsg *markdown +type ( + deletedStashedItemMsg int + filteredMarkdownMsg []*markdown + fetchedMarkdownMsg *markdown +) type markdownFetchFailedMsg struct { err error @@ -218,15 +220,6 @@ func (m stashModel) loadingDone() bool { return m.loaded.Equals(m.common.cfg.DocumentTypes.Difference(ConvertedDoc)) } -func (m stashModel) hasSection(key sectionKey) bool { - for _, v := range m.sections { - if key == v.key { - return true - } - } - return false -} - func (m stashModel) currentSection() *section { return &m.sections[m.sectionIndex] } @@ -741,7 +734,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { m.setCursor(m.paginator().ItemsOnPage(numDocs) - 1) // Clear filter (if applicable) - case "esc": + case keyEsc: if m.filterApplied() { m.resetFiltering() } @@ -769,7 +762,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { m.updatePagination() // Open document - case "enter": + case keyEnter: m.hideStatusMessage() if numDocs == 0 { @@ -971,7 +964,6 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { } switch md.docType { - case ConvertedDoc: // If the document was stashed in this session, convert it // back to it's original document type @@ -989,9 +981,7 @@ func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { if err == nil { m.filteredMarkdowns = mds } - } - break } } @@ -1021,10 +1011,10 @@ func (m *stashModel) handleFiltering(msg tea.Msg) tea.Cmd { // Handle keys if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { - case "esc": + case keyEsc: // Cancel filtering m.resetFiltering() - case "enter", "tab", "shift+tab", "ctrl+k", "up", "ctrl+j", "down": + case keyEnter, "tab", "shift+tab", "ctrl+k", "up", "ctrl+j", "down": m.hideStatusMessage() if len(m.markdowns) == 0 { @@ -1087,11 +1077,11 @@ func (m *stashModel) handleNoteInput(msg tea.Msg) tea.Cmd { if msg, ok := msg.(tea.KeyMsg); ok { switch msg.String() { - case "esc": + case keyEsc: // Cancel note m.noteInput.Reset() m.selectionState = selectionIdle - case "enter": + case keyEnter: // Set new note md := m.selectedMarkdown() @@ -1235,7 +1225,7 @@ func (m stashModel) headerView() string { stashedCount := m.countMarkdowns(StashedDoc) + m.countMarkdowns(ConvertedDoc) newsCount := m.countMarkdowns(NewsDoc) - var sections []string + var sections []string //nolint:prealloc // Filter results if m.filterState == filtering { @@ -1384,7 +1374,7 @@ func loadRemoteMarkdown(cc *charm.Client, md *markdown) tea.Cmd { newMD, err := fetchMarkdown(cc, md.ID, md.docType) if err != nil { if debug { - log.Printf("error loading %s markdown (ID %s, Note: '%s'): %v", md.docType, md.ID, md.Note, err) + log.Printf("error loading %s markdown (ID %d, Note: '%s'): %v", md.docType, md.ID, md.Note, err) } return markdownFetchFailedMsg{ err: err, @@ -1406,7 +1396,7 @@ func loadLocalMarkdown(md *markdown) tea.Cmd { return errMsg{errors.New("could not load file: missing path")} } - data, err := ioutil.ReadFile(md.localPath) + data, err := os.ReadFile(md.localPath) if err != nil { if debug { log.Println("error reading local markdown:", err) diff --git a/ui/stashhelp.go b/ui/stashhelp.go index a53dfca..8ab9c22 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -240,11 +240,9 @@ func (m stashModel) miniHelpView(entries ...string) string { } func (m stashModel) fullHelpView(groups ...[]string) string { - var ( - columns []helpColumn - tallestCol int - renderedCols [][]string // final rows grouped by column - ) + var tallestCol int + columns := make([]helpColumn, 0, len(groups)) + renderedCols := make([][]string, 0, len(groups)) // final rows grouped by column // Get key/value pairs for _, g := range groups { diff --git a/ui/styles.go b/ui/styles.go index fe7c0ff..3b3ccca 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -1,8 +1,6 @@ package ui -import ( - . "github.com/charmbracelet/lipgloss" -) +import . "github.com/charmbracelet/lipgloss" //nolint: revive // Colors. var ( @@ -33,6 +31,7 @@ var ( ) // Ulimately, we'll transition to named styles. +// nolint:deadcode,unused,varcheck var ( normalFg = NewStyle().Foreground(normal).Render dimNormalFg = NewStyle().Foreground(normalDim).Render diff --git a/ui/ui.go b/ui/ui.go index cef9885..478a9d7 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -3,7 +3,6 @@ package ui import ( "errors" "fmt" - "io/ioutil" "log" "os" "path/filepath" @@ -13,7 +12,6 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/keygen" - "github.com/charmbracelet/charm/ui/keygen" "github.com/charmbracelet/glow/utils" "github.com/muesli/gitcha" te "github.com/muesli/termenv" @@ -57,9 +55,9 @@ func NewProgram(cfg Config) *tea.Program { } config = cfg opts := []tea.ProgramOption{tea.WithAltScreen()} - if cfg.EnableMouse { - opts = append(opts, tea.WithMouseCellMotion()) - } + if cfg.EnableMouse { + opts = append(opts, tea.WithMouseCellMotion()) + } return tea.NewProgram(newModel(cfg), opts...) } @@ -77,6 +75,7 @@ type ( ch chan gitcha.SearchResult } ) + type ( foundLocalFileMsg gitcha.SearchResult localFileSearchFinished struct{} @@ -662,9 +661,8 @@ func stashDocument(cc *charm.Client, md markdown) tea.Cmd { // then we'll stash it anyway. if len(md.Body) == 0 { switch md.docType { - case LocalDoc: - data, err := ioutil.ReadFile(md.localPath) + data, err := os.ReadFile(md.localPath) if err != nil { if debug { log.Println("error loading document body for stashing:", err) diff --git a/utils/utils.go b/utils/utils.go index 8146f82..fe38c13 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -7,6 +7,7 @@ import ( "github.com/mitchellh/go-homedir" ) +// RemoveFrontmatter removes the front matter header of a markdown file. func RemoveFrontmatter(content []byte) []byte { if frontmatterBoundaries := detectFrontmatter(content); frontmatterBoundaries[0] == 0 { return content[frontmatterBoundaries[1]:] From 400f3f8e1f187857d20dc1613d4e840c32c04bfd Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 17 Nov 2022 09:21:52 +0100 Subject: [PATCH 723/911] chore: disable dependabot timer --- .github/dependabot.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d0b49cd..9fc3b07 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,7 +4,6 @@ updates: directory: "/" schedule: interval: "daily" - time: "08:00" labels: - "dependencies" commit-message: @@ -14,7 +13,6 @@ updates: directory: "/" schedule: interval: "daily" - time: "08:00" labels: - "dependencies" commit-message: From a07fdb73f0cffd5ce027341fb2e98a26cc852d54 Mon Sep 17 00:00:00 2001 From: Maas Lalani Date: Thu, 14 Jul 2022 22:53:13 -0400 Subject: [PATCH 724/911] feat(ui): `e` to open edit local markdown files in editor Introduce key binding to allow users to open their `EDITOR` to edit local markdown files in stash and pager view. --- ui/editor.go | 33 +++++++++++++++++++++++++++++++++ ui/pager.go | 12 ++++++++++++ ui/stash.go | 12 ++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 ui/editor.go diff --git a/ui/editor.go b/ui/editor.go new file mode 100644 index 0000000..60cc320 --- /dev/null +++ b/ui/editor.go @@ -0,0 +1,33 @@ +package ui + +import ( + "os" + "os/exec" + "strings" + + tea "github.com/charmbracelet/bubbletea" +) + +const defaultEditor = "nano" + +type editorFinishedMsg struct{ err error } + +func openEditor(path string) tea.Cmd { + editor, args := getEditor() + cmd := exec.Command(editor, append(args, path)...) + cb := func(err error) tea.Msg { + return editorFinishedMsg{err} + } + return tea.ExecProcess(cmd, cb) +} + +func getEditor() (string, []string) { + editor := strings.Fields(os.Getenv("EDITOR")) + if len(editor) > 1 { + return editor[0], editor[1:] + } + if len(editor) == 1 { + return editor[0], []string{} + } + return defaultEditor, []string{} +} diff --git a/ui/pager.go b/ui/pager.go index dea001b..b3c56e8 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -283,6 +283,12 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { } return m, textinput.Blink + + case "e": + if m.currentDocument.docType == LocalDoc { + return m, openEditor(m.currentDocument.localPath) + } + case "s": if m.common.authStatus != authOK { break @@ -341,6 +347,12 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { cmds = append(cmds, viewport.Sync(m.viewport)) } + // We've finished editing the document, potentially making changes. Let's + // retrieve the latest version of the document so that we display + // up-to-date contents. + case editorFinishedMsg: + return m, loadLocalMarkdown(&m.currentDocument) + // We've reveived terminal dimensions, either for the first time or // after a resize case tea.WindowSizeMsg: diff --git a/ui/stash.go b/ui/stash.go index e4ba115..a017911 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -761,6 +761,18 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { } m.updatePagination() + // Edit document in EDITOR + case "e": + md := m.selectedMarkdown() + if md == nil { + break + } + file := m.selectedMarkdown().localPath + if file == "" { + break + } + return openEditor(file) + // Open document case keyEnter: m.hideStatusMessage() From 9f110c304b7e1d1773ab2b00a04cc5a2c13a774f Mon Sep 17 00:00:00 2001 From: Carlos A Becker Date: Mon, 5 Dec 2022 14:49:35 -0300 Subject: [PATCH 725/911] docs: update license year Signed-off-by: Carlos A Becker --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 2e0a4da..81c7cad 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019-2021 Charmbracelet, Inc +Copyright (c) 2019-2022 Charmbracelet, Inc Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From d9bf3b8ee89072cdec42af6d938a1bef0393c748 Mon Sep 17 00:00:00 2001 From: Maas Lalani Date: Mon, 19 Dec 2022 17:38:26 -0500 Subject: [PATCH 726/911] fix: don't close HTTP body --- main.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index bb7e60c..e309949 100644 --- a/main.go +++ b/main.go @@ -83,12 +83,11 @@ func sourceFromArg(arg string) (*source, error) { if u.Scheme != "http" && u.Scheme != "https" { return nil, fmt.Errorf("%s is not a supported protocol", u.Scheme) } - - resp, err := http.Get(u.String()) + // consumer of the source is responsible for closing the ReadCloser. + resp, err := http.Get(u.String()) // nolint:bodyclose if err != nil { return nil, err } - defer resp.Body.Close() //nolint:errcheck if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("HTTP status %d", resp.StatusCode) } From 5b43697cb349d17e207ea3e7362449e2c71ef458 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 03:09:57 +0000 Subject: [PATCH 727/911] feat(deps): bump golang.org/x/text from 0.4.0 to 0.6.0 Bumps [golang.org/x/text](https://github.com/golang/text) from 0.4.0 to 0.6.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.4.0...v0.6.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 19157b2..03a1e16 100644 --- a/go.mod +++ b/go.mod @@ -22,5 +22,5 @@ require ( github.com/spf13/viper v1.14.0 golang.org/x/sys v0.0.0-20220908164124-27713097b956 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 - golang.org/x/text v0.4.0 + golang.org/x/text v0.6.0 ) diff --git a/go.sum b/go.sum index 6f325cc..dd54c6c 100644 --- a/go.sum +++ b/go.sum @@ -938,8 +938,9 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From b9f519e1ea7802a6449b5a9f8b9bf3943301303f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 08:20:22 +0000 Subject: [PATCH 728/911] feat(deps): bump github.com/charmbracelet/bubbletea Bumps [github.com/charmbracelet/bubbletea](https://github.com/charmbracelet/bubbletea) from 0.23.0 to 0.23.1. - [Release notes](https://github.com/charmbracelet/bubbletea/releases) - [Commits](https://github.com/charmbracelet/bubbletea/compare/v0.23.0...v0.23.1) --- updated-dependencies: - dependency-name: github.com/charmbracelet/bubbletea dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 03a1e16..4dd2577 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.16 require ( github.com/charmbracelet/bubbles v0.14.0 - github.com/charmbracelet/bubbletea v0.23.0 + github.com/charmbracelet/bubbletea v0.23.1 github.com/charmbracelet/charm v0.8.6 github.com/charmbracelet/glamour v0.6.0 github.com/charmbracelet/lipgloss v0.6.0 diff --git a/go.sum b/go.sum index dd54c6c..8492359 100644 --- a/go.sum +++ b/go.sum @@ -222,8 +222,8 @@ github.com/charmbracelet/bubbles v0.14.0 h1:DJfCwnARfWjZLvMglhSQzo76UZ2gucuHPy9j github.com/charmbracelet/bubbles v0.14.0/go.mod h1:bbeTiXwPww4M031aGi8UK2HT9RDWoiNibae+1yCMtcc= github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= github.com/charmbracelet/bubbletea v0.21.0/go.mod h1:GgmJMec61d08zXsOhqRC/AiOx4K4pmz+VIcRIm1FKr4= -github.com/charmbracelet/bubbletea v0.23.0 h1:oGChhsNcm7kltiTdjxJbVlyh93N5fycluO7MsA2JEeg= -github.com/charmbracelet/bubbletea v0.23.0/go.mod h1:JAfGK/3/pPKHTnAS8JIE2u9f61BjWTQY57RbT25aMXU= +github.com/charmbracelet/bubbletea v0.23.1 h1:CYdteX1wCiCzKNUlwm25ZHBIc1GXlYFyUIte8WPvhck= +github.com/charmbracelet/bubbletea v0.23.1/go.mod h1:JAfGK/3/pPKHTnAS8JIE2u9f61BjWTQY57RbT25aMXU= github.com/charmbracelet/charm v0.8.6 h1:/U6rxGj4J6zZ1Ex8+wTr4hNMr4ESBzNZbC1UyrJPVbg= github.com/charmbracelet/charm v0.8.6/go.mod h1:8dE3uX+TYSpa7Q6e/CmjN6WSd7koSAKNQTGWugFREx4= github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc= From ff59ead353e358c085e12d5323c9863f9882da10 Mon Sep 17 00:00:00 2001 From: Nils Leif Fischer Date: Tue, 8 Dec 2020 21:47:00 +0000 Subject: [PATCH 729/911] Extend example how to read from stdin --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fbe46b2..c36ed66 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ document use a markdown source as the primary argument: glow README.md # Read from stdin -glow - +echo "[Glow](https://github.com/charmbracelet/glow)" | glow - # Fetch README from GitHub / GitLab glow github.com/charmbracelet/glow From dd1593b10dbd0602e7eb1e00774c4da9aa837b23 Mon Sep 17 00:00:00 2001 From: Justin Moser Date: Sat, 3 Dec 2022 14:57:59 -0600 Subject: [PATCH 730/911] Keybindings for editing the document from the pager --- ui/pager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index b3c56e8..575adc0 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -531,7 +531,7 @@ func (m pagerModel) helpView() (s string) { col1 := []string{ "g/home go to top", "G/end go to bottom", - "", + "e edit this document", memoOrStash, "esc back to files", "q quit", From 6ba2683628077ce04e085ac24e95ea071692c2eb Mon Sep 17 00:00:00 2001 From: Maas Lalani Date: Thu, 19 Jan 2023 14:13:41 -0500 Subject: [PATCH 731/911] Show edit help when editable (#442) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: only show edit help on pager when editable * fix: only allow `LocalDoc`s to be edited * feat: show e • edit help when document is editable --- ui/pager.go | 7 ++++++- ui/stash.go | 2 +- ui/stashhelp.go | 11 +++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 575adc0..0cebdd9 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -528,10 +528,15 @@ func (m pagerModel) helpView() (s string) { memoOrStash = "s stash this document" } + editOrBlank := "e edit this document" + if m.currentDocument.docType != LocalDoc || m.currentDocument.localPath == "" { + editOrBlank = "" + } + col1 := []string{ "g/home go to top", "G/end go to bottom", - "e edit this document", + editOrBlank, memoOrStash, "esc back to files", "q quit", diff --git a/ui/stash.go b/ui/stash.go index a017911..7b69d1a 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -764,7 +764,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Edit document in EDITOR case "e": md := m.selectedMarkdown() - if md == nil { + if md == nil || md.docType != LocalDoc { break } file := m.selectedMarkdown().localPath diff --git a/ui/stashhelp.go b/ui/stashhelp.go index 8ab9c22..18f1dcf 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -110,9 +110,11 @@ func (m stashModel) helpView() (string, int) { var ( isStashed bool isStashable bool + isEditable bool navHelp []string filterHelp []string selectionHelp []string + editHelp []string sectionHelp []string appHelp []string ) @@ -121,6 +123,7 @@ func (m stashModel) helpView() (string, int) { md := m.selectedMarkdown() isStashed = md != nil && md.docType == StashedDoc isStashable = md != nil && md.docType == LocalDoc && m.online() + isEditable = md != nil && md.docType == LocalDoc && md.localPath != "" } if numDocs > 0 && m.showFullHelp { @@ -152,6 +155,10 @@ func (m stashModel) helpView() (string, int) { selectionHelp = []string{"s", "stash"} } + if isEditable { + editHelp = []string{"e", "edit"} + } + // If there are errors if m.err != nil { appHelp = append(appHelp, "!", "errors") @@ -164,14 +171,14 @@ func (m stashModel) helpView() (string, int) { if m.filterState != filtering { appHelp = append(appHelp, "?", "close help") } - return m.renderHelp(navHelp, filterHelp, selectionHelp, sectionHelp, appHelp) + return m.renderHelp(navHelp, filterHelp, append(selectionHelp, editHelp...), sectionHelp, appHelp) } // Mini help if m.filterState != filtering { appHelp = append(appHelp, "?", "more") } - return m.renderHelp(navHelp, filterHelp, selectionHelp, sectionHelp, appHelp) + return m.renderHelp(navHelp, filterHelp, selectionHelp, editHelp, sectionHelp, appHelp) } // renderHelp returns the rendered help view and associated line height for From 071783d9078d9f52ac73f35c1a777d29052ea0af Mon Sep 17 00:00:00 2001 From: Maas Lalani Date: Fri, 20 Jan 2023 11:06:02 -0500 Subject: [PATCH 732/911] feat: copy contents of document (#439) * feat: copy contents of document Co-authored-by: bashbunni * fix: use atotto/clipboard for copying Co-authored-by: bashbunni --- go.mod | 1 + ui/pager.go | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/go.mod b/go.mod index 4dd2577..d09164d 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/charmbracelet/glow go 1.16 require ( + github.com/atotto/clipboard v0.1.4 github.com/charmbracelet/bubbles v0.14.0 github.com/charmbracelet/bubbletea v0.23.1 github.com/charmbracelet/charm v0.8.6 diff --git a/ui/pager.go b/ui/pager.go index 0cebdd9..8196761 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -7,6 +7,7 @@ import ( "strings" "time" + "github.com/atotto/clipboard" "github.com/charmbracelet/bubbles/spinner" "github.com/charmbracelet/bubbles/textinput" "github.com/charmbracelet/bubbles/viewport" @@ -289,6 +290,14 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { return m, openEditor(m.currentDocument.localPath) } + case "c": + err := clipboard.WriteAll(m.currentDocument.Body) + if err != nil { + cmds = append(cmds, m.showStatusMessage("Unable to copy contents")) + } else { + cmds = append(cmds, m.showStatusMessage("Copied contents")) + } + case "s": if m.common.authStatus != authOK { break @@ -536,6 +545,7 @@ func (m pagerModel) helpView() (s string) { col1 := []string{ "g/home go to top", "G/end go to bottom", + "c copy contents", editOrBlank, memoOrStash, "esc back to files", From 6543979ed18616ee16f71597618bf02c5ef42de9 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 20 Jan 2023 11:33:38 -0500 Subject: [PATCH 733/911] fix: performance scrolling This update fixes performance scrolling by way of the latest Bubbles release: v0.15.0. --- go.mod | 2 +- go.sum | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index d09164d..934d472 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.16 require ( github.com/atotto/clipboard v0.1.4 - github.com/charmbracelet/bubbles v0.14.0 + github.com/charmbracelet/bubbles v0.15.0 github.com/charmbracelet/bubbletea v0.23.1 github.com/charmbracelet/charm v0.8.6 github.com/charmbracelet/glamour v0.6.0 diff --git a/go.sum b/go.sum index 8492359..f59cdb9 100644 --- a/go.sum +++ b/go.sum @@ -218,10 +218,9 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGimk1BE6cmHijOkM= -github.com/charmbracelet/bubbles v0.14.0 h1:DJfCwnARfWjZLvMglhSQzo76UZ2gucuHPy9jLWX45Og= -github.com/charmbracelet/bubbles v0.14.0/go.mod h1:bbeTiXwPww4M031aGi8UK2HT9RDWoiNibae+1yCMtcc= +github.com/charmbracelet/bubbles v0.15.0 h1:c5vZ3woHV5W2b8YZI1q7v4ZNQaPetfHuoHzx+56Z6TI= +github.com/charmbracelet/bubbles v0.15.0/go.mod h1:Y7gSFbBzlMpUDR/XM9MhZI374Q+1p1kluf1uLl8iK74= github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= -github.com/charmbracelet/bubbletea v0.21.0/go.mod h1:GgmJMec61d08zXsOhqRC/AiOx4K4pmz+VIcRIm1FKr4= github.com/charmbracelet/bubbletea v0.23.1 h1:CYdteX1wCiCzKNUlwm25ZHBIc1GXlYFyUIte8WPvhck= github.com/charmbracelet/bubbletea v0.23.1/go.mod h1:JAfGK/3/pPKHTnAS8JIE2u9f61BjWTQY57RbT25aMXU= github.com/charmbracelet/charm v0.8.6 h1:/U6rxGj4J6zZ1Ex8+wTr4hNMr4ESBzNZbC1UyrJPVbg= @@ -229,7 +228,6 @@ github.com/charmbracelet/charm v0.8.6/go.mod h1:8dE3uX+TYSpa7Q6e/CmjN6WSd7koSAKN github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc= github.com/charmbracelet/glamour v0.6.0/go.mod h1:taqWV4swIMMbWALc0m7AfE9JkPSU8om2538k9ITBxOc= github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= -github.com/charmbracelet/lipgloss v0.5.0/go.mod h1:EZLha/HbzEt7cYqdFPovlqy5FZPj0xFhg5SaqxScmgs= github.com/charmbracelet/lipgloss v0.6.0 h1:1StyZB9vBSOyuZxQUcUwGr17JmojPNm87inij9N3wJY= github.com/charmbracelet/lipgloss v0.6.0/go.mod h1:tHh2wr34xcHjC2HCXIlGSG1jaDF0S0atAUvBMP6Ppuk= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -527,7 +525,6 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34= github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= -github.com/muesli/cancelreader v0.2.0/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/gitcha v0.2.0 h1:+wOgT2dI9s2Tznj1t1rb/qkK5e0cb6qD8c4IX2TR/YY= @@ -544,7 +541,6 @@ github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5 github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= github.com/muesli/termenv v0.7.4/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= -github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= github.com/muesli/termenv v0.13.0 h1:wK20DRpJdDX8b7Ek2QfhvqhRQFZ237RGRO0RQ/Iqdy0= github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= From 19732a63035e316e3079d15030a573e89d7115cf Mon Sep 17 00:00:00 2001 From: WieeRd Date: Sat, 16 Jul 2022 18:41:56 +0900 Subject: [PATCH 734/911] fix: support hard line breaks (charmbracelet#212) --- main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/main.go b/main.go index e309949..17d66e7 100644 --- a/main.go +++ b/main.go @@ -271,6 +271,7 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { gs, glamour.WithWordWrap(int(width)), glamour.WithBaseURL(baseURL), + glamour.WithPreservedNewLines(), ) if err != nil { return err From 0325be3670e81036bf23eeb6e7568c216c5c14a0 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 24 Jan 2023 14:17:47 -0300 Subject: [PATCH 735/911] fix: rm emoji from package description (#453) --- .goreleaser.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 6f6fead..aa0c1ae 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -5,7 +5,7 @@ includes: variables: main: "." binary_name: glow - description: "Render markdown on the CLI, with pizzazz! 💅🏻" + description: "Render markdown on the CLI, with pizzazz!" github_url: "https://github.com/charmbracelet/soft-serve" maintainer: "Christian Muehlhaeuser " brew_commit_author_name: "Christian Muehlhaeuser" From 8b5468468aeb3e36840f96285600cec963a9756d Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 24 Jan 2023 14:51:11 -0300 Subject: [PATCH 736/911] fix: improve editor handling (#449) * fix: improve editor handling Signed-off-by: Carlos A Becker * test: add tests Signed-off-by: Carlos A Becker Signed-off-by: Carlos A Becker --- config_cmd.go | 15 ++------------- editor/editor.go | 27 +++++++++++++++++++++++++++ editor/editor_test.go | 26 ++++++++++++++++++++++++++ ui/editor.go | 22 ++-------------------- 4 files changed, 57 insertions(+), 33 deletions(-) create mode 100644 editor/editor.go create mode 100644 editor/editor_test.go diff --git a/config_cmd.go b/config_cmd.go index 6dfc835..a4cb584 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -1,14 +1,12 @@ package main import ( - "errors" "fmt" "os" - "os/exec" "path" "path/filepath" - "strings" + "github.com/charmbracelet/glow/editor" gap "github.com/muesli/go-app-paths" "github.com/spf13/cobra" ) @@ -32,11 +30,6 @@ var configCmd = &cobra.Command{ Example: paragraph("glow config\nglow config --config path/to/config.yml"), Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { - editor := strings.Fields(os.Getenv("EDITOR")) - if len(editor) == 0 { - return errors.New("no EDITOR environment variable set") - } - if configFile == "" { scope := gap.NewScope(gap.User, "glow") @@ -71,11 +64,7 @@ var configCmd = &cobra.Command{ return err } - var eargs []string - if len(editor) > 1 { - eargs = editor[1:] - } - c := exec.Command(editor[0], append(eargs, configFile)...) // nolint: gosec + c := editor.Cmd(configFile) c.Stdin = os.Stdin c.Stdout = os.Stdout c.Stderr = os.Stderr diff --git a/editor/editor.go b/editor/editor.go new file mode 100644 index 0000000..bbfe6ff --- /dev/null +++ b/editor/editor.go @@ -0,0 +1,27 @@ +package editor + +import ( + "os" + "os/exec" + "strings" +) + +const defaultEditor = "nano" + +// Cmd returns a *exec.Cmd editing the given path with $EDITOR or nano if no +// $EDITOR is set. +func Cmd(path string) *exec.Cmd { + editor, args := getEditor() + return exec.Command(editor, append(args, path)...) +} + +func getEditor() (string, []string) { + editor := strings.Fields(os.Getenv("EDITOR")) + if len(editor) > 1 { + return editor[0], editor[1:] + } + if len(editor) == 1 { + return editor[0], []string{} + } + return defaultEditor, []string{} +} diff --git a/editor/editor_test.go b/editor/editor_test.go new file mode 100644 index 0000000..2d1b583 --- /dev/null +++ b/editor/editor_test.go @@ -0,0 +1,26 @@ +package editor + +import ( + "reflect" + "testing" +) + +func TestEditor(t *testing.T) { + filename := "README.md" + for k, v := range map[string][]string{ + "": {"nano", filename}, + "nvim": {"nvim", filename}, + "vim": {"vim", filename}, + "vscode --foo": {"vscode", "--foo", filename}, + "nvim -a -b": {"nvim", "-a", "-b", filename}, + } { + t.Run(k, func(t *testing.T) { + t.Setenv("EDITOR", k) + cmd := Cmd("README.md") + got := cmd.Args + if !reflect.DeepEqual(got, v) { + t.Fatalf("expected %v; got %v", v, got) + } + }) + } +} diff --git a/ui/editor.go b/ui/editor.go index 60cc320..c38ef01 100644 --- a/ui/editor.go +++ b/ui/editor.go @@ -1,33 +1,15 @@ package ui import ( - "os" - "os/exec" - "strings" - tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/glow/editor" ) -const defaultEditor = "nano" - type editorFinishedMsg struct{ err error } func openEditor(path string) tea.Cmd { - editor, args := getEditor() - cmd := exec.Command(editor, append(args, path)...) cb := func(err error) tea.Msg { return editorFinishedMsg{err} } - return tea.ExecProcess(cmd, cb) -} - -func getEditor() (string, []string) { - editor := strings.Fields(os.Getenv("EDITOR")) - if len(editor) > 1 { - return editor[0], editor[1:] - } - if len(editor) == 1 { - return editor[0], []string{} - } - return defaultEditor, []string{} + return tea.ExecProcess(editor.Cmd(path), cb) } From c1483664d5196575cc7a550dacd291265a5c4c8e Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 24 Jan 2023 15:02:10 -0300 Subject: [PATCH 737/911] fix: do not use deprecated func (#451) Signed-off-by: Carlos A Becker Signed-off-by: Carlos A Becker --- ui/stash.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index 7b69d1a..b0d481d 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -560,7 +560,7 @@ func newStashModel(common *commonModel) stashModel { } func newStashPaginator() paginator.Model { - p := paginator.NewModel() + p := paginator.New() p.Type = paginator.Dots p.ActiveDot = brightGrayFg("•") p.InactiveDot = darkGrayFg("•") From 442bc281c354b2c7e67f2fb887ff4828e2c0d769 Mon Sep 17 00:00:00 2001 From: Kian-Meng Ang Date: Fri, 3 Mar 2023 10:42:12 +0800 Subject: [PATCH 738/911] docs: fix typos Found via `typos --format brief` --- ui/markdown.go | 2 +- ui/pager.go | 2 +- ui/stash.go | 4 ++-- ui/stashhelp.go | 4 ++-- ui/stashitem.go | 2 +- ui/styles.go | 6 +++--- ui/ui.go | 4 ++-- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ui/markdown.go b/ui/markdown.go index c5fbff4..e1d5086 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -134,7 +134,7 @@ func (m markdownsByLocalFirst) Less(i, j int) bool { return m[i].CreatedAt.After(m[j].CreatedAt) } - // If the times also match, sort by unqiue ID. + // If the times also match, sort by unique ID. ids := []ksuid.KSUID{m[i].uniqueID, m[j].uniqueID} ksuid.Sort(ids) return ids[0] == m[i].uniqueID diff --git a/ui/pager.go b/ui/pager.go index 8196761..f93fd0b 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -96,7 +96,7 @@ var ( Background(yellowGreen) pagerNoteInputCursorStyle = lipgloss.NewStyle(). - Foreground(fuschia) + Foreground(fuchsia) ) type ( diff --git a/ui/stash.go b/ui/stash.go index b0d481d..b258ca6 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -40,7 +40,7 @@ var ( logoStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("#ECFD65")). - Background(fuschia). + Background(fuchsia). Bold(true) stashSpinnerStyle = lipgloss.NewStyle(). @@ -49,7 +49,7 @@ var ( Foreground(yellowGreen). MarginRight(1) stashInputCursorStyle = lipgloss.NewStyle(). - Foreground(fuschia). + Foreground(fuchsia). MarginRight(1) ) diff --git a/ui/stashhelp.go b/ui/stashhelp.go index 18f1dcf..6c0b88d 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -15,7 +15,7 @@ type helpEntry struct{ key, val string } type helpColumn []helpEntry // newHelpColumn creates a help column from pairs of string arguments -// represeting keys and values. If the arguments are not even (and therein +// representing keys and values. If the arguments are not even (and therein // not every key has a matching value) the function will panic. func newHelpColumn(pairs ...string) (h helpColumn) { if len(pairs)%2 != 0 { @@ -193,7 +193,7 @@ func (m stashModel) renderHelp(groups ...[]string) (string, int) { } // Builds the help view from various sections pieces, truncating it if the view -// would otherwise wrap to two lines. Help view entires should come in as pairs, +// would otherwise wrap to two lines. Help view entries should come in as pairs, // with the first being the key and the second being the help text. func (m stashModel) miniHelpView(entries ...string) string { if len(entries) == 0 { diff --git a/ui/stashitem.go b/ui/stashitem.go index 0206364..d853fc7 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -76,7 +76,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { icon = dullFuchsiaFg(icon) if m.currentSection().key == filterSection && m.filterState == filterApplied || singleFilteredItem { - s := lipgloss.NewStyle().Foreground(fuschia) + s := lipgloss.NewStyle().Foreground(fuchsia) title = styleFilteredText(title, m.filterInput.Value(), s, s.Copy().Underline(true)) } else { title = fuchsiaFg(title) diff --git a/ui/styles.go b/ui/styles.go index 3b3ccca..a539c58 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -18,7 +18,7 @@ var ( cream = AdaptiveColor{Light: "#FFFDF5", Dark: "#FFFDF5"} yellowGreen = AdaptiveColor{Light: "#04B575", Dark: "#ECFD65"} dullYellowGreen = AdaptiveColor{Light: "#6BCB94", Dark: "#9BA92F"} - fuschia = AdaptiveColor{Light: "#EE6FF8", Dark: "#EE6FF8"} + fuchsia = AdaptiveColor{Light: "#EE6FF8", Dark: "#EE6FF8"} dimFuchsia = AdaptiveColor{Light: "#F1A8FF", Dark: "#99519E"} dullFuchsia = AdaptiveColor{Dark: "#AD58B4", Light: "#F793FF"} dimDullFuchsia = AdaptiveColor{Light: "#F6C9FF", Dark: "#6B3A6F"} @@ -47,13 +47,13 @@ var ( semiDimGreenFg = NewStyle().Foreground(semiDimGreen).Render dimGreenFg = NewStyle().Foreground(dimGreen).Render - fuchsiaFg = NewStyle().Foreground(fuschia).Render + fuchsiaFg = NewStyle().Foreground(fuchsia).Render dimFuchsiaFg = NewStyle().Foreground(dimFuchsia).Render dullFuchsiaFg = NewStyle().Foreground(dullFuchsia).Render dimDullFuchsiaFg = NewStyle().Foreground(dimDullFuchsia).Render - indigoFg = NewStyle().Foreground(fuschia).Render + indigoFg = NewStyle().Foreground(fuchsia).Render dimIndigoFg = NewStyle().Foreground(dimIndigo).Render subtleIndigoFg = NewStyle().Foreground(subtleIndigo).Render diff --git a/ui/ui.go b/ui/ui.go index 478a9d7..bc0ef88 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -91,7 +91,7 @@ type ( } ) -// applicationContext indicates the area of the application something appies +// applicationContext indicates the area of the application something applies // to. Occasionally used as an argument to commands and messages. type applicationContext int @@ -620,7 +620,7 @@ func generateSSHKeys() tea.Msg { return keygenFailedMsg{err} } if debug { - log.Println("keys generated succcessfully") + log.Println("keys generated successfully") } return keygenSuccessMsg{} } From 4a3d98697b257be4ed328de3adb8442f6fdbd763 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 04:02:32 +0000 Subject: [PATCH 739/911] chore(deps): bump actions/setup-go from 3 to 4 Bumps [actions/setup-go](https://github.com/actions/setup-go) from 3 to 4. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index bcc6721..845096e 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -12,7 +12,7 @@ jobs: GO111MODULE: "on" steps: - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ${{ matrix.go-version }} From 8c80ea5f67c4f01a359efde4559b94b1ff7319a0 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Fri, 5 May 2023 11:40:36 +0200 Subject: [PATCH 740/911] fix: lazily init UI --- style.go | 2 +- ui/pager.go | 4 ++-- ui/stash.go | 64 ++++++++++++++++++++++++++----------------------- ui/stashhelp.go | 2 +- ui/styles.go | 2 +- ui/ui.go | 2 ++ 6 files changed, 41 insertions(+), 35 deletions(-) diff --git a/style.go b/style.go index 366bbc4..81a1c2d 100644 --- a/style.go +++ b/style.go @@ -4,7 +4,7 @@ import . "github.com/charmbracelet/lipgloss" //nolint:revive var ( keyword = NewStyle(). - Foreground(AdaptiveColor{Light: "#04B575", Dark: "#04B575"}). + Foreground(Color("#04B575")). Render paragraph = NewStyle(). diff --git a/ui/pager.go b/ui/pager.go index f93fd0b..95f6025 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -32,7 +32,7 @@ var ( Foreground(cream). Background(green). Padding(0, 1). - Render("Set Memo") + SetString("Set Memo") statusBarNoteFg = lipgloss.AdaptiveColor{Light: "#656565", Dark: "#7D7D7D"} statusBarBg = lipgloss.AdaptiveColor{Light: "#E6E6E6", Dark: "#242424"} @@ -168,7 +168,7 @@ func (m *pagerModel) setSize(w, h int) { m.viewport.Width = w m.viewport.Height = h - statusBarHeight m.textInput.Width = w - - ansi.PrintableRuneWidth(noteHeading) - + ansi.PrintableRuneWidth(noteHeading.String()) - ansi.PrintableRuneWidth(m.textInput.Prompt) - 1 if m.showHelp { diff --git a/ui/stash.go b/ui/stash.go index b258ca6..c61ac32 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -34,9 +34,9 @@ var ( ) var ( - dividerDot = darkGrayFg(" • ") - dividerBar = darkGrayFg(" │ ") - offlineHeaderNote = darkGrayFg("(Offline)") + dividerDot = darkGrayFg.SetString(" • ") + dividerBar = darkGrayFg.SetString(" │ ") + offlineHeaderNote = darkGrayFg.SetString("(Offline)") logoStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("#ECFD65")). @@ -98,28 +98,7 @@ type section struct { } // map sections to their associated types. -var sections = map[sectionKey]section{ - localSection: { - key: localSection, - docTypes: NewDocTypeSet(LocalDoc), - paginator: newStashPaginator(), - }, - stashedSection: { - key: stashedSection, - docTypes: NewDocTypeSet(StashedDoc, ConvertedDoc), - paginator: newStashPaginator(), - }, - newsSection: { - key: newsSection, - docTypes: NewDocTypeSet(NewsDoc), - paginator: newStashPaginator(), - }, - filterSection: { - key: filterSection, - docTypes: DocTypeSet{}, - paginator: newStashPaginator(), - }, -} +var sections = map[sectionKey]section{} // filterState is the current filtering state in the file listing. type filterState int @@ -155,6 +134,31 @@ type statusMessage struct { message string } +func initSections() { + sections = map[sectionKey]section{ + localSection: { + key: localSection, + docTypes: NewDocTypeSet(LocalDoc), + paginator: newStashPaginator(), + }, + stashedSection: { + key: stashedSection, + docTypes: NewDocTypeSet(StashedDoc, ConvertedDoc), + paginator: newStashPaginator(), + }, + newsSection: { + key: newsSection, + docTypes: NewDocTypeSet(NewsDoc), + paginator: newStashPaginator(), + }, + filterSection: { + key: filterSection, + docTypes: DocTypeSet{}, + paginator: newStashPaginator(), + }, + } +} + // String returns a styled version of the status message appropriate for the // given context. func (s statusMessage) String() string { @@ -563,7 +567,7 @@ func newStashPaginator() paginator.Model { p := paginator.New() p.Type = paginator.Dots p.ActiveDot = brightGrayFg("•") - p.InactiveDot = darkGrayFg("•") + p.InactiveDot = darkGrayFg.Render("•") return p } @@ -1255,13 +1259,13 @@ func (m stashModel) headerView() string { sections[i] = grayFg(sections[i]) } - return strings.Join(sections, dividerDot) + return strings.Join(sections, dividerDot.String()) } if m.loadingDone() && len(m.markdowns) == 0 { var maybeOffline string if m.common.authStatus == authFailed { - maybeOffline = " " + offlineHeaderNote + maybeOffline = " " + offlineHeaderNote.String() } if m.stashedOnly() { @@ -1302,9 +1306,9 @@ func (m stashModel) headerView() string { sections = append(sections, s) } - s := strings.Join(sections, dividerBar) + s := strings.Join(sections, dividerBar.String()) if m.common.authStatus == authFailed { - s += dividerDot + offlineHeaderNote + s += dividerDot.String() + offlineHeaderNote.String() } return s diff --git a/ui/stashhelp.go b/ui/stashhelp.go index 6c0b88d..2b30c2e 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -231,7 +231,7 @@ func (m stashModel) miniHelpView(entries ...string) string { next = fmt.Sprintf("%s %s", k, v) if i < len(entries)-2 { - next += dividerDot + next += dividerDot.String() } // Only this (and the following) help text items if we have the diff --git a/ui/styles.go b/ui/styles.go index a539c58..e5a6c83 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -41,7 +41,7 @@ var ( grayFg = NewStyle().Foreground(gray).Render midGrayFg = NewStyle().Foreground(midGray).Render - darkGrayFg = NewStyle().Foreground(darkGray).Render + darkGrayFg = NewStyle().Foreground(darkGray) greenFg = NewStyle().Foreground(green).Render semiDimGreenFg = NewStyle().Foreground(semiDimGreen).Render diff --git a/ui/ui.go b/ui/ui.go index bc0ef88..df7e37f 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -199,6 +199,8 @@ func (m *model) unloadDocument() []tea.Cmd { } func newModel(cfg Config) tea.Model { + initSections() + if cfg.GlamourStyle == "auto" { if te.HasDarkBackground() { cfg.GlamourStyle = "dark" From ad21129703d0bd48a9b45227f56d2737623db57b Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 6 May 2023 11:05:02 +0200 Subject: [PATCH 741/911] chore: bump charm dep --- go.mod | 12 ++++++------ go.sum | 42 +++++++++++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 934d472..9016b6d 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.16 require ( github.com/atotto/clipboard v0.1.4 github.com/charmbracelet/bubbles v0.15.0 - github.com/charmbracelet/bubbletea v0.23.1 - github.com/charmbracelet/charm v0.8.6 + github.com/charmbracelet/bubbletea v0.23.2 + github.com/charmbracelet/charm v0.8.7 github.com/charmbracelet/glamour v0.6.0 github.com/charmbracelet/lipgloss v0.6.0 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac @@ -16,12 +16,12 @@ require ( github.com/muesli/gitcha v0.2.0 github.com/muesli/go-app-paths v0.2.2 github.com/muesli/reflow v0.3.0 - github.com/muesli/termenv v0.13.0 + github.com/muesli/termenv v0.15.1 github.com/sahilm/fuzzy v0.1.0 github.com/segmentio/ksuid v1.0.4 github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.14.0 - golang.org/x/sys v0.0.0-20220908164124-27713097b956 - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 - golang.org/x/text v0.6.0 + golang.org/x/sys v0.7.0 + golang.org/x/term v0.7.0 + golang.org/x/text v0.9.0 ) diff --git a/go.sum b/go.sum index f59cdb9..76defff 100644 --- a/go.sum +++ b/go.sum @@ -203,8 +203,11 @@ github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgI github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= -github.com/aymanbagabas/go-osc52 v1.0.3 h1:DTwqENW7X9arYimJrPeGZcV0ln14sGMt3pHZspWD+Mg= github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= +github.com/aymanbagabas/go-osc52 v1.2.1 h1:q2sWUyDcozPLcLabEMd+a+7Ea2DitxZVN9hTxab9L4E= +github.com/aymanbagabas/go-osc52 v1.2.1/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -221,10 +224,11 @@ github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGim github.com/charmbracelet/bubbles v0.15.0 h1:c5vZ3woHV5W2b8YZI1q7v4ZNQaPetfHuoHzx+56Z6TI= github.com/charmbracelet/bubbles v0.15.0/go.mod h1:Y7gSFbBzlMpUDR/XM9MhZI374Q+1p1kluf1uLl8iK74= github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= -github.com/charmbracelet/bubbletea v0.23.1 h1:CYdteX1wCiCzKNUlwm25ZHBIc1GXlYFyUIte8WPvhck= github.com/charmbracelet/bubbletea v0.23.1/go.mod h1:JAfGK/3/pPKHTnAS8JIE2u9f61BjWTQY57RbT25aMXU= -github.com/charmbracelet/charm v0.8.6 h1:/U6rxGj4J6zZ1Ex8+wTr4hNMr4ESBzNZbC1UyrJPVbg= -github.com/charmbracelet/charm v0.8.6/go.mod h1:8dE3uX+TYSpa7Q6e/CmjN6WSd7koSAKNQTGWugFREx4= +github.com/charmbracelet/bubbletea v0.23.2 h1:vuUJ9HJ7b/COy4I30e8xDVQ+VRDUEFykIjryPfgsdps= +github.com/charmbracelet/bubbletea v0.23.2/go.mod h1:FaP3WUivcTM0xOKNmhciz60M6I+weYLF76mr1JyI7sM= +github.com/charmbracelet/charm v0.8.7 h1:FJ9b7IxWUWHOPR72zS/QJLEqtudOB2Mwfc+Sir0eZR8= +github.com/charmbracelet/charm v0.8.7/go.mod h1:ApJYwJljEjODkOYJgFDzbUqztLrCWQct9zyPD+xcVr4= github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc= github.com/charmbracelet/glamour v0.6.0/go.mod h1:taqWV4swIMMbWALc0m7AfE9JkPSU8om2538k9ITBxOc= github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= @@ -487,11 +491,12 @@ github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcME github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= +github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= @@ -532,7 +537,6 @@ github.com/muesli/gitcha v0.2.0/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQf github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/go-app-paths v0.2.2 h1:NqG4EEZwNIhBq/pREgfBmgDmt3h1Smr1MjZiXbpZUnI= github.com/muesli/go-app-paths v0.2.2/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= -github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= @@ -541,8 +545,10 @@ github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5 github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= github.com/muesli/termenv v0.7.4/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= -github.com/muesli/termenv v0.13.0 h1:wK20DRpJdDX8b7Ek2QfhvqhRQFZ237RGRO0RQ/Iqdy0= github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= +github.com/muesli/termenv v0.14.0/go.mod h1:kG/pF1E7fh949Xhe156crRUrHNyK221IuGO7Ez60Uc8= +github.com/muesli/termenv v0.15.1 h1:UzuTb/+hhlBugQz28rpzey4ZuKcZ03MeKsoG7IJZIxs= +github.com/muesli/termenv v0.15.1/go.mod h1:HeAQPTzpfs016yGtA4g00CsdYnVLJvxsS4ANqrZs2sQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -736,6 +742,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -791,8 +798,9 @@ golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b h1:tvrvnPFcdzp294diPnrdZZZ8XUt2Tyj7svb7X52iDuU= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.6.0 h1:L4ZwwTvKW9gr0ZMS1yrHD9GZhIuVjOBBnaKH+SPQK0Q= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -831,6 +839,7 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -920,11 +929,16 @@ golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956 h1:XeJjHH1KiLpKGb6lvMiksZ9l0fVUh+AmGcm0nOMEBOY= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -935,8 +949,9 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -998,6 +1013,7 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 8aed0d90921d2c52663794cf124a7a44708283f0 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Thu, 11 May 2023 12:38:59 +0000 Subject: [PATCH 742/911] docs: update license Signed-off-by: Carlos Alexandro Becker --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 81c7cad..e5a2916 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019-2022 Charmbracelet, Inc +Copyright (c) 2019-2023 Charmbracelet, Inc Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 9c79fa1b48d72ed8fdf60517d374790bb694a251 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Fri, 12 May 2023 14:08:04 -0400 Subject: [PATCH 743/911] fix(ci): remove soft-serve workflow --- .github/workflows/soft-serve.yml | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 .github/workflows/soft-serve.yml diff --git a/.github/workflows/soft-serve.yml b/.github/workflows/soft-serve.yml deleted file mode 100644 index 8eb3221..0000000 --- a/.github/workflows/soft-serve.yml +++ /dev/null @@ -1,12 +0,0 @@ -name: soft-serve - -on: - push: - branches: - - master - -jobs: - soft-serve: - uses: charmbracelet/meta/.github/workflows/soft-serve.yml@main - secrets: - ssh-key: "${{ secrets.CHARM_SOFT_SERVE_KEY }}" From 58ec3516920d9cf054ce12f8e07b80611dba3b72 Mon Sep 17 00:00:00 2001 From: bashbunni <15822994+bashbunni@users.noreply.github.com> Date: Tue, 23 May 2023 11:57:58 -0700 Subject: [PATCH 744/911] docs: add issue template (#486) * docs: add issue template * chore(template): add locale --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 5 +++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..c19be87 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**Setup** +Please complete the following information along with version numbers, if applicable. + - OS [e.g. Ubuntu, macOS] + - Shell [e.g. zsh, fish] + - Terminal Emulator [e.g. kitty, iterm] + - Terminal Multiplexer [e.g. tmux] + - Locale [e.g. en_US.UTF-8, zh_CN.UTF-8, etc.] + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Source Code** +Please include source code if needed to reproduce the behavior. + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +Add screenshots to help explain your problem. + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..897a394 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: +- name: Discord + url: https://charm.sh/discord + about: Chat on our Discord. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..11fc491 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: enhancement +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From f0734709f0be19a34e648caaf63340938a50caa2 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Thu, 13 Jul 2023 12:29:44 +0000 Subject: [PATCH 745/911] feat(deps): update some dependencies Signed-off-by: Carlos Alexandro Becker --- go.mod | 54 +++++++++++++++++++++++++++++++++++++++++++++++++----- go.sum | 23 +++++++++++++++-------- 2 files changed, 64 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 9016b6d..94e8f2f 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/charmbracelet/glow -go 1.16 +go 1.17 require ( github.com/atotto/clipboard v0.1.4 @@ -16,12 +16,56 @@ require ( github.com/muesli/gitcha v0.2.0 github.com/muesli/go-app-paths v0.2.2 github.com/muesli/reflow v0.3.0 - github.com/muesli/termenv v0.15.1 + github.com/muesli/termenv v0.15.2 github.com/sahilm/fuzzy v0.1.0 github.com/segmentio/ksuid v1.0.4 github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.14.0 - golang.org/x/sys v0.7.0 - golang.org/x/term v0.7.0 - golang.org/x/text v0.9.0 + golang.org/x/sys v0.10.0 + golang.org/x/term v0.10.0 + golang.org/x/text v0.11.0 +) + +require ( + github.com/alecthomas/chroma v0.10.0 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/aymerick/douceur v0.2.0 // indirect + github.com/calmh/randomart v1.1.0 // indirect + github.com/containerd/console v1.0.3 // indirect + github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect + github.com/dlclark/regexp2 v1.4.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/gorilla/css v1.0.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/mattn/go-isatty v0.0.18 // indirect + github.com/mattn/go-localereader v0.0.1 // indirect + github.com/microcosm-cc/bluemonday v1.0.21 // indirect + github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 // indirect + github.com/spf13/afero v1.9.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.4.1 // indirect + github.com/yuin/goldmark v1.5.2 // indirect + github.com/yuin/goldmark-emoji v1.0.1 // indirect + golang.org/x/crypto v0.11.0 // indirect + golang.org/x/net v0.12.0 // indirect + golang.org/x/sync v0.1.0 // indirect + gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 76defff..6b6d9e1 100644 --- a/go.sum +++ b/go.sum @@ -547,8 +547,8 @@ github.com/muesli/termenv v0.7.4/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotC github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= github.com/muesli/termenv v0.14.0/go.mod h1:kG/pF1E7fh949Xhe156crRUrHNyK221IuGO7Ez60Uc8= -github.com/muesli/termenv v0.15.1 h1:UzuTb/+hhlBugQz28rpzey4ZuKcZ03MeKsoG7IJZIxs= -github.com/muesli/termenv v0.15.1/go.mod h1:HeAQPTzpfs016yGtA4g00CsdYnVLJvxsS4ANqrZs2sQ= +github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= +github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -704,8 +704,9 @@ golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -799,8 +800,10 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.6.0 h1:L4ZwwTvKW9gr0ZMS1yrHD9GZhIuVjOBBnaKH+SPQK0Q= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -932,13 +935,16 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -950,8 +956,9 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 9a3f7a19cbc8b5f272f798041f5f2917c3ccbb27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Thu, 24 Aug 2023 18:52:15 +0200 Subject: [PATCH 746/911] fix: replace string concatenation in loop with string builder (#505) --- main.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 17d66e7..86a089c 100644 --- a/main.go +++ b/main.go @@ -284,15 +284,16 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { // trim lines lines := strings.Split(string(out), "\n") - var content string + var cb strings.Builder for i, s := range lines { - content += strings.TrimSpace(s) + cb.WriteString(strings.TrimSpace(s)) // don't add an artificial newline after the last split if i+1 < len(lines) { - content += "\n" + cb.WriteString("\n") } } + content := cb.String() // display if pager || cmd.Flags().Changed("pager") { From 54dd62a2a43d36e10d075b2b3fe9b0f637f2e2b9 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Mon, 28 Aug 2023 09:05:12 -0300 Subject: [PATCH 747/911] fix: handle running inside a snap (#527) * fix: handle running inside a snap Signed-off-by: Carlos Alexandro Becker * test: fixes * docs: improve error message --------- Signed-off-by: Carlos Alexandro Becker Co-authored-by: bashbunni --- config_cmd.go | 20 ++++++++++++-------- editor/editor.go | 8 ++++++-- editor/editor_test.go | 13 ++++++++++++- ui/editor.go | 9 ++++++++- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/config_cmd.go b/config_cmd.go index a4cb584..caeaac7 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -23,13 +23,14 @@ pager: false width: 80` var configCmd = &cobra.Command{ - Use: "config", - Hidden: false, - Short: "Edit the glow config file", - Long: paragraph(fmt.Sprintf("\n%s the glow config file. We’ll use EDITOR to determine which editor to use. If the config file doesn't exist, it will be created.", keyword("Edit"))), - Example: paragraph("glow config\nglow config --config path/to/config.yml"), - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { + Use: "config", + Hidden: false, + Short: "Edit the glow config file", + Long: paragraph(fmt.Sprintf("\n%s the glow config file. We’ll use EDITOR to determine which editor to use. If the config file doesn't exist, it will be created.", keyword("Edit"))), + Example: paragraph("glow config\nglow config --config path/to/config.yml"), + Args: cobra.NoArgs, + SilenceUsage: true, + RunE: func(_ *cobra.Command, _ []string) error { if configFile == "" { scope := gap.NewScope(gap.User, "glow") @@ -64,7 +65,10 @@ var configCmd = &cobra.Command{ return err } - c := editor.Cmd(configFile) + c, err := editor.Cmd(configFile) + if err != nil { + return fmt.Errorf("could not edit %s: %w", configFile, err) + } c.Stdin = os.Stdin c.Stdout = os.Stdout c.Stderr = os.Stderr diff --git a/editor/editor.go b/editor/editor.go index bbfe6ff..304c9ac 100644 --- a/editor/editor.go +++ b/editor/editor.go @@ -1,6 +1,7 @@ package editor import ( + "fmt" "os" "os/exec" "strings" @@ -10,9 +11,12 @@ const defaultEditor = "nano" // Cmd returns a *exec.Cmd editing the given path with $EDITOR or nano if no // $EDITOR is set. -func Cmd(path string) *exec.Cmd { +func Cmd(path string) (*exec.Cmd, error) { + if os.Getenv("SNAP_REVISION") != "" { + return nil, fmt.Errorf("Did you install with Snap? Glow is sandboxed and unable to open an editor. Please install Glow with Go or another package manager to enable editing.") + } editor, args := getEditor() - return exec.Command(editor, append(args, path)...) + return exec.Command(editor, append(args, path)...), nil } func getEditor() (string, []string) { diff --git a/editor/editor_test.go b/editor/editor_test.go index 2d1b583..d8d5817 100644 --- a/editor/editor_test.go +++ b/editor/editor_test.go @@ -16,11 +16,22 @@ func TestEditor(t *testing.T) { } { t.Run(k, func(t *testing.T) { t.Setenv("EDITOR", k) - cmd := Cmd("README.md") + cmd, _ := Cmd("README.md") got := cmd.Args if !reflect.DeepEqual(got, v) { t.Fatalf("expected %v; got %v", v, got) } }) } + + t.Run("inside snap", func(t *testing.T) { + t.Setenv("SNAP_REVISION", "10") + got, err := Cmd("foo") + if err == nil { + t.Fatalf("expected an error, got nil") + } + if got != nil { + t.Fatalf("should have returned nil, got %v", got) + } + }) } diff --git a/ui/editor.go b/ui/editor.go index c38ef01..4c65962 100644 --- a/ui/editor.go +++ b/ui/editor.go @@ -11,5 +11,12 @@ func openEditor(path string) tea.Cmd { cb := func(err error) tea.Msg { return editorFinishedMsg{err} } - return tea.ExecProcess(editor.Cmd(path), cb) + + editor, err := editor.Cmd(path) + if err != nil { + return func() tea.Msg { + return errMsg{err} + } + } + return tea.ExecProcess(editor, cb) } From c991ec475d777f9656b29fd861ff4b38f5d8313c Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Fri, 17 Nov 2023 09:02:52 -0300 Subject: [PATCH 748/911] feat: use x/editor (#543) Signed-off-by: Carlos Alexandro Becker --- config_cmd.go | 4 ++-- editor/editor.go | 31 ------------------------------- editor/editor_test.go | 37 ------------------------------------- go.mod | 1 + go.sum | 2 ++ ui/editor.go | 4 ++-- 6 files changed, 7 insertions(+), 72 deletions(-) delete mode 100644 editor/editor.go delete mode 100644 editor/editor_test.go diff --git a/config_cmd.go b/config_cmd.go index caeaac7..a7e59e6 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -6,7 +6,7 @@ import ( "path" "path/filepath" - "github.com/charmbracelet/glow/editor" + "github.com/charmbracelet/x/editor" gap "github.com/muesli/go-app-paths" "github.com/spf13/cobra" ) @@ -65,7 +65,7 @@ var configCmd = &cobra.Command{ return err } - c, err := editor.Cmd(configFile) + c, err := editor.Cmd("Glow", configFile) if err != nil { return fmt.Errorf("could not edit %s: %w", configFile, err) } diff --git a/editor/editor.go b/editor/editor.go deleted file mode 100644 index 304c9ac..0000000 --- a/editor/editor.go +++ /dev/null @@ -1,31 +0,0 @@ -package editor - -import ( - "fmt" - "os" - "os/exec" - "strings" -) - -const defaultEditor = "nano" - -// Cmd returns a *exec.Cmd editing the given path with $EDITOR or nano if no -// $EDITOR is set. -func Cmd(path string) (*exec.Cmd, error) { - if os.Getenv("SNAP_REVISION") != "" { - return nil, fmt.Errorf("Did you install with Snap? Glow is sandboxed and unable to open an editor. Please install Glow with Go or another package manager to enable editing.") - } - editor, args := getEditor() - return exec.Command(editor, append(args, path)...), nil -} - -func getEditor() (string, []string) { - editor := strings.Fields(os.Getenv("EDITOR")) - if len(editor) > 1 { - return editor[0], editor[1:] - } - if len(editor) == 1 { - return editor[0], []string{} - } - return defaultEditor, []string{} -} diff --git a/editor/editor_test.go b/editor/editor_test.go deleted file mode 100644 index d8d5817..0000000 --- a/editor/editor_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package editor - -import ( - "reflect" - "testing" -) - -func TestEditor(t *testing.T) { - filename := "README.md" - for k, v := range map[string][]string{ - "": {"nano", filename}, - "nvim": {"nvim", filename}, - "vim": {"vim", filename}, - "vscode --foo": {"vscode", "--foo", filename}, - "nvim -a -b": {"nvim", "-a", "-b", filename}, - } { - t.Run(k, func(t *testing.T) { - t.Setenv("EDITOR", k) - cmd, _ := Cmd("README.md") - got := cmd.Args - if !reflect.DeepEqual(got, v) { - t.Fatalf("expected %v; got %v", v, got) - } - }) - } - - t.Run("inside snap", func(t *testing.T) { - t.Setenv("SNAP_REVISION", "10") - got, err := Cmd("foo") - if err == nil { - t.Fatalf("expected an error, got nil") - } - if got != nil { - t.Fatalf("should have returned nil, got %v", got) - } - }) -} diff --git a/go.mod b/go.mod index 94e8f2f..f72ce9c 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/charmbracelet/charm v0.8.7 github.com/charmbracelet/glamour v0.6.0 github.com/charmbracelet/lipgloss v0.6.0 + github.com/charmbracelet/x/editor v0.0.0-20231116172829-450eedbca1ab github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac github.com/mattn/go-runewidth v0.0.14 github.com/meowgorithm/babyenv v1.3.1 diff --git a/go.sum b/go.sum index 6b6d9e1..96ccc7d 100644 --- a/go.sum +++ b/go.sum @@ -234,6 +234,8 @@ github.com/charmbracelet/glamour v0.6.0/go.mod h1:taqWV4swIMMbWALc0m7AfE9JkPSU8o github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= github.com/charmbracelet/lipgloss v0.6.0 h1:1StyZB9vBSOyuZxQUcUwGr17JmojPNm87inij9N3wJY= github.com/charmbracelet/lipgloss v0.6.0/go.mod h1:tHh2wr34xcHjC2HCXIlGSG1jaDF0S0atAUvBMP6Ppuk= +github.com/charmbracelet/x/editor v0.0.0-20231116172829-450eedbca1ab h1:95WbogoQheYFuAUy1olU8OgxrHk2K86zA7mSNELiMfU= +github.com/charmbracelet/x/editor v0.0.0-20231116172829-450eedbca1ab/go.mod h1:lrin7iXW742pX5pePBEWhLPDTp53YW15r/Lp4Rcfg0M= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= diff --git a/ui/editor.go b/ui/editor.go index 4c65962..ff094fc 100644 --- a/ui/editor.go +++ b/ui/editor.go @@ -2,7 +2,7 @@ package ui import ( tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/glow/editor" + "github.com/charmbracelet/x/editor" ) type editorFinishedMsg struct{ err error } @@ -12,7 +12,7 @@ func openEditor(path string) tea.Cmd { return editorFinishedMsg{err} } - editor, err := editor.Cmd(path) + editor, err := editor.Cmd("Glow", path) if err != nil { return func() tea.Msg { return errMsg{err} From 1eacfb4ff1240d16811e48c4454a6ff627ee6d30 Mon Sep 17 00:00:00 2001 From: "K.B.Dharun Krishna" Date: Thu, 7 Dec 2023 17:49:20 +0530 Subject: [PATCH 749/911] docs: add Winget to Windows Install Options (#500) * README: add Winget to Windows Install Options * Update README.md Co-authored-by: Carlos Alexandro Becker --------- Co-authored-by: Carlos Alexandro Becker --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c36ed66..4862ad2 100644 --- a/README.md +++ b/README.md @@ -53,9 +53,10 @@ pkg install glow # Solus eopkg install glow -# Windows (with Scoop or Chocolatey) -scoop install glow +# Windows (with Chocolatey, Scoop, or Winget) choco install glow +scoop install glow +winget install charmbracelet.glow # Android (with termux) pkg install glow From bccf3d0cb7a8d87aff73061ba0b47873c3754ac5 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Tue, 13 Feb 2024 11:51:30 -0500 Subject: [PATCH 750/911] fix(ci): update coverage workflow --- .github/workflows/coverage.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 845096e..e7add05 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -24,5 +24,5 @@ jobs: COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | go test -race -covermode atomic -coverprofile=profile.cov ./... - GO111MODULE=off go get github.com/mattn/goveralls - $(go env GOPATH)/bin/goveralls -coverprofile=profile.cov -service=github + go install github.com/mattn/goveralls@latest + goveralls -coverprofile=profile.cov -service=github From 2b91a93645c3ad48760c4311aefe36852df437fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:00:18 -0500 Subject: [PATCH 751/911] feat(deps): bump golang.org/x/crypto from 0.11.0 to 0.17.0 (#569) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.11.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.11.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 12 ++++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index f72ce9c..b86a467 100644 --- a/go.mod +++ b/go.mod @@ -22,9 +22,9 @@ require ( github.com/segmentio/ksuid v1.0.4 github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.14.0 - golang.org/x/sys v0.10.0 - golang.org/x/term v0.10.0 - golang.org/x/text v0.11.0 + golang.org/x/sys v0.15.0 + golang.org/x/term v0.15.0 + golang.org/x/text v0.14.0 ) require ( @@ -62,7 +62,7 @@ require ( github.com/subosito/gotenv v1.4.1 // indirect github.com/yuin/goldmark v1.5.2 // indirect github.com/yuin/goldmark-emoji v1.0.1 // indirect - golang.org/x/crypto v0.11.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.12.0 // indirect golang.org/x/sync v0.1.0 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect diff --git a/go.sum b/go.sum index 96ccc7d..dc948eb 100644 --- a/go.sum +++ b/go.sum @@ -707,8 +707,9 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -939,14 +940,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -959,8 +962,9 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 6d86484b5e648c129a5cb9256a5867978a854992 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:08:10 -0500 Subject: [PATCH 752/911] feat(deps): bump golang.org/x/net from 0.12.0 to 0.17.0 (#568) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.12.0 to 0.17.0. - [Commits](https://github.com/golang/net/compare/v0.12.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index b86a467..2cdf05a 100644 --- a/go.mod +++ b/go.mod @@ -63,7 +63,7 @@ require ( github.com/yuin/goldmark v1.5.2 // indirect github.com/yuin/goldmark-emoji v1.0.1 // indirect golang.org/x/crypto v0.17.0 // indirect - golang.org/x/net v0.12.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.1.0 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index dc948eb..3c22627 100644 --- a/go.sum +++ b/go.sum @@ -707,7 +707,7 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -805,8 +805,8 @@ golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -940,14 +940,14 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -962,7 +962,7 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From d9bb637f5e6be406c7bfd51af287bec890c0fd32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:37:42 -0500 Subject: [PATCH 753/911] feat(deps): bump github.com/charmbracelet/bubbletea (#567) --- go.mod | 4 ++-- go.sum | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 2cdf05a..9d1c369 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.17 require ( github.com/atotto/clipboard v0.1.4 github.com/charmbracelet/bubbles v0.15.0 - github.com/charmbracelet/bubbletea v0.23.2 + github.com/charmbracelet/bubbletea v0.25.0 github.com/charmbracelet/charm v0.8.7 github.com/charmbracelet/glamour v0.6.0 github.com/charmbracelet/lipgloss v0.6.0 @@ -32,7 +32,7 @@ require ( github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/calmh/randomart v1.1.0 // indirect - github.com/containerd/console v1.0.3 // indirect + github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect github.com/dlclark/regexp2 v1.4.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect diff --git a/go.sum b/go.sum index 3c22627..21a7083 100644 --- a/go.sum +++ b/go.sum @@ -225,8 +225,9 @@ github.com/charmbracelet/bubbles v0.15.0 h1:c5vZ3woHV5W2b8YZI1q7v4ZNQaPetfHuoHzx github.com/charmbracelet/bubbles v0.15.0/go.mod h1:Y7gSFbBzlMpUDR/XM9MhZI374Q+1p1kluf1uLl8iK74= github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= github.com/charmbracelet/bubbletea v0.23.1/go.mod h1:JAfGK/3/pPKHTnAS8JIE2u9f61BjWTQY57RbT25aMXU= -github.com/charmbracelet/bubbletea v0.23.2 h1:vuUJ9HJ7b/COy4I30e8xDVQ+VRDUEFykIjryPfgsdps= github.com/charmbracelet/bubbletea v0.23.2/go.mod h1:FaP3WUivcTM0xOKNmhciz60M6I+weYLF76mr1JyI7sM= +github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt5dywy4TcM= +github.com/charmbracelet/bubbletea v0.25.0/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg= github.com/charmbracelet/charm v0.8.7 h1:FJ9b7IxWUWHOPR72zS/QJLEqtudOB2Mwfc+Sir0eZR8= github.com/charmbracelet/charm v0.8.7/go.mod h1:ApJYwJljEjODkOYJgFDzbUqztLrCWQct9zyPD+xcVr4= github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc= @@ -252,8 +253,9 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -936,6 +938,7 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -946,6 +949,7 @@ golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= @@ -959,6 +963,7 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= From dd035fb4414cc2c3d28cc4858972a3d07a778947 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Tue, 13 Feb 2024 12:43:41 -0500 Subject: [PATCH 754/911] chore(ci): change dependabot pr's title --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9fc3b07..c0e481b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,7 +7,7 @@ updates: labels: - "dependencies" commit-message: - prefix: "feat" + prefix: "chore" include: "scope" - package-ecosystem: "github-actions" directory: "/" From 8221279fa39ef0cb39935d07350fa90def46c4d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:54:12 -0500 Subject: [PATCH 755/911] chore(deps): bump actions/setup-go from 4 to 5 (#573) Bumps [actions/setup-go](https://github.com/actions/setup-go) from 4 to 5. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index e7add05..ae114dc 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -12,7 +12,7 @@ jobs: GO111MODULE: "on" steps: - name: Install Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }} From 64cc6a6baade28418cc9fa94137d212f95c03b52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:54:24 -0500 Subject: [PATCH 756/911] chore(deps): bump actions/checkout from 3 to 4 (#574) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/coverage.yml | 2 +- .github/workflows/lint.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index ae114dc..d197e45 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -17,7 +17,7 @@ jobs: go-version: ${{ matrix.go-version }} - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Coverage env: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d0bb996..2c2307d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,7 +8,7 @@ jobs: name: lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: golangci-lint uses: golangci/golangci-lint-action@v3 with: From 79c39932fb428bd305b18759c3e4e6ecdaa82ae2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:54:32 -0500 Subject: [PATCH 757/911] chore(deps): bump golangci/golangci-lint-action from 3 to 4 (#572) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 3 to 4. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v3...v4) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 2c2307d..be5fbb2 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: golangci-lint - uses: golangci/golangci-lint-action@v3 + uses: golangci/golangci-lint-action@v4 with: # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 From f1437fce69ea2917336ca9db2fa77998d7148fe8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:54:52 -0500 Subject: [PATCH 758/911] chore(deps): bump github.com/dustin/go-humanize (#575) Bumps [github.com/dustin/go-humanize](https://github.com/dustin/go-humanize) from 1.0.1-0.20200219035652-afde56e7acac to 1.0.1. - [Commits](https://github.com/dustin/go-humanize/commits/v1.0.1) --- updated-dependencies: - dependency-name: github.com/dustin/go-humanize dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9d1c369..7c064e7 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/charmbracelet/glamour v0.6.0 github.com/charmbracelet/lipgloss v0.6.0 github.com/charmbracelet/x/editor v0.0.0-20231116172829-450eedbca1ab - github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac + github.com/dustin/go-humanize v1.0.1 github.com/mattn/go-runewidth v0.0.14 github.com/meowgorithm/babyenv v1.3.1 github.com/mitchellh/go-homedir v1.1.0 diff --git a/go.sum b/go.sum index 21a7083..7b8f231 100644 --- a/go.sum +++ b/go.sum @@ -275,8 +275,8 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8 github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac h1:opbrjaN/L8gg6Xh5D04Tem+8xVcz6ajZlGCs49mQgyg= -github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= From ec12c2717d62a913368f978fea04b5107666e3e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:59:13 -0500 Subject: [PATCH 759/911] feat(deps): bump golang.org/x/sys from 0.15.0 to 0.17.0 (#570) Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.15.0 to 0.17.0. - [Commits](https://github.com/golang/sys/compare/v0.15.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 7c064e7..754ae54 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/segmentio/ksuid v1.0.4 github.com/spf13/cobra v1.6.1 github.com/spf13/viper v1.14.0 - golang.org/x/sys v0.15.0 + golang.org/x/sys v0.17.0 golang.org/x/term v0.15.0 golang.org/x/text v0.14.0 ) diff --git a/go.sum b/go.sum index 7b8f231..ba83d03 100644 --- a/go.sum +++ b/go.sum @@ -944,8 +944,9 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= From feefb88e70298a68c3a000548bf933a16ecbddc7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:59:24 -0500 Subject: [PATCH 760/911] chore(deps): bump github.com/spf13/cobra from 1.6.1 to 1.8.0 (#577) Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.6.1 to 1.8.0. - [Release notes](https://github.com/spf13/cobra/releases) - [Commits](https://github.com/spf13/cobra/compare/v1.6.1...v1.8.0) --- updated-dependencies: - dependency-name: github.com/spf13/cobra dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 754ae54..0949d2c 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/muesli/termenv v0.15.2 github.com/sahilm/fuzzy v0.1.0 github.com/segmentio/ksuid v1.0.4 - github.com/spf13/cobra v1.6.1 + github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.14.0 golang.org/x/sys v0.17.0 golang.org/x/term v0.15.0 @@ -39,7 +39,7 @@ require ( github.com/google/uuid v1.3.0 // indirect github.com/gorilla/css v1.0.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.6 // indirect github.com/mattn/go-isatty v0.0.18 // indirect diff --git a/go.sum b/go.sum index ba83d03..80ea2da 100644 --- a/go.sum +++ b/go.sum @@ -264,7 +264,7 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -447,8 +447,8 @@ github.com/hashicorp/serf v0.9.8/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpT github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -629,8 +629,8 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= From cece1377cdb109dfd2405d63e419c03eea7fcfd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:59:38 -0500 Subject: [PATCH 761/911] chore(deps): bump github.com/mattn/go-runewidth from 0.0.14 to 0.0.15 (#576) Bumps [github.com/mattn/go-runewidth](https://github.com/mattn/go-runewidth) from 0.0.14 to 0.0.15. - [Commits](https://github.com/mattn/go-runewidth/compare/v0.0.14...v0.0.15) --- updated-dependencies: - dependency-name: github.com/mattn/go-runewidth dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 0949d2c..bf98dcb 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/charmbracelet/lipgloss v0.6.0 github.com/charmbracelet/x/editor v0.0.0-20231116172829-450eedbca1ab github.com/dustin/go-humanize v1.0.1 - github.com/mattn/go-runewidth v0.0.14 + github.com/mattn/go-runewidth v0.0.15 github.com/meowgorithm/babyenv v1.3.1 github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.2.0 diff --git a/go.sum b/go.sum index 80ea2da..deeaa1e 100644 --- a/go.sum +++ b/go.sum @@ -505,8 +505,9 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/meowgorithm/babyenv v1.3.1 h1:18ZEYIgbzoFQfRLF9+lxjRfk/ui6w8U0FWl07CgWvvc= From 2430b0af3fd83bf776875da464a885bdb5f88d38 Mon Sep 17 00:00:00 2001 From: Maas Lalani Date: Wed, 28 Feb 2024 21:01:11 -0500 Subject: [PATCH 762/911] Create CODEOWNERS --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..d834ea6 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @meowgorithm @muesli From d2e7742a6abb52866c69d71e430e3eee82785148 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Wed, 22 May 2024 11:48:31 -0400 Subject: [PATCH 763/911] chore(ci): enable gofumpt --- .golangci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.golangci.yml b/.golangci.yml index 85cfb6d..4cbe16f 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -20,6 +20,7 @@ linters: - goconst - godot - godox + - gofumpt - goimports - goprintffuncname - gosec From fce3edf7dbaea4c3bb64e19c68e230474b27a305 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 3 Jul 2024 12:11:29 -0300 Subject: [PATCH 764/911] feat!: cleanup and updated (#619) * feat!: cleanup Signed-off-by: Carlos Alexandro Becker * more cleanup Signed-off-by: Carlos Alexandro Becker * fix: more cleanup Signed-off-by: Carlos Alexandro Becker * fix: more cleanup --------- Signed-off-by: Carlos Alexandro Becker --- .golangci.yml | 2 +- Makefile | 7 +- README.md | 52 +-- config_cmd.go | 94 ++--- go.mod | 77 ++-- go.sum | 875 +++++-------------------------------------- log.go | 27 ++ main.go | 160 ++++---- stash_cmd.go | 82 ---- style.go | 8 +- ui/config.go | 16 +- ui/consts_unix.go | 8 - ui/consts_windows.go | 7 - ui/doctypes.go | 90 ----- ui/doctypes_test.go | 48 --- ui/editor.go | 9 +- ui/ignore_darwin.go | 7 +- ui/ignore_general.go | 4 +- ui/markdown.go | 126 +------ ui/pager.go | 390 +++++-------------- ui/sort.go | 12 + ui/stash.go | 732 +++--------------------------------- ui/stashhelp.go | 44 +-- ui/stashitem.go | 134 +++---- ui/styles.go | 110 ++---- ui/ui.go | 466 +++-------------------- utils/utils.go | 75 ++++ 27 files changed, 696 insertions(+), 2966 deletions(-) create mode 100644 log.go delete mode 100644 stash_cmd.go delete mode 100644 ui/consts_unix.go delete mode 100644 ui/consts_windows.go delete mode 100644 ui/doctypes.go delete mode 100644 ui/doctypes_test.go create mode 100644 ui/sort.go diff --git a/.golangci.yml b/.golangci.yml index 4cbe16f..2d4d24e 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -24,7 +24,7 @@ linters: - goimports - goprintffuncname - gosec - - ifshort + # - ifshort - misspell - prealloc - revive diff --git a/Makefile b/Makefile index 6d80864..4985f56 100644 --- a/Makefile +++ b/Makefile @@ -2,8 +2,6 @@ .PHONY: default clean glow run log -LOGFILE := debug.log - default: glow clean: @@ -13,8 +11,7 @@ glow: go build run: clean glow - GLOW_LOGFILE=$(LOGFILE) ./glow + ./glow log: - > $(LOGFILE) - tail -f $(LOGFILE) + tail -f ~/.cache/glow/glow.log diff --git a/README.md b/README.md index 4862ad2..3750751 100644 --- a/README.md +++ b/README.md @@ -20,13 +20,9 @@ Glow is a terminal based markdown reader designed from the ground up to bring out the beauty—and power—of the CLI. Use it to discover markdown files, read documentation directly on the command -line and stash markdown files to your own private collection, so you can read -them anywhere. Glow will find local markdown files in subdirectories or a local +line. Glow will find local markdown files in subdirectories or a local Git repository. -By the way, all data stashed is encrypted end-to-end: only you can decrypt it. -More on that below. - ## Installation ### Package Manager @@ -84,6 +80,7 @@ packages. ARM builds are also available for macOS, Linux, FreeBSD and OpenBSD. ### Go Or just install it with `go`: + ```bash go install github.com/charmbracelet/glow@latest ``` @@ -98,11 +95,10 @@ go build [releases]: https://github.com/charmbracelet/glow/releases - ## The TUI Simply run `glow` without arguments to start the textual user interface and -browse local and stashed markdown. Glow will find local markdown files in the +browse local. Glow will find local markdown files in the current directory and below or, if you’re in a Git repository, Glow will search the repo. @@ -110,15 +106,6 @@ Markdown files can be read with Glow's high-performance pager. Most of the keystrokes you know from `less` are the same, but you can press `?` to list the hotkeys. -### Stashing - -Glow works with the Charm Cloud to allow you to store any markdown files in -your own private collection. You can stash a local document from the Glow TUI by -pressing `s`. - -Stashing is private, its contents will not be exposed publicly, and it's -encrypted end-to-end. More on encryption below. - ## The CLI In addition to a TUI, Glow has a CLI for working with Markdown. To format a @@ -138,18 +125,6 @@ glow github.com/charmbracelet/glow glow https://host.tld/file.md ``` -### Stashing - -You can also stash documents from the CLI: - -```bash -glow stash README.md -``` - -Then, when you run `glow` without arguments will you can browse through your -stashed documents. This is a great way to keep track of things that you need to -reference often. - ### Word Wrapping The `-w` flag lets you set a maximum width at which the output will be wrapped: @@ -211,32 +186,19 @@ pager: true width: 80 ``` -## 🔒 Encryption: How It Works - -Encryption works by issuing symmetric keys (basically a generated password) and -encrypting it with the local SSH public key generated by the open-source -[charm][charmlib] library. That encrypted key is then sent up to our server. -We can’t read it since we don’t have your private key. When you want to decrypt -something or view your stash, that key is downloaded from our server and -decrypted locally using the SSH private key. When you link accounts, the -symmetric key is encrypted for each new public key. This happens on your -machine and not our server, so we never see any unencrypted data. - -[charmlib]: https://github.com/charmbracelet/charm - ## Feedback We’d love to hear your thoughts on this project. Feel free to drop us a note! -* [Twitter](https://twitter.com/charmcli) -* [The Fediverse](https://mastodon.social/@charmcli) -* [Discord](https://charm.sh/chat) +- [Twitter](https://twitter.com/charmcli) +- [The Fediverse](https://mastodon.social/@charmcli) +- [Discord](https://charm.sh/chat) ## License [MIT](https://github.com/charmbracelet/glow/raw/master/LICENSE) -*** +--- Part of [Charm](https://charm.sh). diff --git a/config_cmd.go b/config_cmd.go index a7e59e6..902ea82 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -13,61 +13,35 @@ import ( const defaultConfig = `# style name or JSON path (default "auto") style: "auto" -# show local files only; no network (TUI-mode only) -local: false # mouse support (TUI-mode only) mouse: false # use pager to display markdown pager: false # word-wrap at width -width: 80` +width: 80 +` + +func defaultConfigFile() string { + scope := gap.NewScope(gap.User, "glow") + path, _ := scope.ConfigPath("glow.yml") + return path +} var configCmd = &cobra.Command{ - Use: "config", - Hidden: false, - Short: "Edit the glow config file", - Long: paragraph(fmt.Sprintf("\n%s the glow config file. We’ll use EDITOR to determine which editor to use. If the config file doesn't exist, it will be created.", keyword("Edit"))), - Example: paragraph("glow config\nglow config --config path/to/config.yml"), - Args: cobra.NoArgs, - SilenceUsage: true, - RunE: func(_ *cobra.Command, _ []string) error { - if configFile == "" { - scope := gap.NewScope(gap.User, "glow") - - var err error - configFile, err = scope.ConfigPath("glow.yml") - if err != nil { - return err - } - } - - if ext := path.Ext(configFile); ext != ".yaml" && ext != ".yml" { - return fmt.Errorf("'%s' is not a supported config type: use '%s' or '%s'", ext, ".yaml", ".yml") - } - - if _, err := os.Stat(configFile); os.IsNotExist(err) { - // File doesn't exist yet, create all necessary directories and - // write the default config file - if err := os.MkdirAll(filepath.Dir(configFile), 0o700); err != nil { - return err - } - - f, err := os.Create(configFile) - if err != nil { - return err - } - defer func() { _ = f.Close() }() - - if _, err := f.WriteString(defaultConfig); err != nil { - return err - } - } else if err != nil { // some other error occurred + Use: "config", + Hidden: false, + Short: "Edit the glow config file", + Long: paragraph(fmt.Sprintf("\n%s the glow config file. We’ll use EDITOR to determine which editor to use. If the config file doesn't exist, it will be created.", keyword("Edit"))), + Example: paragraph("glow config\nglow config --config path/to/config.yml"), + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + if err := ensureConfigFile(); err != nil { return err } c, err := editor.Cmd("Glow", configFile) if err != nil { - return fmt.Errorf("could not edit %s: %w", configFile, err) + return err } c.Stdin = os.Stdin c.Stdout = os.Stdout @@ -80,3 +54,37 @@ var configCmd = &cobra.Command{ return nil }, } + +func ensureConfigFile() error { + if configFile == "" { + configFile = defaultConfigFile() + if err := os.MkdirAll(filepath.Dir(configFile), 0o755); err != nil { + return fmt.Errorf("Could not write config file: %w", err) + } + } + + if ext := path.Ext(configFile); ext != ".yaml" && ext != ".yml" { + return fmt.Errorf("'%s' is not a supported config type: use '%s' or '%s'", ext, ".yaml", ".yml") + } + + if _, err := os.Stat(configFile); os.IsNotExist(err) { + // File doesn't exist yet, create all necessary directories and + // write the default config file + if err := os.MkdirAll(filepath.Dir(configFile), 0o700); err != nil { + return err + } + + f, err := os.Create(configFile) + if err != nil { + return err + } + defer func() { _ = f.Close() }() + + if _, err := f.WriteString(defaultConfig); err != nil { + return err + } + } else if err != nil { // some other error occurred + return err + } + return nil +} diff --git a/go.mod b/go.mod index bf98dcb..c92758b 100644 --- a/go.mod +++ b/go.mod @@ -1,72 +1,73 @@ module github.com/charmbracelet/glow -go 1.17 +go 1.21.4 require ( + github.com/adrg/xdg v0.4.0 github.com/atotto/clipboard v0.1.4 - github.com/charmbracelet/bubbles v0.15.0 - github.com/charmbracelet/bubbletea v0.25.0 - github.com/charmbracelet/charm v0.8.7 - github.com/charmbracelet/glamour v0.6.0 - github.com/charmbracelet/lipgloss v0.6.0 - github.com/charmbracelet/x/editor v0.0.0-20231116172829-450eedbca1ab + github.com/caarlos0/env/v11 v11.0.1 + github.com/charmbracelet/bubbles v0.18.0 + github.com/charmbracelet/bubbletea v0.26.4 + github.com/charmbracelet/glamour v0.6.1-0.20230519131405-7528eaad6620 + github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd + github.com/charmbracelet/log v0.4.0 + github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d github.com/dustin/go-humanize v1.0.1 github.com/mattn/go-runewidth v0.0.15 - github.com/meowgorithm/babyenv v1.3.1 github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.2.0 github.com/muesli/go-app-paths v0.2.2 github.com/muesli/reflow v0.3.0 github.com/muesli/termenv v0.15.2 - github.com/sahilm/fuzzy v0.1.0 - github.com/segmentio/ksuid v1.0.4 - github.com/spf13/cobra v1.8.0 - github.com/spf13/viper v1.14.0 - golang.org/x/sys v0.17.0 - golang.org/x/term v0.15.0 - golang.org/x/text v0.14.0 + github.com/sahilm/fuzzy v0.1.1 + github.com/spf13/cobra v1.7.0 + github.com/spf13/viper v1.15.0 + golang.org/x/sys v0.21.0 + golang.org/x/term v0.21.0 + golang.org/x/text v0.16.0 ) require ( - github.com/alecthomas/chroma v0.10.0 // indirect + github.com/alecthomas/chroma/v2 v2.8.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect - github.com/calmh/randomart v1.1.0 // indirect - github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect - github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect + github.com/charmbracelet/x/ansi v0.1.2 // indirect + github.com/charmbracelet/x/input v0.1.2 // indirect + github.com/charmbracelet/x/term v0.1.1 // indirect + github.com/charmbracelet/x/windows v0.1.2 // indirect github.com/dlclark/regexp2 v1.4.0 // indirect + github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/gorilla/css v1.0.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/kr/pretty v0.3.1 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/mattn/go-isatty v0.0.18 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect - github.com/microcosm-cc/bluemonday v1.0.21 // indirect - github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a // indirect + github.com/microcosm-cc/bluemonday v1.0.25 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b // indirect + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect - github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/rivo/uniseg v0.2.0 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 // indirect - github.com/spf13/afero v1.9.2 // indirect + github.com/spf13/afero v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/subosito/gotenv v1.4.1 // indirect - github.com/yuin/goldmark v1.5.2 // indirect - github.com/yuin/goldmark-emoji v1.0.1 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sync v0.1.0 // indirect - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect + github.com/subosito/gotenv v1.4.2 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + github.com/yuin/goldmark v1.5.4 // indirect + github.com/yuin/goldmark-emoji v1.0.2 // indirect + golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sync v0.7.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index deeaa1e..cdfa083 100644 --- a/go.sum +++ b/go.sum @@ -17,264 +17,78 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/firestore v1.8.0/go.mod h1:r3KB8cAdRIe8znzoPWLw8S6gpDVd9treohhn8b09424= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= -github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= +github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= +github.com/alecthomas/assert/v2 v2.2.1 h1:XivOgYcduV98QCahG8T5XTezV5bylXe+lBxLG2K2ink= +github.com/alecthomas/assert/v2 v2.2.1/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= +github.com/alecthomas/chroma/v2 v2.8.0 h1:w9WJUjFFmHHB2e8mRpL9jjy3alYDlU0QLDezj1xE264= +github.com/alecthomas/chroma/v2 v2.8.0/go.mod h1:yrkMI9807G1ROx13fhe1v6PN2DDeaR73L3d+1nmYQtw= +github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= +github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= -github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= -github.com/aymanbagabas/go-osc52 v1.2.1 h1:q2sWUyDcozPLcLabEMd+a+7Ea2DitxZVN9hTxab9L4E= -github.com/aymanbagabas/go-osc52 v1.2.1/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/calmh/randomart v1.1.0 h1:evl+iwc10LXtHdMZhzLxmsCQVmWnkXs44SbC6Uk0Il8= -github.com/calmh/randomart v1.1.0/go.mod h1:DQUbPVyP+7PAs21w/AnfMKG5NioxS3TbZ2F9MSK/jFM= +github.com/caarlos0/env/v11 v11.0.1 h1:A8dDt9Ub9ybqRSUF3fQc/TA/gTam2bKT4Pit+cwrsPs= +github.com/caarlos0/env/v11 v11.0.1/go.mod h1:2RC3HQu8BQqtEK3V4iHPxj0jOdWdbPpWJ6pOueeU1xM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGimk1BE6cmHijOkM= -github.com/charmbracelet/bubbles v0.15.0 h1:c5vZ3woHV5W2b8YZI1q7v4ZNQaPetfHuoHzx+56Z6TI= -github.com/charmbracelet/bubbles v0.15.0/go.mod h1:Y7gSFbBzlMpUDR/XM9MhZI374Q+1p1kluf1uLl8iK74= -github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= -github.com/charmbracelet/bubbletea v0.23.1/go.mod h1:JAfGK/3/pPKHTnAS8JIE2u9f61BjWTQY57RbT25aMXU= -github.com/charmbracelet/bubbletea v0.23.2/go.mod h1:FaP3WUivcTM0xOKNmhciz60M6I+weYLF76mr1JyI7sM= -github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt5dywy4TcM= -github.com/charmbracelet/bubbletea v0.25.0/go.mod h1:EN3QDR1T5ZdWmdfDzYcqOCAps45+QIJbLOBxmVNWNNg= -github.com/charmbracelet/charm v0.8.7 h1:FJ9b7IxWUWHOPR72zS/QJLEqtudOB2Mwfc+Sir0eZR8= -github.com/charmbracelet/charm v0.8.7/go.mod h1:ApJYwJljEjODkOYJgFDzbUqztLrCWQct9zyPD+xcVr4= -github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc= -github.com/charmbracelet/glamour v0.6.0/go.mod h1:taqWV4swIMMbWALc0m7AfE9JkPSU8om2538k9ITBxOc= -github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= -github.com/charmbracelet/lipgloss v0.6.0 h1:1StyZB9vBSOyuZxQUcUwGr17JmojPNm87inij9N3wJY= -github.com/charmbracelet/lipgloss v0.6.0/go.mod h1:tHh2wr34xcHjC2HCXIlGSG1jaDF0S0atAUvBMP6Ppuk= -github.com/charmbracelet/x/editor v0.0.0-20231116172829-450eedbca1ab h1:95WbogoQheYFuAUy1olU8OgxrHk2K86zA7mSNELiMfU= -github.com/charmbracelet/x/editor v0.0.0-20231116172829-450eedbca1ab/go.mod h1:lrin7iXW742pX5pePBEWhLPDTp53YW15r/Lp4Rcfg0M= +github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= +github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= +github.com/charmbracelet/bubbletea v0.26.4 h1:2gDkkzLZaTjMl/dQBpNVtnvcCxsh/FCkimep7FC9c40= +github.com/charmbracelet/bubbletea v0.26.4/go.mod h1:P+r+RRA5qtI1DOHNFn0otoNwB4rn+zNAzSj/EXz6xU0= +github.com/charmbracelet/glamour v0.6.1-0.20230519131405-7528eaad6620 h1:kjH+o66+/WLisZBZ+30/5Z6UQk69KVFdqcjr7mlMC8Y= +github.com/charmbracelet/glamour v0.6.1-0.20230519131405-7528eaad6620/go.mod h1:swCB3CXFsh22H1ESDYdY1tirLiNqCziulDyJ1B6Nt7Q= +github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd h1:vK2fQGG+d7VMa/Ly4f6HoCqzTGC8wnwl4dKulWCHaH0= +github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd/go.mod h1:U8h88bAaHc+dNaV2UXjn0U3WChVxskgaD8/52JAIupM= +github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM= +github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM= +github.com/charmbracelet/x/ansi v0.1.2 h1:6+LR39uG8DE6zAmbu023YlqjJHkYXDF1z36ZwzO4xZY= +github.com/charmbracelet/x/ansi v0.1.2/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= +github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d h1:QCbdJx9CBznXPO5Wk/5FWXft/mSPzeWX5HMdIH9bNAA= +github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d/go.mod h1:oivrEbcP/AYt/Hpvk5pwDXXrQ933gQS6UzL6fxqAGSA= +github.com/charmbracelet/x/input v0.1.2 h1:QJAZr33eOhDowkkEQ24rsJy4Llxlm+fRDf/cQrmqJa0= +github.com/charmbracelet/x/input v0.1.2/go.mod h1:LGBim0maUY4Pitjn/4fHnuXb4KirU3DODsyuHuXdOyA= +github.com/charmbracelet/x/term v0.1.1 h1:3cosVAiPOig+EV4X9U+3LDgtwwAoEzJjNdwbXDjF6yI= +github.com/charmbracelet/x/term v0.1.1/go.mod h1:wB1fHt5ECsu3mXYusyzcngVWWlu1KKUmmLhfgr/Flxw= +github.com/charmbracelet/x/windows v0.1.2 h1:Iumiwq2G+BRmgoayww/qfcvof7W/3uLoelhxojXlRWg= +github.com/charmbracelet/x/windows v0.1.2/go.mod h1:GLEO/l+lizvFDBPLIOk+49gdX49L9YWMB5t+DZd0jkQ= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= -github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -282,40 +96,22 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -323,8 +119,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -339,10 +133,6 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -353,20 +143,12 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -377,342 +159,141 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.15.3/go.mod h1:/g/qgcoBcEXALCNZgRRisyTW0nY86++L0KbeAMXYCeY= -github.com/hashicorp/consul/sdk v0.11.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hashicorp/serf v0.9.8/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= -github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= -github.com/meowgorithm/babyenv v1.3.1 h1:18ZEYIgbzoFQfRLF9+lxjRfk/ui6w8U0FWl07CgWvvc= -github.com/meowgorithm/babyenv v1.3.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= -github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg= -github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a h1:eU8j/ClY2Ty3qdHnn0TyW3ivFoPC/0F1gQZz8yTxbbE= -github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg= +github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34= -github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/gitcha v0.2.0 h1:+wOgT2dI9s2Tznj1t1rb/qkK5e0cb6qD8c4IX2TR/YY= github.com/muesli/gitcha v0.2.0/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= -github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/go-app-paths v0.2.2 h1:NqG4EEZwNIhBq/pREgfBmgDmt3h1Smr1MjZiXbpZUnI= github.com/muesli/go-app-paths v0.2.2/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= -github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= -github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= -github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= -github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= -github.com/muesli/termenv v0.7.4/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= -github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= -github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= -github.com/muesli/termenv v0.14.0/go.mod h1:kG/pF1E7fh949Xhe156crRUrHNyK221IuGO7Ez60Uc8= github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= -github.com/sagikazarmark/crypt v0.8.0/go.mod h1:TmKwZAo97S4Fy4sfMH/HX/cQP5D+ijra2NyLpNNmttY= -github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= -github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c= -github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/sahilm/fuzzy v0.1.1 h1:ceu5RHF8DGgoi+/dR5PsECjCDH1BE3Fnmpo7aVXOdRA= +github.com/sahilm/fuzzy v0.1.1/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= +github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= +github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.14.0 h1:Rg7d3Lo706X9tHsJMUjdiwMpHB7W8WnSVOssIY+JElU= -github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As= +github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= +github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.5.2 h1:ALmeCk/px5FSm1MAcFBAsVKZjDuMVj8Tm7FFIlMJnqU= -github.com/yuin/goldmark v1.5.2/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark-emoji v1.0.1 h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os= -github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/v2 v2.305.5/go.mod h1:zQjKllfqfBVyVStbt4FaosoX2iYd8fV/GRy/PbowgP4= -go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c= +github.com/yuin/goldmark v1.3.7/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.5.4 h1:2uY/xC0roWy8IBEGLgB1ywIoEJFGmRrX21YQcvGZzjU= +github.com/yuin/goldmark v1.5.4/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark-emoji v1.0.2 h1:c/RgTShNgHTtc6xdz2KKI74jJr6rWi7FPgnP9GAsO5s= +github.com/yuin/goldmark-emoji v1.0.2/go.mod h1:RhP/RWpexdp+KHs7ghKnifRoIs/Bq4nDS7tRbCkOwKY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -723,6 +304,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuhGX/+R1ZpfJ4/ia80JM= +golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -736,7 +319,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -747,26 +329,18 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -783,33 +357,11 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -819,21 +371,6 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -844,37 +381,21 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -886,97 +407,36 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201020230747-6e5568b54d1a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -990,7 +450,6 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1015,7 +474,6 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -1024,24 +482,12 @@ golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1061,36 +507,6 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1121,7 +537,6 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -1134,76 +549,9 @@ google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -1215,30 +563,9 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1249,32 +576,15 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1287,4 +597,3 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/log.go b/log.go new file mode 100644 index 0000000..330db7c --- /dev/null +++ b/log.go @@ -0,0 +1,27 @@ +package main + +import ( + "os" + + "github.com/adrg/xdg" + "github.com/charmbracelet/log" +) + +func getLogFilePath() (string, error) { + return xdg.CacheFile("glow/glow.log") +} + +func setupLog() (func() error, error) { + // Log to file, if set + logFile, err := getLogFilePath() + if err != nil { + return nil, err + } + f, err := os.OpenFile(logFile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0o644) + if err != nil { + return nil, err + } + log.SetOutput(f) + log.SetLevel(log.DebugLevel) + return f.Close, nil +} diff --git a/main.go b/main.go index 86a089c..4aac4e7 100644 --- a/main.go +++ b/main.go @@ -11,11 +11,11 @@ import ( "path/filepath" "strings" - tea "github.com/charmbracelet/bubbletea" + "github.com/caarlos0/env/v11" "github.com/charmbracelet/glamour" "github.com/charmbracelet/glow/ui" "github.com/charmbracelet/glow/utils" - "github.com/meowgorithm/babyenv" + "github.com/charmbracelet/log" gap "github.com/muesli/go-app-paths" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -34,17 +34,21 @@ var ( style string width uint showAllFiles bool - localOnly bool mouse bool rootCmd = &cobra.Command{ - Use: "glow [SOURCE|DIR]", - Short: "Render markdown on the CLI, with pizzazz!", - Long: paragraph(fmt.Sprintf("\nRender markdown on the CLI, %s!", keyword("with pizzazz"))), + Use: "glow [SOURCE|DIR]", + Short: "Render markdown on the CLI, with pizzazz!", + Long: paragraph( + fmt.Sprintf("\nRender markdown on the CLI, %s!", keyword("with pizzazz")), + ), SilenceErrors: false, - SilenceUsage: false, + SilenceUsage: true, TraverseChildren: true, - RunE: execute, + PersistentPreRunE: func(cmd *cobra.Command, _ []string) error { + return validateOptions(cmd) + }, + RunE: execute, } ) @@ -103,7 +107,10 @@ func sourceFromArg(arg string) (*source, error) { st, err := os.Stat(arg) if err == nil && st.IsDir() { var src *source - _ = filepath.Walk(arg, func(path string, info os.FileInfo, err error) error { + _ = filepath.Walk(arg, func(path string, _ os.FileInfo, err error) error { + if err != nil { + return err + } for _, v := range readmeNames { if strings.EqualFold(filepath.Base(path), v) { r, err := os.Open(path) @@ -137,13 +144,12 @@ func sourceFromArg(arg string) (*source, error) { func validateOptions(cmd *cobra.Command) error { // grab config values from Viper width = viper.GetUint("width") - localOnly = viper.GetBool("local") mouse = viper.GetBool("mouse") pager = viper.GetBool("pager") // validate the glamour style style = viper.GetString("style") - if style != "auto" && glamour.DefaultStyles[style] == nil { + if style != glamour.AutoStyle && glamour.DefaultStyles[style] == nil { style = utils.ExpandPath(style) if _, err := os.Stat(style); os.IsNotExist(err) { return fmt.Errorf("Specified style does not exist: %s", style) @@ -188,11 +194,6 @@ func stdinIsPipe() (bool, error) { } func execute(cmd *cobra.Command, args []string) error { - initConfig() - if err := validateOptions(cmd); err != nil { - return err - } - // if stdin is a pipe then use stdin for input. note that you can also // explicitly use a - to read from stdin. if yes, err := stdinIsPipe(); err != nil { @@ -206,7 +207,7 @@ func execute(cmd *cobra.Command, args []string) error { switch len(args) { // TUI running on cwd case 0: - return runTUI("", false) + return runTUI("") // TUI with possible dir argument case 1: @@ -216,7 +217,7 @@ func execute(cmd *cobra.Command, args []string) error { if err == nil && info.IsDir() { p, err := filepath.Abs(args[0]) if err == nil { - return runTUI(p, false) + return runTUI(p) } } fallthrough @@ -259,16 +260,11 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { baseURL = u.String() + "/" } - // initialize glamour - var gs glamour.TermRendererOption - if style == "auto" { - gs = glamour.WithEnvironmentConfig() - } else { - gs = glamour.WithStylePath(style) - } + isCode := !utils.IsMarkdownFile(src.URL) + // initialize glamour r, err := glamour.NewTermRenderer( - gs, + utils.GlamourStyle(style, isCode), glamour.WithWordWrap(int(width)), glamour.WithBaseURL(baseURL), glamour.WithPreservedNewLines(), @@ -277,23 +273,28 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { return err } - out, err := r.RenderBytes(b) + s := string(b) + ext := filepath.Ext(src.URL) + if isCode { + s = utils.WrapCodeBlock(string(b), ext) + } + + out, err := r.Render(s) if err != nil { return err } // trim lines - lines := strings.Split(string(out), "\n") - var cb strings.Builder + lines := strings.Split(out, "\n") + var content strings.Builder for i, s := range lines { - cb.WriteString(strings.TrimSpace(s)) + content.WriteString(strings.TrimSpace(s)) // don't add an artificial newline after the last split if i+1 < len(lines) { - cb.WriteString("\n") + content.WriteByte('\n') } } - content := cb.String() // display if pager || cmd.Flags().Changed("pager") { @@ -304,44 +305,29 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { pa := strings.Split(pagerCmd, " ") c := exec.Command(pa[0], pa[1:]...) // nolint:gosec - c.Stdin = strings.NewReader(content) + c.Stdin = strings.NewReader(content.String()) c.Stdout = os.Stdout return c.Run() } - fmt.Fprint(w, content) + fmt.Fprint(w, content.String()) //nolint: errcheck return nil } -func runTUI(workingDirectory string, stashedOnly bool) error { +func runTUI(workingDirectory string) error { // Read environment to get debugging stuff - var cfg ui.Config - if err := babyenv.Parse(&cfg); err != nil { + cfg, err := env.ParseAs[ui.Config]() + if err != nil { return fmt.Errorf("error parsing config: %v", err) } - // Log to file, if set - if cfg.Logfile != "" { - f, err := tea.LogToFile(cfg.Logfile, "glow") - if err != nil { - return err - } - defer f.Close() //nolint:errcheck - } - cfg.WorkingDirectory = workingDirectory - cfg.DocumentTypes = ui.NewDocTypeSet() + cfg.ShowAllFiles = showAllFiles cfg.GlamourMaxWidth = width cfg.GlamourStyle = style cfg.EnableMouse = mouse - if stashedOnly { - cfg.DocumentTypes.Add(ui.StashedDoc, ui.NewsDoc) - } else if localOnly { - cfg.DocumentTypes.Add(ui.LocalDoc) - } - // Run Bubble Tea program if _, err := ui.NewProgram(cfg).Run(); err != nil { return err @@ -351,12 +337,20 @@ func runTUI(workingDirectory string, stashedOnly bool) error { } func main() { - if err := rootCmd.Execute(); err != nil { + closer, err := setupLog() + if err != nil { + fmt.Println(err) os.Exit(1) } + if err := rootCmd.Execute(); err != nil { + _ = closer() + os.Exit(1) + } + _ = closer() } func init() { + tryLoadConfigFromDefaultPlaces() if len(CommitSHA) >= 7 { vt := rootCmd.VersionTemplate() rootCmd.SetVersionTemplate(vt[:len(vt)-1] + " (" + CommitSHA[0:7] + ")\n") @@ -366,62 +360,56 @@ func init() { } rootCmd.Version = Version - scope := gap.NewScope(gap.User, "glow") - defaultConfigFile, _ := scope.ConfigPath("glow.yml") - // "Glow Classic" cli arguments - rootCmd.PersistentFlags().StringVar(&configFile, "config", "", fmt.Sprintf("config file (default %s)", defaultConfigFile)) + rootCmd.PersistentFlags().StringVar(&configFile, "config", "", fmt.Sprintf("config file (default %s)", defaultConfigFile())) rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") - rootCmd.Flags().StringVarP(&style, "style", "s", "auto", "style name or JSON path") + rootCmd.Flags().StringVarP(&style, "style", "s", glamour.AutoStyle, "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") rootCmd.Flags().BoolVarP(&showAllFiles, "all", "a", false, "show system files and directories (TUI-mode only)") - rootCmd.Flags().BoolVarP(&localOnly, "local", "l", false, "show local files only; no network (TUI-mode only)") + rootCmd.Flags().BoolVarP(&mouse, "mouse", "m", false, "enable mouse wheel (TUI-mode only)") _ = rootCmd.Flags().MarkHidden("mouse") // Config bindings _ = viper.BindPFlag("style", rootCmd.Flags().Lookup("style")) _ = viper.BindPFlag("width", rootCmd.Flags().Lookup("width")) - _ = viper.BindPFlag("local", rootCmd.Flags().Lookup("local")) + _ = viper.BindPFlag("debug", rootCmd.Flags().Lookup("debug")) _ = viper.BindPFlag("mouse", rootCmd.Flags().Lookup("mouse")) - viper.SetDefault("style", "auto") + viper.SetDefault("style", glamour.AutoStyle) viper.SetDefault("width", 0) - viper.SetDefault("local", "false") - - // Stash - stashCmd.PersistentFlags().StringVarP(&memo, "memo", "m", "", "memo/note for stashing") - rootCmd.AddCommand(stashCmd) rootCmd.AddCommand(configCmd) } -func initConfig() { - if configFile != "" { - viper.SetConfigFile(configFile) - } else { - scope := gap.NewScope(gap.User, "glow") - dirs, err := scope.ConfigDirs() - if err != nil { - fmt.Println("Can't retrieve default config. Please manually pass a config file with '--config'") - os.Exit(1) - } - - for _, v := range dirs { - viper.AddConfigPath(v) - } - viper.SetConfigName("glow") - viper.SetConfigType("yaml") +func tryLoadConfigFromDefaultPlaces() { + scope := gap.NewScope(gap.User, "glow") + dirs, err := scope.ConfigDirs() + if err != nil { + fmt.Println("Could not load find config directory.") + os.Exit(1) } + for _, v := range dirs { + viper.AddConfigPath(v) + } + + viper.SetConfigName("glow") + viper.SetConfigType("yaml") viper.SetEnvPrefix("glow") viper.AutomaticEnv() if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); !ok { - fmt.Println("Error parsing config:", err) - os.Exit(1) + log.Warn("Could not parse configuration file", "err", err) } } - // fmt.Println("Using config file:", viper.ConfigFileUsed()) + if used := viper.ConfigFileUsed(); used != "" { + log.Debug("Using configuration file", "path", viper.ConfigFileUsed()) + } else { + if err := ensureConfigFile(); err != nil { + fmt.Println("Could not create default config.") + os.Exit(1) + } + } } diff --git a/stash_cmd.go b/stash_cmd.go deleted file mode 100644 index efb8bbd..0000000 --- a/stash_cmd.go +++ /dev/null @@ -1,82 +0,0 @@ -package main - -import ( - "fmt" - "io" - "log" - "os" - "path" - "strings" - - "github.com/charmbracelet/charm" - "github.com/charmbracelet/lipgloss" - "github.com/spf13/cobra" -) - -var ( - memo string - dot = lipgloss.NewStyle().Foreground(lipgloss.Color("#04B575")).Render("•") - - stashCmd = &cobra.Command{ - Use: "stash [SOURCE]", - Hidden: false, - Short: "Stash a markdown", - Long: paragraph(fmt.Sprintf("\nDo %s stuff. Run with no arguments to browse your stash or pass a path to a markdown file to stash it.", keyword("stash"))), - Example: paragraph("glow stash\nglow stash README.md\nglow stash -m \"secret notes\" path/to/notes.md"), - Args: cobra.MaximumNArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - initConfig() - if len(args) == 0 { - return runTUI("", true) - } - - filePath := args[0] - - if memo == "" { - memo = strings.Replace(path.Base(filePath), path.Ext(filePath), "", 1) - } - - cc := initCharmClient() - f, err := os.Open(filePath) - if err != nil { - return fmt.Errorf("bad filename") - } - - defer f.Close() //nolint:errcheck - b, err := io.ReadAll(f) - if err != nil { - return fmt.Errorf("error reading file") - } - - _, err = cc.StashMarkdown(memo, string(b)) - if err != nil { - return fmt.Errorf("error stashing markdown") - } - - fmt.Println(dot + " Stashed!") - return nil - }, - } -) - -func getCharmConfig() *charm.Config { - cfg, err := charm.ConfigFromEnv() - if err != nil { - log.Fatal(err) - } - - return cfg -} - -func initCharmClient() *charm.Client { - cfg := getCharmConfig() - cc, err := charm.NewClient(cfg) - if err == charm.ErrMissingSSHAuth { - fmt.Println(paragraph("We had some trouble authenticating via SSH. If this continues to happen the Charm tool may be able to help you. More info at https://github.com/charmbracelet/charm.")) - os.Exit(1) - } else if err != nil { - fmt.Println(err) - os.Exit(1) - } - return cc -} diff --git a/style.go b/style.go index 81a1c2d..b688a4e 100644 --- a/style.go +++ b/style.go @@ -1,13 +1,13 @@ package main -import . "github.com/charmbracelet/lipgloss" //nolint:revive +import "github.com/charmbracelet/lipgloss" var ( - keyword = NewStyle(). - Foreground(Color("#04B575")). + keyword = lipgloss.NewStyle(). + Foreground(lipgloss.Color("#04B575")). Render - paragraph = NewStyle(). + paragraph = lipgloss.NewStyle(). Width(78). Padding(0, 0, 0, 2). Render diff --git a/ui/config.go b/ui/config.go index 9db2340..2365528 100644 --- a/ui/config.go +++ b/ui/config.go @@ -12,19 +12,7 @@ type Config struct { // Which directory should we start from? WorkingDirectory string - // Which document types shall we show? - DocumentTypes DocTypeSet - // For debugging the UI - Logfile string `env:"GLOW_LOGFILE"` - HighPerformancePager bool `env:"GLOW_HIGH_PERFORMANCE_PAGER" default:"true"` - GlamourEnabled bool `env:"GLOW_ENABLE_GLAMOUR" default:"true"` -} - -func (c Config) localOnly() bool { - return c.DocumentTypes.Equals(NewDocTypeSet(LocalDoc)) -} - -func (c Config) stashedOnly() bool { - return c.DocumentTypes.Contains(StashedDoc) && !c.DocumentTypes.Contains(LocalDoc) + HighPerformancePager bool `env:"GLOW_HIGH_PERFORMANCE_PAGER" envDefault:"true"` + GlamourEnabled bool `env:"GLOW_ENABLE_GLAMOUR" envDefault:"true"` } diff --git a/ui/consts_unix.go b/ui/consts_unix.go deleted file mode 100644 index 57f75dd..0000000 --- a/ui/consts_unix.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build !windows -// +build !windows - -package ui - -const ( - pagerStashIcon = "🔒" -) diff --git a/ui/consts_windows.go b/ui/consts_windows.go deleted file mode 100644 index 25f9851..0000000 --- a/ui/consts_windows.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build windows - -package ui - -const ( - pagerStashIcon = "•" -) diff --git a/ui/doctypes.go b/ui/doctypes.go deleted file mode 100644 index 8d2ef14..0000000 --- a/ui/doctypes.go +++ /dev/null @@ -1,90 +0,0 @@ -package ui - -// DocType represents a type of markdown document. -type DocType int - -// Available document types. -const ( - NoDocType DocType = iota - LocalDoc - StashedDoc - ConvertedDoc - NewsDoc -) - -func (d DocType) String() string { - return [...]string{ - "none", - "local", - "stashed", - "converted", - "news", - }[d] -} - -// DocTypeSet is a set (in the mathematic sense) of document types. -type DocTypeSet map[DocType]struct{} - -// NewDocTypeSet returns a set of document types. -func NewDocTypeSet(t ...DocType) DocTypeSet { - d := DocTypeSet(make(map[DocType]struct{})) - if len(t) > 0 { - d.Add(t...) - } - return d -} - -// Add adds a document type of the set. -func (d *DocTypeSet) Add(t ...DocType) int { - for _, v := range t { - (*d)[v] = struct{}{} - } - return len(*d) -} - -// Contains returns whether or not the set contains the given DocTypes. -func (d DocTypeSet) Contains(m ...DocType) bool { - matches := 0 - for _, t := range m { - if _, found := d[t]; found { - matches++ - } - } - return matches == len(m) -} - -// Difference return a DocumentType set that does not contain the given types. -func (d DocTypeSet) Difference(t ...DocType) DocTypeSet { - c := copyDocumentTypes(d) - for k := range c { - for _, docType := range t { - if k == docType { - delete(c, k) - break - } - } - } - return c -} - -// Equals returns whether or not the two sets are equal. -func (d DocTypeSet) Equals(other DocTypeSet) bool { - return d.Contains(other.AsSlice()...) && len(d) == len(other) -} - -// AsSlice returns the set as a slice of document types. -func (d DocTypeSet) AsSlice() (agg []DocType) { - for k := range d { - agg = append(agg, k) - } - return -} - -// Return a copy of the given DoctTypes map. -func copyDocumentTypes(d DocTypeSet) DocTypeSet { - c := make(map[DocType]struct{}) - for k, v := range d { - c[k] = v - } - return c -} diff --git a/ui/doctypes_test.go b/ui/doctypes_test.go deleted file mode 100644 index e882b14..0000000 --- a/ui/doctypes_test.go +++ /dev/null @@ -1,48 +0,0 @@ -package ui - -import ( - "reflect" - "testing" -) - -func TestDocTypeContains(t *testing.T) { - d := NewDocTypeSet(LocalDoc) - - if !d.Contains(LocalDoc) { - t.Error("Contains reported it doesn't contain a value which it absolutely does contain") - } - - if d.Contains(NewsDoc) { - t.Error("Contains reported the set contains a value it certainly does not") - } -} - -func TestDocTypeDifference(t *testing.T) { - original := NewDocTypeSet(LocalDoc, StashedDoc, ConvertedDoc, NewsDoc) - difference := original.Difference(LocalDoc, NewsDoc) - expected := NewDocTypeSet(StashedDoc, ConvertedDoc) - - // Make sure the difference operation worked - if !reflect.DeepEqual(difference, expected) { - t.Errorf("difference returned %+v; expected %+v", difference, expected) - } - - // Make sure original set was not mutated - if reflect.DeepEqual(original, difference) { - t.Errorf("original set was mutated when it should not have been") - } -} - -func TestDocTypeEquality(t *testing.T) { - a := NewDocTypeSet(LocalDoc, StashedDoc) - b := NewDocTypeSet(LocalDoc, StashedDoc) - c := NewDocTypeSet(LocalDoc) - - if !a.Equals(b) { - t.Errorf("Equality test failed for %+v and %+v; expected true, got false", a, b) - } - - if a.Equals(c) { - t.Errorf("Equality test failed for %+v and %+v; expected false, got true", a, c) - } -} diff --git a/ui/editor.go b/ui/editor.go index ff094fc..e2d4439 100644 --- a/ui/editor.go +++ b/ui/editor.go @@ -11,12 +11,9 @@ func openEditor(path string) tea.Cmd { cb := func(err error) tea.Msg { return editorFinishedMsg{err} } - - editor, err := editor.Cmd("Glow", path) + cmd, err := editor.Cmd("Glow", path) if err != nil { - return func() tea.Msg { - return errMsg{err} - } + return func() tea.Msg { return cb(err) } } - return tea.ExecProcess(editor, cb) + return tea.ExecProcess(cmd, cb) } diff --git a/ui/ignore_darwin.go b/ui/ignore_darwin.go index cccd305..b69437a 100644 --- a/ui/ignore_darwin.go +++ b/ui/ignore_darwin.go @@ -1,13 +1,14 @@ +//go:build darwin // +build darwin package ui import "path/filepath" -func ignorePatterns(m model) []string { +func ignorePatterns(m commonModel) []string { return []string{ - filepath.Join(m.common.cfg.HomeDir, "Library"), - m.common.cfg.Gopath, + filepath.Join(m.cfg.HomeDir, "Library"), + m.cfg.Gopath, "node_modules", ".*", } diff --git a/ui/ignore_general.go b/ui/ignore_general.go index 43c1dd1..f4dc8be 100644 --- a/ui/ignore_general.go +++ b/ui/ignore_general.go @@ -3,9 +3,9 @@ package ui -func ignorePatterns(m model) []string { +func ignorePatterns(m commonModel) []string { return []string{ - m.common.cfg.Gopath, + m.cfg.Gopath, "node_modules", ".*", } diff --git a/ui/markdown.go b/ui/markdown.go index e1d5086..8bafad1 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -1,42 +1,18 @@ package ui import ( - "log" "math" - "path" - "strings" "time" "unicode" - "github.com/charmbracelet/charm" + "github.com/charmbracelet/log" "github.com/dustin/go-humanize" - "github.com/segmentio/ksuid" "golang.org/x/text/runes" "golang.org/x/text/transform" "golang.org/x/text/unicode/norm" ) -// markdown wraps charm.Markdown. type markdown struct { - docType DocType - - // Stash identifier. This exists so we can keep track of documents stashed - // in-session as they relate to their original, non-stashed counterparts. - // All documents have a stashID, however when a document is stashed that - // document inherits the stashID of the original. - stashID ksuid.KSUID - - // Unique identifier. Unlike the stash identifier, this value should always - // be unique so we can confidently find it an operate on it (versus stashID, - // which could match both an original or stashed document). - uniqueID ksuid.KSUID - - // Some of the document's original values before this document was stashed. - // These are irrelevant if this document was not stashed in this session. - originalDocType DocType - originalTimestamp time.Time - originalNote string - // Full path of a local markdown file. Only relevant to local documents and // those that have been stashed in this session. localPath string @@ -46,102 +22,24 @@ type markdown struct { // field is ephemeral, and should only be referenced during filtering. filterValue string - charm.Markdown -} - -func (m *markdown) generateIDs() { - if m.stashID.IsNil() { - m.stashID = ksuid.New() - } - m.uniqueID = ksuid.New() -} - -// convertToStashed converts this document into its stashed state. -func (m *markdown) convertToStashed() { - if m.docType == ConvertedDoc { - if debug { - log.Println("not converting already converted document:", m) - } - return - } - - m.originalDocType = m.docType - m.originalTimestamp = m.CreatedAt - m.originalNote = m.Note - - if m.docType == LocalDoc { - m.Note = strings.Replace(path.Base(m.localPath), path.Ext(m.localPath), "", 1) - } - m.CreatedAt = time.Now() - m.docType = ConvertedDoc -} - -// revert reverts this document from its stashed state. -func (m *markdown) revertFromStashed() { - if m.docType != ConvertedDoc { - log.Printf("not reverting document of type %s: %v", m.docType, m) - } - - m.docType = m.originalDocType - m.CreatedAt = m.originalTimestamp - m.Note = m.originalNote + Body string + Note string + Modtime time.Time } // Generate the value we're doing to filter against. func (m *markdown) buildFilterValue() { note, err := normalize(m.Note) if err != nil { - if debug { - log.Printf("error normalizing '%s': %v", m.Note, err) - } + log.Error("error normalizing", "note", m.Note, "error", err) m.filterValue = m.Note } m.filterValue = note } -// shouldSortAsLocal returns whether or not this markdown should be sorted as though -// it's a local markdown document. -func (m markdown) shouldSortAsLocal() bool { - return m.docType == LocalDoc || m.docType == ConvertedDoc -} - -// Sort documents with local files first, then by date. -type markdownsByLocalFirst []*markdown - -func (m markdownsByLocalFirst) Len() int { return len(m) } -func (m markdownsByLocalFirst) Swap(i, j int) { m[i], m[j] = m[j], m[i] } -func (m markdownsByLocalFirst) Less(i, j int) bool { - iIsLocal := m[i].shouldSortAsLocal() - jIsLocal := m[j].shouldSortAsLocal() - - // Local files (and files that used to be local) come first - if iIsLocal && !jIsLocal { - return true - } - if !iIsLocal && jIsLocal { - return false - } - - // If both are local files, sort by filename. Note that we should never - // hit equality here since two files can't have the same path. - if iIsLocal && jIsLocal { - return strings.Compare(m[i].localPath, m[j].localPath) == -1 - } - - // Neither are local files so sort by date descending - if !m[i].CreatedAt.Equal(m[j].CreatedAt) { - return m[i].CreatedAt.After(m[j].CreatedAt) - } - - // If the times also match, sort by unique ID. - ids := []ksuid.KSUID{m[i].uniqueID, m[j].uniqueID} - ksuid.Sort(ids) - return ids[0] == m[i].uniqueID -} - func (m markdown) relativeTime() string { - return relativeTime(m.CreatedAt) + return relativeTime(m.Modtime) } // Normalize text to aid in the filtering process. In particular, we remove @@ -153,18 +51,6 @@ func normalize(in string) (string, error) { return out, err } -// wrapMarkdowns wraps a *charm.Markdown with a *markdown in order to add some -// extra metadata. -func wrapMarkdowns(t DocType, md []*charm.Markdown) (m []*markdown) { - for _, v := range md { - m = append(m, &markdown{ - docType: t, - Markdown: *v, - }) - } - return m -} - // Return the time in a human-readable format relative to the current time. func relativeTime(then time.Time) string { now := time.Now() diff --git a/ui/pager.go b/ui/pager.go index 95f6025..3ed307c 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -2,25 +2,28 @@ package ui import ( "fmt" - "log" "math" + "path/filepath" "strings" "time" "github.com/atotto/clipboard" - "github.com/charmbracelet/bubbles/spinner" - "github.com/charmbracelet/bubbles/textinput" "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/charm" "github.com/charmbracelet/glamour" + "github.com/charmbracelet/glow/utils" "github.com/charmbracelet/lipgloss" + "github.com/charmbracelet/log" runewidth "github.com/mattn/go-runewidth" "github.com/muesli/reflow/ansi" "github.com/muesli/reflow/truncate" + "github.com/muesli/termenv" ) -const statusBarHeight = 1 +const ( + statusBarHeight = 1 + lineNumberWidth = 4 +) var ( pagerHelpHeight int @@ -28,11 +31,7 @@ var ( mintGreen = lipgloss.AdaptiveColor{Light: "#89F0CB", Dark: "#89F0CB"} darkGreen = lipgloss.AdaptiveColor{Light: "#1C8760", Dark: "#1C8760"} - noteHeading = lipgloss.NewStyle(). - Foreground(cream). - Background(green). - Padding(0, 1). - SetString("Set Memo") + lineNumberFg = lipgloss.AdaptiveColor{Light: "#656565", Dark: "#7D7D7D"} statusBarNoteFg = lipgloss.AdaptiveColor{Light: "#656565", Dark: "#7D7D7D"} statusBarBg = lipgloss.AdaptiveColor{Light: "#E6E6E6", Dark: "#242424"} @@ -52,21 +51,11 @@ var ( Background(lipgloss.AdaptiveColor{Light: "#DCDCDC", Dark: "#323232"}). Render - statusBarStashDotStyle = lipgloss.NewStyle(). - Foreground(green). - Background(statusBarBg). - Render - statusBarMessageStyle = lipgloss.NewStyle(). Foreground(mintGreen). Background(darkGreen). Render - statusBarMessageStashIconStyle = lipgloss.NewStyle(). - Foreground(mintGreen). - Background(darkGreen). - Render - statusBarMessageScrollPosStyle = lipgloss.NewStyle(). Foreground(mintGreen). Background(darkGreen). @@ -82,47 +71,27 @@ var ( Background(lipgloss.AdaptiveColor{Light: "#f2f2f2", Dark: "#1B1B1B"}). Render - spinnerStyle = lipgloss.NewStyle(). - Foreground(statusBarNoteFg). - Background(statusBarBg) - - pagerNoteInputPromptStyle = lipgloss.NewStyle(). - Foreground(darkGray). - Background(yellowGreen). - Padding(0, 1) - - pagerNoteInputStyle = lipgloss.NewStyle(). - Foreground(darkGray). - Background(yellowGreen) - - pagerNoteInputCursorStyle = lipgloss.NewStyle(). - Foreground(fuchsia) + lineNumberStyle = lipgloss.NewStyle(). + Foreground(lineNumberFg). + Render ) type ( contentRenderedMsg string - noteSavedMsg *charm.Markdown ) type pagerState int const ( pagerStateBrowse pagerState = iota - pagerStateSetNote - pagerStateStashing - pagerStateStashSuccess pagerStateStatusMessage ) type pagerModel struct { - common *commonModel - viewport viewport.Model - state pagerState - showHelp bool - textInput textinput.Model - - spinner spinner.Model - spinnerStart time.Time + common *commonModel + viewport viewport.Model + state pagerState + showHelp bool statusMessage string statusMessageTimer *time.Timer @@ -130,10 +99,6 @@ type pagerModel struct { // Current document being rendered, sans-glamour rendering. We cache // it here so we can re-render it on resize. currentDocument markdown - - // Newly stashed markdown. We store it here temporarily so we can replace - // currentDocument above after a stash. - stashedDocument *markdown } func newPagerModel(common *commonModel) pagerModel { @@ -142,34 +107,16 @@ func newPagerModel(common *commonModel) pagerModel { vp.YPosition = 0 vp.HighPerformanceRendering = config.HighPerformancePager - // Text input for notes/memos - ti := textinput.New() - ti.Prompt = " > " - ti.PromptStyle = pagerNoteInputPromptStyle - ti.TextStyle = pagerNoteInputStyle - ti.CursorStyle = pagerNoteInputCursorStyle - ti.CharLimit = noteCharacterLimit - ti.Focus() - - // Text input for search - sp := spinner.New() - sp.Style = spinnerStyle - return pagerModel{ - common: common, - state: pagerStateBrowse, - textInput: ti, - viewport: vp, - spinner: sp, + common: common, + state: pagerStateBrowse, + viewport: vp, } } func (m *pagerModel) setSize(w, h int) { m.viewport.Width = w m.viewport.Height = h - statusBarHeight - m.textInput.Width = w - - ansi.PrintableRuneWidth(noteHeading.String()) - - ansi.PrintableRuneWidth(m.textInput.Prompt) - 1 if m.showHelp { if pagerHelpHeight == 0 { @@ -191,13 +138,18 @@ func (m *pagerModel) toggleHelp() { } } +type pagerStatusMessage struct { + message string + isError bool +} + // Perform stuff that needs to happen after a successful markdown stash. Note // that the the returned command should be sent back the through the pager // update function. -func (m *pagerModel) showStatusMessage(statusMessage string) tea.Cmd { +func (m *pagerModel) showStatusMessage(msg pagerStatusMessage) tea.Cmd { // Show a success message to the user m.state = pagerStateStatusMessage - m.statusMessage = statusMessage + m.statusMessage = msg.message if m.statusMessageTimer != nil { m.statusMessageTimer.Stop() } @@ -216,7 +168,6 @@ func (m *pagerModel) unload() { m.state = pagerStateBrowse m.viewport.SetContent("") m.viewport.YOffset = 0 - m.textInput.Reset() } func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { @@ -227,126 +178,38 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: - switch m.state { - case pagerStateSetNote: - switch msg.String() { - case keyEsc: + switch msg.String() { + case "q", keyEsc: + if m.state != pagerStateBrowse { m.state = pagerStateBrowse return m, nil - case keyEnter: - var cmd tea.Cmd - if m.textInput.Value() != m.currentDocument.Note { // don't update if the note didn't change - m.currentDocument.Note = m.textInput.Value() // update optimistically - cmd = saveDocumentNote(m.common.cc, m.currentDocument.ID, m.currentDocument.Note) - } - m.state = pagerStateBrowse - m.textInput.Reset() - return m, cmd } - default: - switch msg.String() { - case "q", keyEsc: - if m.state != pagerStateBrowse { - m.state = pagerStateBrowse - return m, nil - } - case "home", "g": - m.viewport.GotoTop() - if m.viewport.HighPerformanceRendering { - cmds = append(cmds, viewport.Sync(m.viewport)) - } - case "end", "G": - m.viewport.GotoBottom() - if m.viewport.HighPerformanceRendering { - cmds = append(cmds, viewport.Sync(m.viewport)) - } - case "m": - isStashed := m.currentDocument.docType == StashedDoc || - m.currentDocument.docType == ConvertedDoc - - // Users can only set the note on user-stashed markdown - if !isStashed { - break - } - - m.state = pagerStateSetNote - - // Stop the timer for hiding a status message since changing - // the state above will have cleared it. - if m.statusMessageTimer != nil { - m.statusMessageTimer.Stop() - } - - // Pre-populate note with existing value - if m.textInput.Value() == "" { - m.textInput.SetValue(m.currentDocument.Note) - m.textInput.CursorEnd() - } - - return m, textinput.Blink - - case "e": - if m.currentDocument.docType == LocalDoc { - return m, openEditor(m.currentDocument.localPath) - } - - case "c": - err := clipboard.WriteAll(m.currentDocument.Body) - if err != nil { - cmds = append(cmds, m.showStatusMessage("Unable to copy contents")) - } else { - cmds = append(cmds, m.showStatusMessage("Copied contents")) - } - - case "s": - if m.common.authStatus != authOK { - break - } - - md := m.currentDocument - - _, alreadyStashed := m.common.filesStashed[md.stashID] - if alreadyStashed { - cmds = append(cmds, m.showStatusMessage("Already stashed")) - break - } - - // Stash a local document - if m.state != pagerStateStashing && stashableDocTypes.Contains(md.docType) { - m.state = pagerStateStashing - m.spinnerStart = time.Now() - cmds = append( - cmds, - stashDocument(m.common.cc, md), - m.spinner.Tick, - ) - } - case "?": - m.toggleHelp() - if m.viewport.HighPerformanceRendering { - cmds = append(cmds, viewport.Sync(m.viewport)) - } + case "home", "g": + m.viewport.GotoTop() + if m.viewport.HighPerformanceRendering { + cmds = append(cmds, viewport.Sync(m.viewport)) + } + case "end", "G": + m.viewport.GotoBottom() + if m.viewport.HighPerformanceRendering { + cmds = append(cmds, viewport.Sync(m.viewport)) } - } - case spinner.TickMsg: - spinnerMinTimeout := m.spinnerStart. - Add(spinnerVisibilityTimeout). - Add(spinnerMinLifetime) + case "e": + return m, openEditor(m.currentDocument.localPath) - if m.state == pagerStateStashing || time.Now().Before(spinnerMinTimeout) { - // We're either still stashing or we haven't reached the spinner's - // full lifetime. In either case we need to spin the spinner - // irrespective of it's more fine-grained visibility rules. - var cmd tea.Cmd - m.spinner, cmd = m.spinner.Update(msg) - cmds = append(cmds, cmd) - } else if m.state == pagerStateStashSuccess { - // Successful stash. Stop spinning and update accordingly. - m.state = pagerStateBrowse - m.currentDocument = *m.stashedDocument - m.stashedDocument = nil - cmds = append(cmds, m.showStatusMessage("Stashed!")) + case "c": + // Copy using OSC 52 + termenv.Copy(m.currentDocument.Body) + // Copy using native system clipboard + _ = clipboard.WriteAll(m.currentDocument.Body) + cmds = append(cmds, m.showStatusMessage(pagerStatusMessage{"Copied contents", false})) + + case "?": + m.toggleHelp() + if m.viewport.HighPerformanceRendering { + cmds = append(cmds, viewport.Sync(m.viewport)) + } } // Glow has rendered the content @@ -356,75 +219,36 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { cmds = append(cmds, viewport.Sync(m.viewport)) } + case editMardownMsg: + return m, openEditor(msg.md.localPath) + // We've finished editing the document, potentially making changes. Let's // retrieve the latest version of the document so that we display // up-to-date contents. case editorFinishedMsg: return m, loadLocalMarkdown(&m.currentDocument) - // We've reveived terminal dimensions, either for the first time or + // We've received terminal dimensions, either for the first time or // after a resize case tea.WindowSizeMsg: return m, renderWithGlamour(m, m.currentDocument.Body) - case stashSuccessMsg: - // Stashing was successful. Convert the loaded document to a stashed - // one and show a status message. Note that we're also handling this - // message in the main update function where we're adding this stashed - // item to the stash listing. - m.state = pagerStateStashSuccess - - if !m.spinnerVisible() { - // The spinner has finished spinning, so tell the user the stash - // was successful. - m.state = pagerStateBrowse - m.currentDocument = markdown(msg) - cmds = append(cmds, m.showStatusMessage("Stashed!")) - } else { - // The spinner is still spinning, so just take note of the newly - // stashed document for now. - md := markdown(msg) - m.stashedDocument = &md - } - - case stashFailMsg: - delete(m.common.filesStashed, msg.markdown.stashID) - case statusMessageTimeoutMsg: m.state = pagerStateBrowse } - switch m.state { - case pagerStateSetNote: - m.textInput, cmd = m.textInput.Update(msg) - cmds = append(cmds, cmd) - default: - m.viewport, cmd = m.viewport.Update(msg) - cmds = append(cmds, cmd) - } + m.viewport, cmd = m.viewport.Update(msg) + cmds = append(cmds, cmd) return m, tea.Batch(cmds...) } -// spinnerVisible returns whether or not the spinner should be drawn. -func (m pagerModel) spinnerVisible() bool { - windowStart := m.spinnerStart.Add(spinnerVisibilityTimeout) - windowEnd := windowStart.Add(spinnerMinLifetime) - now := time.Now() - return now.After(windowStart) && now.Before(windowEnd) -} - func (m pagerModel) View() string { var b strings.Builder fmt.Fprint(&b, m.viewport.View()+"\n") // Footer - switch m.state { - case pagerStateSetNote: - m.setNoteView(&b) - default: - m.statusBarView(&b) - } + m.statusBarView(&b) if m.showHelp { fmt.Fprint(&b, "\n"+m.helpView()) @@ -440,11 +264,10 @@ func (m pagerModel) statusBarView(b *strings.Builder) { percentToStringMagnitude float64 = 100.0 ) - isStashed := m.currentDocument.docType == StashedDoc || m.currentDocument.docType == ConvertedDoc showStatusMessage := m.state == pagerStateStatusMessage // Logo - logo := glowLogoView(" Glow ") + logo := glowLogoView() // Scroll percent percent := math.Max(minPercent, math.Min(maxPercent, m.viewport.ScrollPercent())) @@ -463,34 +286,16 @@ func (m pagerModel) statusBarView(b *strings.Builder) { helpNote = statusBarHelpStyle(" ? Help ") } - // Status indicator; spinner or stash dot - var statusIndicator string - if m.state == pagerStateStashing || m.state == pagerStateStashSuccess { - var spinner string - if m.spinnerVisible() { - spinner = m.spinner.View() - } - statusIndicator = statusBarNoteStyle(" ") + spinner - } else if isStashed && showStatusMessage { - statusIndicator = statusBarMessageStashIconStyle(" " + pagerStashIcon) - } else if isStashed { - statusIndicator = statusBarStashDotStyle(" " + pagerStashIcon) - } - // Note var note string if showStatusMessage { note = m.statusMessage } else { note = m.currentDocument.Note - if len(note) == 0 { - note = "(No memo)" - } } note = truncate.StringWithTail(" "+note+" ", uint(max(0, m.common.width- ansi.PrintableRuneWidth(logo)- - ansi.PrintableRuneWidth(statusIndicator)- ansi.PrintableRuneWidth(scrollPercent)- ansi.PrintableRuneWidth(helpNote), )), ellipsis) @@ -504,7 +309,6 @@ func (m pagerModel) statusBarView(b *strings.Builder) { padding := max(0, m.common.width- ansi.PrintableRuneWidth(logo)- - ansi.PrintableRuneWidth(statusIndicator)- ansi.PrintableRuneWidth(note)- ansi.PrintableRuneWidth(scrollPercent)- ansi.PrintableRuneWidth(helpNote), @@ -516,9 +320,8 @@ func (m pagerModel) statusBarView(b *strings.Builder) { emptySpace = statusBarNoteStyle(emptySpace) } - fmt.Fprintf(b, "%s%s%s%s%s%s", + fmt.Fprintf(b, "%s%s%s%s%s", logo, - statusIndicator, note, emptySpace, scrollPercent, @@ -526,36 +329,18 @@ func (m pagerModel) statusBarView(b *strings.Builder) { ) } -func (m pagerModel) setNoteView(b *strings.Builder) { - fmt.Fprint(b, noteHeading) - fmt.Fprint(b, m.textInput.View()) -} - func (m pagerModel) helpView() (s string) { - memoOrStash := "m set memo" - if m.common.authStatus == authOK && m.currentDocument.docType == LocalDoc { - memoOrStash = "s stash this document" - } - - editOrBlank := "e edit this document" - if m.currentDocument.docType != LocalDoc || m.currentDocument.localPath == "" { - editOrBlank = "" - } + edit := "e edit this document" col1 := []string{ "g/home go to top", "G/end go to bottom", "c copy contents", - editOrBlank, - memoOrStash, + edit, "esc back to files", "q quit", } - if m.currentDocument.docType == NewsDoc { - deleteFromStringSlice(col1, 3) - } - s += "\n" s += "k/↑ up " + col1[0] + "\n" s += "j/↓ down " + col1[1] + "\n" @@ -591,9 +376,7 @@ func renderWithGlamour(m pagerModel, md string) tea.Cmd { return func() tea.Msg { s, err := glamourRender(m, md) if err != nil { - if debug { - log.Println("error rendering with Glamour:", err) - } + log.Error("error rendering with Glamour", "error", err) return errMsg{err} } return contentRenderedMsg(s) @@ -602,53 +385,58 @@ func renderWithGlamour(m pagerModel, md string) tea.Cmd { // This is where the magic happens. func glamourRender(m pagerModel, markdown string) (string, error) { + trunc := lipgloss.NewStyle().MaxWidth(m.viewport.Width - lineNumberWidth).Render + if !config.GlamourEnabled { return markdown, nil } - // initialize glamour - var gs glamour.TermRendererOption - if m.common.cfg.GlamourStyle == "auto" { - gs = glamour.WithAutoStyle() - } else { - gs = glamour.WithStylePath(m.common.cfg.GlamourStyle) + isCode := !utils.IsMarkdownFile(m.currentDocument.Note) + width := max(0, min(int(m.common.cfg.GlamourMaxWidth), m.viewport.Width)) + if isCode { + width = 0 } - width := max(0, min(int(m.common.cfg.GlamourMaxWidth), m.viewport.Width)) r, err := glamour.NewTermRenderer( - gs, + utils.GlamourStyle(m.common.cfg.GlamourStyle, isCode), glamour.WithWordWrap(width), ) if err != nil { return "", err } + if isCode { + markdown = utils.WrapCodeBlock(markdown, filepath.Ext(m.currentDocument.Note)) + } + out, err := r.Render(markdown) if err != nil { return "", err } + if isCode { + out = strings.TrimSpace(out) + } + // trim lines lines := strings.Split(out, "\n") - var content string + var content strings.Builder for i, s := range lines { - content += strings.TrimSpace(s) + if isCode { + content.WriteString(lineNumberStyle(fmt.Sprintf("%"+fmt.Sprint(lineNumberWidth)+"d", i+1))) + content.WriteString(trunc(s)) + } else { + content.WriteString(strings.TrimSpace(s)) + } // don't add an artificial newline after the last split if i+1 < len(lines) { - content += "\n" + content.WriteRune('\n') } } - return content, nil + return content.String(), nil } -// ETC - -// Note: this runs in linear time; O(n). -func deleteFromStringSlice(a []string, i int) []string { - copy(a[i:], a[i+1:]) - a[len(a)-1] = "" - return a[:len(a)-1] -} +type editMardownMsg struct{ md *markdown } diff --git a/ui/sort.go b/ui/sort.go new file mode 100644 index 0000000..4f389fb --- /dev/null +++ b/ui/sort.go @@ -0,0 +1,12 @@ +package ui + +import ( + "cmp" + "slices" +) + +func sortMarkdowns(mds []*markdown) { + slices.SortStableFunc(mds, func(a, b *markdown) int { + return cmp.Compare(a.Note, b.Note) + }) +} diff --git a/ui/stash.go b/ui/stash.go index c61ac32..ea2b4ce 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -3,7 +3,6 @@ package ui import ( "errors" "fmt" - "log" "os" "sort" "strings" @@ -13,8 +12,8 @@ import ( "github.com/charmbracelet/bubbles/spinner" "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/charm" "github.com/charmbracelet/lipgloss" + "github.com/charmbracelet/log" "github.com/muesli/reflow/ansi" "github.com/muesli/reflow/truncate" "github.com/sahilm/fuzzy" @@ -28,15 +27,11 @@ const ( stashViewHorizontalPadding = 6 ) -var ( - stashingStatusMessage = statusMessage{normalStatusMessage, "Stashing..."} - alreadyStashedStatusMessage = statusMessage{subtleStatusMessage, "Already stashed"} -) +var stashingStatusMessage = statusMessage{normalStatusMessage, "Stashing..."} var ( - dividerDot = darkGrayFg.SetString(" • ") - dividerBar = darkGrayFg.SetString(" │ ") - offlineHeaderNote = darkGrayFg.SetString("(Offline)") + dividerDot = darkGrayFg.SetString(" • ") + dividerBar = darkGrayFg.SetString(" │ ") logoStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("#ECFD65")). @@ -56,17 +51,10 @@ var ( // MSG type ( - deletedStashedItemMsg int - filteredMarkdownMsg []*markdown - fetchedMarkdownMsg *markdown + filteredMarkdownMsg []*markdown + fetchedMarkdownMsg *markdown ) -type markdownFetchFailedMsg struct { - err error - id int - note string -} - // MODEL // stashViewState is the high-level state of the file listing. @@ -82,9 +70,7 @@ const ( type sectionKey int const ( - localSection = iota - stashedSection - newsSection + documentsSection = iota filterSection ) @@ -92,7 +78,6 @@ const ( // its contents in the file listing view. type section struct { key sectionKey - docTypes DocTypeSet paginator paginator.Model cursor int } @@ -109,15 +94,6 @@ const ( filterApplied // a filter is applied and user is not editing filter ) -// selectionState is the state of the currently selected document. -type selectionState int - -const ( - selectionIdle = iota - selectionSettingNote - selectionPromptingDelete -) - // statusMessageType adds some context to the status message being sent. type statusMessageType int @@ -136,24 +112,12 @@ type statusMessage struct { func initSections() { sections = map[sectionKey]section{ - localSection: { - key: localSection, - docTypes: NewDocTypeSet(LocalDoc), - paginator: newStashPaginator(), - }, - stashedSection: { - key: stashedSection, - docTypes: NewDocTypeSet(StashedDoc, ConvertedDoc), - paginator: newStashPaginator(), - }, - newsSection: { - key: newsSection, - docTypes: NewDocTypeSet(NewsDoc), + documentsSection: { + key: documentsSection, paginator: newStashPaginator(), }, filterSection: { key: filterSection, - docTypes: DocTypeSet{}, paginator: newStashPaginator(), }, } @@ -176,12 +140,10 @@ type stashModel struct { common *commonModel err error spinner spinner.Model - noteInput textinput.Model filterInput textinput.Model stashFullyLoaded bool // have we loaded all available stashed documents from the server? viewState stashViewState filterState filterState - selectionState selectionState showFullHelp bool showStatusMessage bool statusMessage statusMessage @@ -194,8 +156,8 @@ type stashModel struct { // Index of the section we're currently looking at sectionIndex int - // Tracks what exactly is loaded between the stash, news and local files - loaded DocTypeSet + // Tracks if docs were loaded + loaded bool // The master set of markdown documents we're working with. markdowns []*markdown @@ -209,19 +171,11 @@ type stashModel struct { // from the local pagination. Generally, the server will return more items // than we can display at a time so we can paginate locally without having // to fetch every time. - serverPage int -} - -func (m stashModel) localOnly() bool { - return m.common.cfg.localOnly() -} - -func (m stashModel) stashedOnly() bool { - return m.common.cfg.stashedOnly() + serverPage int64 } func (m stashModel) loadingDone() bool { - return m.loaded.Equals(m.common.cfg.DocumentTypes.Difference(ConvertedDoc)) + return m.loaded } func (m stashModel) currentSection() *section { @@ -244,51 +198,30 @@ func (m *stashModel) setCursor(i int) { m.currentSection().cursor = i } -// Returns whether or not we're online. That is, when "local-only" mode is -// disabled and we've authenticated successfully. -func (m stashModel) online() bool { - return !m.localOnly() && m.common.authStatus == authOK -} - // Whether or not the spinner should be spinning. func (m stashModel) shouldSpin() bool { loading := !m.loadingDone() - stashing := m.common.isStashing() openingDocument := m.viewState == stashStateLoadingDocument - return loading || stashing || openingDocument + return loading || openingDocument } func (m *stashModel) setSize(width, height int) { m.common.width = width m.common.height = height - m.noteInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.noteInput.Prompt) - m.filterInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth(m.filterInput.Prompt) + m.filterInput.Width = width - stashViewHorizontalPadding*2 - ansi.PrintableRuneWidth( + m.filterInput.Prompt, + ) m.updatePagination() } -// bakeConvertedDocs turns converted documents into stashed ones. Essentially, -// we're discarding the fact that they were ever converted so we can stop -// treating them like converted documents. -func (m *stashModel) bakeConvertedDocs() { - for _, md := range m.markdowns { - if md.docType == ConvertedDoc { - md.docType = StashedDoc - } - } -} - func (m *stashModel) resetFiltering() { m.filterState = unfiltered m.filterInput.Reset() m.filteredMarkdowns = nil - // Turn converted markdowns into stashed ones so that the next time we - // filter we get both local and stashed results. - m.bakeConvertedDocs() - - sort.Stable(markdownsByLocalFirst(m.markdowns)) + sortMarkdowns(m.markdowns) // If the filtered section is present (it's always at the end) slice it out // of the sections slice to remove it from the UI. @@ -315,7 +248,7 @@ func (m stashModel) filterApplied() bool { func (m stashModel) shouldUpdateFilter() bool { // If we're in the middle of setting a note don't update the filter so that // the focus won't jump around. - return m.filterApplied() && m.selectionState != selectionSettingNote + return m.filterApplied() } // Update pagination according to the amount of markdowns for the current @@ -361,58 +294,16 @@ func (m stashModel) selectedMarkdown() *markdown { // Adds markdown documents to the model. func (m *stashModel) addMarkdowns(mds ...*markdown) { - if len(mds) > 0 { - for _, md := range mds { - md.generateIDs() - } - - m.markdowns = append(m.markdowns, mds...) - if !m.filterApplied() { - sort.Stable(markdownsByLocalFirst(m.markdowns)) - } - m.updatePagination() - } -} - -// Return the number of markdown documents of a given type. -func (m stashModel) countMarkdowns(t DocType) (found int) { - if len(m.markdowns) == 0 { + if len(mds) == 0 { return } - var mds []*markdown - if m.filterState == filtering { - mds = m.getVisibleMarkdowns() - } else { - mds = m.markdowns + m.markdowns = append(m.markdowns, mds...) + if !m.filterApplied() { + sortMarkdowns(m.markdowns) } - for i := 0; i < len(mds); i++ { - if mds[i].docType == t { - found++ - } - } - return -} - -// Sift through the master markdown collection for the specified types. -func (m stashModel) getMarkdownByType(types ...DocType) []*markdown { - var agg []*markdown - - if len(m.markdowns) == 0 { - return agg - } - - for _, t := range types { - for _, md := range m.markdowns { - if md.docType == t { - agg = append(agg, md) - } - } - } - - sort.Stable(markdownsByLocalFirst(agg)) - return agg + m.updatePagination() } // Returns the markdowns that should be currently shown. @@ -421,47 +312,17 @@ func (m stashModel) getVisibleMarkdowns() []*markdown { return m.filteredMarkdowns } - return m.getMarkdownByType(m.currentSection().docTypes.AsSlice()...) -} - -// Return the markdowns eligible to be filtered. -func (m stashModel) getFilterableMarkdowns() (agg []*markdown) { - mds := m.getMarkdownByType(LocalDoc, ConvertedDoc, StashedDoc) - - // Copy values - for _, v := range mds { - p := *v - agg = append(agg, &p) - } - - return + return m.markdowns } // Command for opening a markdown document in the pager. Note that this also // alters the model. func (m *stashModel) openMarkdown(md *markdown) tea.Cmd { - var cmd tea.Cmd m.viewState = stashStateLoadingDocument - - if md.docType == LocalDoc { - cmd = loadLocalMarkdown(md) - } else { - cmd = loadRemoteMarkdown(m.common.cc, md) - } - + cmd := loadLocalMarkdown(md) return tea.Batch(cmd, m.spinner.Tick) } -func (m *stashModel) newStatusMessage(sm statusMessage) tea.Cmd { - m.showStatusMessage = true - m.statusMessage = sm - if m.statusMessageTimer != nil { - m.statusMessageTimer.Stop() - } - m.statusMessageTimer = time.NewTimer(statusMessageTimeout) - return waitForStatusMessageTimeout(stashContext, m.statusMessageTimer) -} - func (m *stashModel) hideStatusMessage() { m.showStatusMessage = false m.statusMessage = statusMessage{} @@ -518,45 +379,21 @@ func newStashModel(common *commonModel) stashModel { sp.Spinner = spinner.Line sp.Style = stashSpinnerStyle - ni := textinput.New() - ni.Prompt = "Memo:" - ni.PromptStyle = stashInputPromptStyle - ni.CursorStyle = stashInputCursorStyle - ni.CharLimit = noteCharacterLimit - ni.Focus() - si := textinput.New() si.Prompt = "Find:" si.PromptStyle = stashInputPromptStyle - si.CursorStyle = stashInputCursorStyle - si.CharLimit = noteCharacterLimit + si.Cursor.Style = stashInputCursorStyle si.Focus() - var s []section - if common.cfg.localOnly() { - s = []section{ - sections[localSection], - } - } else if common.cfg.stashedOnly() { - s = []section{ - sections[stashedSection], - sections[newsSection], - } - } else { - s = []section{ - sections[localSection], - sections[stashedSection], - sections[newsSection], - } + s := []section{ + sections[documentsSection], } m := stashModel{ common: common, spinner: sp, - noteInput: ni, filterInput: si, serverPage: 1, - loaded: NewDocTypeSet(), sections: s, } @@ -580,72 +417,13 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { case errMsg: m.err = msg - case stashLoadErrMsg: - m.err = msg.err - m.loaded.Add(StashedDoc) // still done, albeit unsuccessfully - m.stashFullyLoaded = true - - case newsLoadErrMsg: - m.err = msg.err - m.loaded.Add(NewsDoc) // still done, albeit unsuccessfully - case localFileSearchFinished: // We're finished searching for local files - m.loaded.Add(LocalDoc) - - case gotStashMsg, gotNewsMsg: - // Stash or news results have come in from the server. - // - // With the stash, this doesn't mean the whole stash listing is loaded, - // but now know it can load, at least, so mark the stash as loaded here. - var docs []*markdown - - switch msg := msg.(type) { - case gotStashMsg: - m.loaded.Add(StashedDoc) - docs = wrapMarkdowns(StashedDoc, msg) - - if len(msg) == 0 { - // If the server comes back with nothing then we've got - // everything - m.stashFullyLoaded = true - } else { - // Load the next page - m.serverPage++ - cmds = append(cmds, loadStash(m)) - } - - case gotNewsMsg: - m.loaded.Add(NewsDoc) - docs = wrapMarkdowns(NewsDoc, msg) - } - - // If we're filtering build filter indexes immediately so any - // matching results will show up in the filter. - if m.filterApplied() { - for _, md := range docs { - md.buildFilterValue() - } - } - if m.shouldUpdateFilter() { - cmds = append(cmds, filterMarkdowns(m)) - } - - m.addMarkdowns(docs...) - - case markdownFetchFailedMsg: - s := "Couldn't load markdown" - if msg.note != "" { - s += ": " + msg.note - } - cmd := m.newStatusMessage(statusMessage{ - status: normalStatusMessage, - message: s, - }) - return m, cmd + m.loaded = true case filteredMarkdownMsg: m.filteredMarkdowns = msg + m.setCursor(0) return m, nil case spinner.TickMsg: @@ -655,28 +433,6 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { cmds = append(cmds, cmd) } - // A note was set on a document. This may have happened in the pager so - // we'll find the corresponding document here and update accordingly. - case noteSavedMsg: - for i := range m.markdowns { - if m.markdowns[i].ID == msg.ID { - m.markdowns[i].Note = msg.Note - } - } - - case stashSuccessMsg: - // No-op: mechanical stuff related to stash success is handled in the - // parent update function. - - // Note: mechanical stuff related to stash failure is handled in the parent - // update function. - case stashFailMsg: - m.err = msg.err - cmds = append(cmds, m.newStatusMessage(statusMessage{ - status: errorStatusMessage, - message: fmt.Sprintf("Couldn’t stash ‘%s’", msg.markdown.Note), - })) - case statusMessageTimeoutMsg: if applicationContext(msg) == stashContext { m.hideStatusMessage() @@ -688,15 +444,6 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { return m, tea.Batch(cmds...) } - switch m.selectionState { - case selectionSettingNote: - cmds = append(cmds, m.handleNoteInput(msg)) - return m, tea.Batch(cmds...) - case selectionPromptingDelete: - cmds = append(cmds, m.handleDeleteConfirmation(msg)) - return m, tea.Batch(cmds...) - } - // Updates per the current state switch m.viewState { case stashStateReady: @@ -765,17 +512,14 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { } m.updatePagination() + case "F": + m.loaded = false + return findLocalFiles(*m.common) + // Edit document in EDITOR case "e": md := m.selectedMarkdown() - if md == nil || md.docType != LocalDoc { - break - } - file := m.selectedMarkdown().localPath - if file == "" { - break - } - return openEditor(file) + return openEditor(md.localPath) // Open document case keyEnter: @@ -793,14 +537,13 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Filter your notes case "/": m.hideStatusMessage() - m.bakeConvertedDocs() // Build values we'll filter against for _, md := range m.markdowns { md.buildFilterValue() } - m.filteredMarkdowns = m.getFilterableMarkdowns() + m.filteredMarkdowns = m.markdowns m.paginator().Page = 0 m.setCursor(0) @@ -809,99 +552,6 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { m.filterInput.Focus() return textinput.Blink - // Set note - case "m": - m.hideStatusMessage() - - if numDocs == 0 { - break - } - - md := m.selectedMarkdown() - isUserMarkdown := md.docType == StashedDoc || md.docType == ConvertedDoc - isSettingNote := m.selectionState == selectionSettingNote - isPromptingDelete := m.selectionState == selectionPromptingDelete - - if isUserMarkdown && !isSettingNote && !isPromptingDelete { - m.selectionState = selectionSettingNote - m.noteInput.SetValue(md.Note) - m.noteInput.CursorEnd() - return textinput.Blink - } - - // Stash - case "s": - if numDocs == 0 || !m.online() || m.selectedMarkdown() == nil { - break - } - - md := m.selectedMarkdown() - - // Is this a document we're allowed to stash? - if !stashableDocTypes.Contains(md.docType) { - break - } - - // Was this document already stashed? - if _, alreadyStashed := m.common.filesStashed[md.stashID]; alreadyStashed { - cmds = append(cmds, m.newStatusMessage(alreadyStashedStatusMessage)) - break - } - - // Is the document missing a stash ID? - if md.stashID.IsNil() { - if debug && md.stashID.IsNil() { - log.Printf("refusing to stash markdown; local ID path is nil: %#v", md) - } - break - } - - // Checks passed; perform the stash. - m.common.filesStashed[md.stashID] = struct{}{} - m.common.filesStashing[md.stashID] = struct{}{} - m.common.latestFileStashed = md.stashID - cmds = append(cmds, - stashDocument(m.common.cc, *md), - m.newStatusMessage(stashingStatusMessage), - ) - - // If we're stashing a filtered item, optimistically convert the - // filtered item into a stashed item. - if m.filterApplied() { - for _, v := range m.filteredMarkdowns { - if v.uniqueID == md.uniqueID { - v.convertToStashed() - } - } - } - - // The spinner subtly shows the stash state in a non-optimistic - // fashion, namely because it was originally implemented this way. - // Ideally, if this stash succeeds quickly enough, the spinner - // wouldn't run at all. - cmds = append(cmds, m.spinner.Tick) - - // Prompt for deletion - case "x": - m.hideStatusMessage() - - validState := m.viewState == stashStateReady && - m.selectionState == selectionIdle - - if numDocs == 0 && !validState { - break - } - - md := m.selectedMarkdown() - if md == nil { - break - } - - t := md.docType - if t == StashedDoc || t == ConvertedDoc { - m.selectionState = selectionPromptingDelete - } - // Toggle full help case "?": m.showFullHelp = !m.showFullHelp @@ -942,84 +592,6 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { return tea.Batch(cmds...) } -// Updates for when a user is being prompted whether or not to delete a -// markdown item. -func (m *stashModel) handleDeleteConfirmation(msg tea.Msg) tea.Cmd { - if msg, ok := msg.(tea.KeyMsg); ok { - switch msg.String() { - case "y": - if m.selectionState != selectionPromptingDelete { - break - } - - smd := m.selectedMarkdown() - - for _, md := range m.markdowns { - if md.uniqueID != smd.uniqueID { - continue - } - - // Remove from the things-we-stashed-this-session set - delete(m.common.filesStashed, md.stashID) - - // Delete optimistically and remove the stashed item before - // we've received a success response. - mds, err := deleteMarkdown(m.markdowns, md) - if err == nil { - m.markdowns = mds - } - - break - } - - // Also optimistically delete from filtered markdowns - if m.filterApplied() { - for _, md := range m.filteredMarkdowns { - if md.uniqueID != smd.uniqueID { - continue - } - - switch md.docType { - case ConvertedDoc: - // If the document was stashed in this session, convert it - // back to it's original document type - if md.originalDocType == LocalDoc { - md.revertFromStashed() - break - } - - // Other documents fall through and delete as normal - fallthrough - - // Otherwise, remove the document from the listing - default: - mds, err := deleteMarkdown(m.filteredMarkdowns, md) - if err == nil { - m.filteredMarkdowns = mds - } - } - break - } - } - - m.selectionState = selectionIdle - m.updatePagination() - - if len(m.filteredMarkdowns) == 0 { - m.resetFiltering() - } - - return deleteStashedItem(m.common.cc, smd.ID) - - // Any other key cancels deletion - default: - m.selectionState = selectionIdle - } - } - - return nil -} - // Updates for when a user is in the filter editing interface. func (m *stashModel) handleFiltering(msg tea.Msg) tea.Cmd { var cmds []tea.Cmd @@ -1088,53 +660,6 @@ func (m *stashModel) handleFiltering(msg tea.Msg) tea.Cmd { return tea.Batch(cmds...) } -func (m *stashModel) handleNoteInput(msg tea.Msg) tea.Cmd { - var cmds []tea.Cmd - - if msg, ok := msg.(tea.KeyMsg); ok { - switch msg.String() { - case keyEsc: - // Cancel note - m.noteInput.Reset() - m.selectionState = selectionIdle - case keyEnter: - // Set new note - md := m.selectedMarkdown() - - // If the user is issuing a rename on a newly stashed item in a - // filtered listing, there's a small chance the user could try and - // set a note before the stash is complete. - if md.ID == 0 { - if debug { - log.Printf("user attempted to rename, but markdown ID is 0: %v", md) - } - return m.newStatusMessage(statusMessage{ - status: subtleStatusMessage, - message: "Too fast. Try again in a sec.", - }) - } - - newNote := m.noteInput.Value() - cmd := saveDocumentNote(m.common.cc, md.ID, newNote) - md.Note = newNote - m.noteInput.Reset() - m.selectionState = selectionIdle - return cmd - } - } - - if m.shouldUpdateFilter() { - cmds = append(cmds, filterMarkdowns(*m)) - } - - // Update the note text input component - newNoteInputModel, noteInputCmd := m.noteInput.Update(msg) - m.noteInput = newNoteInputModel - cmds = append(cmds, noteInputCmd) - - return tea.Batch(cmds...) -} - // VIEW func (m stashModel) view() string { @@ -1145,25 +670,14 @@ func (m stashModel) view() string { case stashStateLoadingDocument: s += " " + m.spinner.View() + " Loading document..." case stashStateReady: - loadingIndicator := " " if m.shouldSpin() { loadingIndicator = m.spinner.View() } - var header string - switch m.selectionState { - case selectionPromptingDelete: - header = redFg("Delete this item from your stash? ") + faintRedFg("(y/N)") - case selectionSettingNote: - header = yellowFg("Set the memo for this item?") - } - // Only draw the normal header if we're not using the header area for // something else (like a note or delete prompt). - if header == "" { - header = m.headerView() - } + header := m.headerView() // Rules for the logo, filter and status message. logoOrFilter := " " @@ -1172,7 +686,7 @@ func (m stashModel) view() string { } else if m.filterState == filtering { logoOrFilter += m.filterInput.View() } else { - logoOrFilter += glowLogoView(" Glow ") + logoOrFilter += glowLogoView() if m.showStatusMessage { logoOrFilter += " " + m.statusMessage.String() } @@ -1208,7 +722,7 @@ func (m stashModel) view() string { // One could argue, in fact, that using pointers in // a functional framework is an antipattern and our use of // pointers in our model should be refactored away. - var p paginator.Model = *(m.paginator()) + p := *(m.paginator()) p.Type = paginator.Arabic pagination = paginationStyle.Render(p.View()) } @@ -1232,28 +746,23 @@ func (m stashModel) view() string { return "\n" + indent(s, stashIndent) } -func glowLogoView(text string) string { - return logoStyle.Render(text) +func glowLogoView() string { + return logoStyle.Render(" Glow ") } func (m stashModel) headerView() string { - localCount := m.countMarkdowns(LocalDoc) - stashedCount := m.countMarkdowns(StashedDoc) + m.countMarkdowns(ConvertedDoc) - newsCount := m.countMarkdowns(NewsDoc) + localCount := len(m.markdowns) var sections []string //nolint:prealloc // Filter results if m.filterState == filtering { - if localCount+stashedCount+newsCount == 0 { + if localCount == 0 { return grayFg("Nothing found.") } if localCount > 0 { sections = append(sections, fmt.Sprintf("%d local", localCount)) } - if stashedCount > 0 { - sections = append(sections, fmt.Sprintf("%d stashed", stashedCount)) - } for i := range sections { sections[i] = grayFg(sections[i]) @@ -1262,38 +771,14 @@ func (m stashModel) headerView() string { return strings.Join(sections, dividerDot.String()) } - if m.loadingDone() && len(m.markdowns) == 0 { - var maybeOffline string - if m.common.authStatus == authFailed { - maybeOffline = " " + offlineHeaderNote.String() - } - - if m.stashedOnly() { - return subtleStyle.Render("Can’t load stash") + maybeOffline - } - return subtleStyle.Render("No markdown files found") + maybeOffline - } - // Tabs for i, v := range m.sections { var s string switch v.key { - case localSection: - if m.stashedOnly() { - continue - } - s = fmt.Sprintf("%d local", localCount) - case stashedSection: - if m.localOnly() { - continue - } - s = fmt.Sprintf("%d stashed", stashedCount) - case newsSection: - if m.localOnly() { - continue - } - s = fmt.Sprintf("%d news", newsCount) + case documentsSection: + s = fmt.Sprintf("%d documents", localCount) + case filterSection: s = fmt.Sprintf("%d “%s”", len(m.filteredMarkdowns), m.filterInput.Value()) } @@ -1306,12 +791,7 @@ func (m stashModel) headerView() string { sections = append(sections, s) } - s := strings.Join(sections, dividerBar.String()) - if m.common.authStatus == authFailed { - s += dividerDot.String() + offlineHeaderNote.String() - } - - return s + return strings.Join(sections, dividerBar.String()) } func (m stashModel) populatedView() string { @@ -1326,28 +806,12 @@ func (m stashModel) populatedView() string { } switch m.sections[m.sectionIndex].key { - case localSection: + case documentsSection: if m.loadingDone() { - f("No local files found.") + f("No files found.") } else { f("Looking for local files...") } - case stashedSection: - if m.common.authStatus == authFailed { - f("Can't load your stash. Are you offline?") - } else if m.loadingDone() { - f("Nothing stashed yet.") - } else { - f("Loading your stash...") - } - case newsSection: - if m.common.authStatus == authFailed { - f("Can't load news. Are you offline?") - } else if m.loadingDone() { - f("No stashed files found.") - } else { - f("Loading your stash...") - } case filterSection: return "" } @@ -1384,67 +848,31 @@ func (m stashModel) populatedView() string { // COMMANDS -// loadRemoteMarkdown is a command for loading markdown from the server. -func loadRemoteMarkdown(cc *charm.Client, md *markdown) tea.Cmd { - return func() tea.Msg { - newMD, err := fetchMarkdown(cc, md.ID, md.docType) - if err != nil { - if debug { - log.Printf("error loading %s markdown (ID %d, Note: '%s'): %v", md.docType, md.ID, md.Note, err) - } - return markdownFetchFailedMsg{ - err: err, - id: md.ID, - note: md.Note, - } - } - newMD.stashID = md.stashID - return fetchedMarkdownMsg(newMD) - } -} - func loadLocalMarkdown(md *markdown) tea.Cmd { return func() tea.Msg { - if md.docType != LocalDoc { - return errMsg{errors.New("could not load local file: not a local file")} - } if md.localPath == "" { return errMsg{errors.New("could not load file: missing path")} } data, err := os.ReadFile(md.localPath) if err != nil { - if debug { - log.Println("error reading local markdown:", err) - } + log.Debug("error reading local file", "error", err) return errMsg{err} } + md.Note = md.localPath md.Body = string(data) return fetchedMarkdownMsg(md) } } -func deleteStashedItem(cc *charm.Client, id int) tea.Cmd { - return func() tea.Msg { - err := cc.DeleteMarkdown(id) - if err != nil { - if debug { - log.Println("could not delete stashed item:", err) - } - return errMsg{err} - } - return deletedStashedItemMsg(id) - } -} - func filterMarkdowns(m stashModel) tea.Cmd { return func() tea.Msg { if m.filterInput.Value() == "" || !m.filterApplied() { - return filteredMarkdownMsg(m.getFilterableMarkdowns()) // return everything + return filteredMarkdownMsg(m.markdowns) // return everything } targets := []string{} - mds := m.getFilterableMarkdowns() + mds := m.markdowns for _, t := range mds { targets = append(targets, t.filterValue) @@ -1462,54 +890,6 @@ func filterMarkdowns(m stashModel) tea.Cmd { } } -// ETC - -// fetchMarkdown performs the actual I/O for loading markdown from the sever. -func fetchMarkdown(cc *charm.Client, id int, t DocType) (*markdown, error) { - var md *charm.Markdown - var err error - - switch t { - case StashedDoc, ConvertedDoc: - md, err = cc.GetStashMarkdown(id) - case NewsDoc: - md, err = cc.GetNewsMarkdown(id) - default: - err = fmt.Errorf("unknown markdown type: %s", t) - } - - if err != nil { - return nil, err - } - - return &markdown{ - docType: t, - Markdown: *md, - }, nil -} - -// Delete a markdown from a slice of markdowns. -func deleteMarkdown(markdowns []*markdown, target *markdown) ([]*markdown, error) { - index := -1 - - // Operate on a copy to avoid any pointer weirdness - mds := make([]*markdown, len(markdowns)) - copy(mds, markdowns) - - for i, v := range mds { - if v.uniqueID == target.uniqueID { - index = i - break - } - } - - if index == -1 { - err := fmt.Errorf("could not find markdown to delete") - if debug { - log.Println(err) - } - return nil, err - } - - return append(mds[:index], mds[index+1:]...), nil +func (m *stashModel) loadDocs() tea.Cmd { + return findLocalFiles(*m.common) } diff --git a/ui/stashhelp.go b/ui/stashhelp.go index 2b30c2e..af9c16d 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -99,17 +99,7 @@ func (m stashModel) helpView() (string, int) { return m.renderHelp(h) } - // Help for when we're interacting with a single document - switch m.selectionState { - case selectionSettingNote: - return m.renderHelp([]string{"enter", "confirm", "esc", "cancel"}, []string{"q", "quit"}) - case selectionPromptingDelete: - return m.renderHelp([]string{"y", "delete", "n", "cancel"}, []string{"q", "quit"}) - } - var ( - isStashed bool - isStashable bool isEditable bool navHelp []string filterHelp []string @@ -119,13 +109,6 @@ func (m stashModel) helpView() (string, int) { appHelp []string ) - if numDocs > 0 { - md := m.selectedMarkdown() - isStashed = md != nil && md.docType == StashedDoc - isStashable = md != nil && md.docType == LocalDoc && m.online() - isEditable = md != nil && md.docType == LocalDoc && md.localPath != "" - } - if numDocs > 0 && m.showFullHelp { navHelp = []string{"enter", "open", "j/k ↑/↓", "choose"} } @@ -143,16 +126,13 @@ func (m stashModel) helpView() (string, int) { } // If we're browsing a filtered set - if m.filterState == filterApplied { - filterHelp = []string{"/", "edit search", "esc", "clear search"} + if m.filterApplied() { + filterHelp = []string{"/", "edit search", "esc", "clear filter"} } else { filterHelp = []string{"/", "find"} - } - - if isStashed { - selectionHelp = []string{"x", "delete", "m", "set memo"} - } else if isStashable { - selectionHelp = []string{"s", "stash"} + if m.stashFullyLoaded { + filterHelp = append(filterHelp, "t", "team filter") + } } if isEditable { @@ -181,13 +161,15 @@ func (m stashModel) helpView() (string, int) { return m.renderHelp(navHelp, filterHelp, selectionHelp, editHelp, sectionHelp, appHelp) } +const minHelpViewHeight = 5 + // renderHelp returns the rendered help view and associated line height for // the given groups of help items. func (m stashModel) renderHelp(groups ...[]string) (string, int) { if m.showFullHelp { str := m.fullHelpView(groups...) numLines := strings.Count(str, "\n") + 1 - return str, numLines + return str, max(numLines, minHelpViewHeight) } return m.miniHelpView(concatStringSlices(groups...)...), 1 } @@ -219,14 +201,8 @@ func (m stashModel) miniHelpView(entries ...string) string { k := entries[i] v := entries[i+1] - switch k { - case "s": - k = greenFg(k) - v = semiDimGreenFg(v) - default: - k = grayFg(k) - v = midGrayFg(v) - } + k = grayFg(k) + v = midGrayFg(v) next = fmt.Sprintf("%s %s", k, v) diff --git a/ui/stashitem.go b/ui/stashitem.go index d853fc7..26e8bb6 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -2,47 +2,31 @@ package ui import ( "fmt" - "log" "strings" "github.com/charmbracelet/lipgloss" - "github.com/muesli/reflow/ansi" + "github.com/charmbracelet/log" "github.com/muesli/reflow/truncate" "github.com/sahilm/fuzzy" ) const ( verticalLine = "│" - noMemoTitle = "No Memo" fileListingStashIcon = "• " ) func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { var ( - truncateTo = uint(m.common.width - stashViewHorizontalPadding*2) - gutter string - title = md.Note - date = md.relativeTime() - icon = "" + truncateTo = uint(m.common.width - stashViewHorizontalPadding*2) + gutter string + title = truncate.StringWithTail(md.Note, truncateTo, ellipsis) + date = md.relativeTime() + editedBy = "" + hasEditedBy = false + icon = "" + separator = "" ) - switch md.docType { - case NewsDoc: - if title == "" { - title = "News" - } else { - title = truncate.StringWithTail(title, truncateTo, ellipsis) - } - case StashedDoc, ConvertedDoc: - icon = fileListingStashIcon - if title == "" { - title = noMemoTitle - } - title = truncate.StringWithTail(title, truncateTo-uint(ansi.PrintableRuneWidth(icon)), ellipsis) - default: - title = truncate.StringWithTail(title, truncateTo, ellipsis) - } - isSelected := index == m.cursor() isFiltering := m.filterState == filtering singleFilteredItem := isFiltering && len(m.getVisibleMarkdowns()) == 1 @@ -52,87 +36,65 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { // highlight that first item since pressing return will open it. if isSelected && !isFiltering || singleFilteredItem { // Selected item - - switch m.selectionState { - case selectionPromptingDelete: - gutter = faintRedFg(verticalLine) - icon = faintRedFg(icon) - title = redFg(title) - date = faintRedFg(date) - case selectionSettingNote: - gutter = dullYellowFg(verticalLine) - icon = "" - title = m.noteInput.View() - date = dullYellowFg(date) - default: - if m.common.latestFileStashed == md.stashID && - m.statusMessage == stashingStatusMessage { - gutter = greenFg(verticalLine) - icon = dimGreenFg(icon) - title = greenFg(title) - date = semiDimGreenFg(date) - } else { - gutter = dullFuchsiaFg(verticalLine) - icon = dullFuchsiaFg(icon) - if m.currentSection().key == filterSection && - m.filterState == filterApplied || singleFilteredItem { - s := lipgloss.NewStyle().Foreground(fuchsia) - title = styleFilteredText(title, m.filterInput.Value(), s, s.Copy().Underline(true)) - } else { - title = fuchsiaFg(title) - } - date = dullFuchsiaFg(date) - } - } - } else { - // Regular (non-selected) items - - gutter = " " - - if m.common.latestFileStashed == md.stashID && - m.statusMessage == stashingStatusMessage { + if m.statusMessage == stashingStatusMessage { + gutter = greenFg(verticalLine) icon = dimGreenFg(icon) title = greenFg(title) date = semiDimGreenFg(date) - } else if md.docType == NewsDoc { - if isFiltering && m.filterInput.Value() == "" { - title = dimIndigoFg(title) - date = dimSubtleIndigoFg(date) + editedBy = semiDimGreenFg(editedBy) + separator = semiDimGreenFg(separator) + } else { + gutter = dullFuchsiaFg(verticalLine) + if m.currentSection().key == filterSection && + m.filterState == filterApplied || singleFilteredItem { + s := lipgloss.NewStyle().Foreground(fuchsia) + title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline(true)) } else { - s := lipgloss.NewStyle().Foreground(indigo) - title = styleFilteredText(title, m.filterInput.Value(), s, s.Copy().Underline(true)) - date = subtleIndigoFg(date) + title = fuchsiaFg(title) + icon = fuchsiaFg(icon) } + date = dimFuchsiaFg(date) + editedBy = dimDullFuchsiaFg(editedBy) + separator = dullFuchsiaFg(separator) + } + } else { + gutter = " " + if m.statusMessage == stashingStatusMessage { + icon = dimGreenFg(icon) + title = greenFg(title) + date = semiDimGreenFg(date) + editedBy = semiDimGreenFg(editedBy) + separator = semiDimGreenFg(separator) } else if isFiltering && m.filterInput.Value() == "" { icon = dimGreenFg(icon) - if title == noMemoTitle { - title = dimBrightGrayFg(title) - } else { - title = dimNormalFg(title) - } + title = dimNormalFg(title) date = dimBrightGrayFg(date) + editedBy = dimBrightGrayFg(editedBy) + separator = dimBrightGrayFg(separator) } else { icon = greenFg(icon) - if title == noMemoTitle { - title = brightGrayFg(title) - } else { - s := lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "#1a1a1a", Dark: "#dddddd"}) - title = styleFilteredText(title, m.filterInput.Value(), s, s.Copy().Underline(true)) - } - date = brightGrayFg(date) + + s := lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "#1a1a1a", Dark: "#dddddd"}) + title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline(true)) + date = grayFg(date) + editedBy = midGrayFg(editedBy) + separator = brightGrayFg(separator) } } - fmt.Fprintf(b, "%s %s%s\n", gutter, icon, title) + fmt.Fprintf(b, "%s %s%s%s%s\n", gutter, icon, separator, separator, title) fmt.Fprintf(b, "%s %s", gutter, date) + if hasEditedBy { + fmt.Fprintf(b, " %s", editedBy) + } } func styleFilteredText(haystack, needles string, defaultStyle, matchedStyle lipgloss.Style) string { b := strings.Builder{} normalizedHay, err := normalize(haystack) - if err != nil && debug { - log.Printf("error normalizing '%s': %v", haystack, err) + if err != nil { + log.Error("error normalizing", "haystack", haystack, "error", err) } matches := fuzzy.Find(needles, []string{normalizedHay}) diff --git a/ui/styles.go b/ui/styles.go index e5a6c83..fd25882 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -1,84 +1,46 @@ package ui -import . "github.com/charmbracelet/lipgloss" //nolint: revive +import "github.com/charmbracelet/lipgloss" // Colors. var ( - normal = AdaptiveColor{Light: "#1A1A1A", Dark: "#dddddd"} - normalDim = AdaptiveColor{Light: "#A49FA5", Dark: "#777777"} - gray = AdaptiveColor{Light: "#909090", Dark: "#626262"} - midGray = AdaptiveColor{Light: "#B2B2B2", Dark: "#4A4A4A"} - darkGray = AdaptiveColor{Light: "#DDDADA", Dark: "#3C3C3C"} - brightGray = AdaptiveColor{Light: "#847A85", Dark: "#979797"} - dimBrightGray = AdaptiveColor{Light: "#C2B8C2", Dark: "#4D4D4D"} - indigo = AdaptiveColor{Light: "#5A56E0", Dark: "#7571F9"} - dimIndigo = AdaptiveColor{Light: "#9498FF", Dark: "#494690"} - subtleIndigo = AdaptiveColor{Light: "#7D79F6", Dark: "#514DC1"} - dimSubtleIndigo = AdaptiveColor{Light: "#BBBDFF", Dark: "#383584"} - cream = AdaptiveColor{Light: "#FFFDF5", Dark: "#FFFDF5"} - yellowGreen = AdaptiveColor{Light: "#04B575", Dark: "#ECFD65"} - dullYellowGreen = AdaptiveColor{Light: "#6BCB94", Dark: "#9BA92F"} - fuchsia = AdaptiveColor{Light: "#EE6FF8", Dark: "#EE6FF8"} - dimFuchsia = AdaptiveColor{Light: "#F1A8FF", Dark: "#99519E"} - dullFuchsia = AdaptiveColor{Dark: "#AD58B4", Light: "#F793FF"} - dimDullFuchsia = AdaptiveColor{Light: "#F6C9FF", Dark: "#6B3A6F"} - green = Color("#04B575") - red = AdaptiveColor{Light: "#FF4672", Dark: "#ED567A"} - faintRed = AdaptiveColor{Light: "#FF6F91", Dark: "#C74665"} - - semiDimGreen = AdaptiveColor{Light: "#35D79C", Dark: "#036B46"} - dimGreen = AdaptiveColor{Light: "#72D2B0", Dark: "#0B5137"} + normalDim = lipgloss.AdaptiveColor{Light: "#A49FA5", Dark: "#777777"} + gray = lipgloss.AdaptiveColor{Light: "#909090", Dark: "#626262"} + midGray = lipgloss.AdaptiveColor{Light: "#B2B2B2", Dark: "#4A4A4A"} + darkGray = lipgloss.AdaptiveColor{Light: "#DDDADA", Dark: "#3C3C3C"} + brightGray = lipgloss.AdaptiveColor{Light: "#847A85", Dark: "#979797"} + dimBrightGray = lipgloss.AdaptiveColor{Light: "#C2B8C2", Dark: "#4D4D4D"} + cream = lipgloss.AdaptiveColor{Light: "#FFFDF5", Dark: "#FFFDF5"} + yellowGreen = lipgloss.AdaptiveColor{Light: "#04B575", Dark: "#ECFD65"} + fuchsia = lipgloss.AdaptiveColor{Light: "#EE6FF8", Dark: "#EE6FF8"} + dimFuchsia = lipgloss.AdaptiveColor{Light: "#F1A8FF", Dark: "#99519E"} + dullFuchsia = lipgloss.AdaptiveColor{Dark: "#AD58B4", Light: "#F793FF"} + dimDullFuchsia = lipgloss.AdaptiveColor{Light: "#F6C9FF", Dark: "#7B4380"} + green = lipgloss.Color("#04B575") + red = lipgloss.AdaptiveColor{Light: "#FF4672", Dark: "#ED567A"} + semiDimGreen = lipgloss.AdaptiveColor{Light: "#35D79C", Dark: "#036B46"} + dimGreen = lipgloss.AdaptiveColor{Light: "#72D2B0", Dark: "#0B5137"} ) // Ulimately, we'll transition to named styles. -// nolint:deadcode,unused,varcheck var ( - normalFg = NewStyle().Foreground(normal).Render - dimNormalFg = NewStyle().Foreground(normalDim).Render - - brightGrayFg = NewStyle().Foreground(brightGray).Render - dimBrightGrayFg = NewStyle().Foreground(dimBrightGray).Render - - grayFg = NewStyle().Foreground(gray).Render - midGrayFg = NewStyle().Foreground(midGray).Render - darkGrayFg = NewStyle().Foreground(darkGray) - - greenFg = NewStyle().Foreground(green).Render - semiDimGreenFg = NewStyle().Foreground(semiDimGreen).Render - dimGreenFg = NewStyle().Foreground(dimGreen).Render - - fuchsiaFg = NewStyle().Foreground(fuchsia).Render - dimFuchsiaFg = NewStyle().Foreground(dimFuchsia).Render - - dullFuchsiaFg = NewStyle().Foreground(dullFuchsia).Render - dimDullFuchsiaFg = NewStyle().Foreground(dimDullFuchsia).Render - - indigoFg = NewStyle().Foreground(fuchsia).Render - dimIndigoFg = NewStyle().Foreground(dimIndigo).Render - - subtleIndigoFg = NewStyle().Foreground(subtleIndigo).Render - dimSubtleIndigoFg = NewStyle().Foreground(dimSubtleIndigo).Render - - yellowFg = NewStyle().Foreground(yellowGreen).Render // renders light green on light backgrounds - dullYellowFg = NewStyle().Foreground(dullYellowGreen).Render // renders light green on light backgrounds - redFg = NewStyle().Foreground(red).Render - faintRedFg = NewStyle().Foreground(faintRed).Render -) - -var ( - tabStyle = NewStyle(). - Foreground(AdaptiveColor{Light: "#909090", Dark: "#626262"}) - - selectedTabStyle = NewStyle(). - Foreground(AdaptiveColor{Light: "#333333", Dark: "#979797"}) - - errorTitleStyle = NewStyle(). - Foreground(cream). - Background(red). - Padding(0, 1) - - subtleStyle = NewStyle(). - Foreground(AdaptiveColor{Light: "#9B9B9B", Dark: "#5C5C5C"}) - - paginationStyle = subtleStyle.Copy() + dimNormalFg = lipgloss.NewStyle().Foreground(normalDim).Render + brightGrayFg = lipgloss.NewStyle().Foreground(brightGray).Render + dimBrightGrayFg = lipgloss.NewStyle().Foreground(dimBrightGray).Render + grayFg = lipgloss.NewStyle().Foreground(gray).Render + midGrayFg = lipgloss.NewStyle().Foreground(midGray).Render + darkGrayFg = lipgloss.NewStyle().Foreground(darkGray) + greenFg = lipgloss.NewStyle().Foreground(green).Render + semiDimGreenFg = lipgloss.NewStyle().Foreground(semiDimGreen).Render + dimGreenFg = lipgloss.NewStyle().Foreground(dimGreen).Render + fuchsiaFg = lipgloss.NewStyle().Foreground(fuchsia).Render + dimFuchsiaFg = lipgloss.NewStyle().Foreground(dimFuchsia).Render + dullFuchsiaFg = lipgloss.NewStyle().Foreground(dullFuchsia).Render + dimDullFuchsiaFg = lipgloss.NewStyle().Foreground(dimDullFuchsia).Render + redFg = lipgloss.NewStyle().Foreground(red).Render + tabStyle = lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "#909090", Dark: "#626262"}) + selectedTabStyle = lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "#333333", Dark: "#979797"}) + errorTitleStyle = lipgloss.NewStyle().Foreground(cream).Background(red).Padding(0, 1) + subtleStyle = lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "#9B9B9B", Dark: "#5C5C5C"}) + paginationStyle = subtleStyle ) diff --git a/ui/ui.go b/ui/ui.go index df7e37f..ac2bd95 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -1,33 +1,25 @@ package ui import ( - "errors" "fmt" - "log" "os" "path/filepath" "strings" "time" + "github.com/charmbracelet/bubbles/list" tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/charm" - "github.com/charmbracelet/charm/keygen" + "github.com/charmbracelet/glamour" "github.com/charmbracelet/glow/utils" + "github.com/charmbracelet/lipgloss" + "github.com/charmbracelet/log" "github.com/muesli/gitcha" te "github.com/muesli/termenv" - "github.com/segmentio/ksuid" ) const ( - noteCharacterLimit = 256 // should match server - statusMessageTimeout = time.Second * 2 // how long to show status messages like "stashed!" + statusMessageTimeout = time.Second * 3 // how long to show status messages like "stashed!" ellipsis = "…" - - // Only show the spinner if it spins for at least this amount of time. - spinnerVisibilityTimeout = time.Millisecond * 140 - - // Minimum amount of time the spinner should be visible once it starts. - spinnerMinLifetime = time.Millisecond * 550 ) var ( @@ -36,29 +28,25 @@ var ( markdownExtensions = []string{ "*.md", "*.mdown", "*.mkdn", "*.mkd", "*.markdown", } - - // True if we're logging to a file, in which case we'll log more stuff. - debug = false - - // Types of documents we allow the user to stash. - stashableDocTypes = NewDocTypeSet(LocalDoc, NewsDoc) ) // NewProgram returns a new Tea program. func NewProgram(cfg Config) *tea.Program { - if cfg.Logfile != "" { - log.Println("-- Starting Glow ----------------") - log.Printf("High performance pager: %v", cfg.HighPerformancePager) - log.Printf("Glamour rendering: %v", cfg.GlamourEnabled) - log.Println("Bubble Tea now initializing...") - debug = true - } + log.Debug( + "Starting glow", + "high_perf_pager", + cfg.HighPerformancePager, + "glamour", + cfg.GlamourEnabled, + ) + config = cfg opts := []tea.ProgramOption{tea.WithAltScreen()} if cfg.EnableMouse { opts = append(opts, tea.WithMouseCellMotion()) } - return tea.NewProgram(newModel(cfg), opts...) + m := newModel(cfg) + return tea.NewProgram(m, opts...) } type errMsg struct{ err error } @@ -66,10 +54,6 @@ type errMsg struct{ err error } func (e errMsg) Error() string { return e.err.Error() } type ( - newCharmClientMsg *charm.Client - sshAuthErrMsg struct{} - keygenFailedMsg struct{ err error } - keygenSuccessMsg struct{} initLocalFileSearchMsg struct { cwd string ch chan gitcha.SearchResult @@ -79,16 +63,7 @@ type ( type ( foundLocalFileMsg gitcha.SearchResult localFileSearchFinished struct{} - gotStashMsg []*charm.Markdown - stashLoadErrMsg struct{ err error } - gotNewsMsg []*charm.Markdown statusMessageTimeoutMsg applicationContext - newsLoadErrMsg struct{ err error } - stashSuccessMsg markdown - stashFailMsg struct { - err error - markdown markdown - } ) // applicationContext indicates the area of the application something applies @@ -115,60 +90,18 @@ func (s state) String() string { }[s] } -type authStatus int - -const ( - authConnecting authStatus = iota - authOK - authFailed -) - -func (s authStatus) String() string { - return map[authStatus]string{ - authConnecting: "connecting", - authOK: "ok", - authFailed: "failed", - }[s] -} - -type keygenState int - -const ( - keygenUnstarted keygenState = iota - keygenRunning - keygenFinished -) - // Common stuff we'll need to access in all models. type commonModel struct { - cfg Config - cc *charm.Client - cwd string - authStatus authStatus - width int - height int - - // Local IDs of files stashed this session. We treat this like a set, - // ignoring the value portion with an empty struct. - filesStashed map[ksuid.KSUID]struct{} - - // ID of the most recently stashed markdown - latestFileStashed ksuid.KSUID - - // Files currently being stashed. We remove files from this set once - // a stash operation has either succeeded or failed. - filesStashing map[ksuid.KSUID]struct{} -} - -func (c commonModel) isStashing() bool { - return len(c.filesStashing) > 0 + cfg Config + cwd string + width int + height int } type model struct { - common *commonModel - state state - keygenState keygenState - fatalErr error + common *commonModel + state state + fatalErr error // Sub-models stash stashModel @@ -201,49 +134,37 @@ func (m *model) unloadDocument() []tea.Cmd { func newModel(cfg Config) tea.Model { initSections() - if cfg.GlamourStyle == "auto" { + if cfg.GlamourStyle == glamour.AutoStyle { if te.HasDarkBackground() { - cfg.GlamourStyle = "dark" + cfg.GlamourStyle = glamour.DarkStyle } else { - cfg.GlamourStyle = "light" + cfg.GlamourStyle = glamour.LightStyle } } - if len(cfg.DocumentTypes) == 0 { - cfg.DocumentTypes.Add(LocalDoc, StashedDoc, ConvertedDoc, NewsDoc) - } + teamList := list.New([]list.Item{}, list.NewDefaultDelegate(), 0, 0) + teamList.Styles.Title = lipgloss.NewStyle().Foreground(yellowGreen) + teamList.SetStatusBarItemName("team", "teams") + teamList.SetShowHelp(true) + + // We use the team list status message as a permanent placeholder. + teamList.StatusMessageLifetime = time.Hour common := commonModel{ - cfg: cfg, - authStatus: authConnecting, - filesStashed: make(map[ksuid.KSUID]struct{}), - filesStashing: make(map[ksuid.KSUID]struct{}), + cfg: cfg, } return model{ - common: &common, - state: stateShowStash, - keygenState: keygenUnstarted, - pager: newPagerModel(&common), - stash: newStashModel(&common), + common: &common, + state: stateShowStash, + pager: newPagerModel(&common), + stash: newStashModel(&common), } } func (m model) Init() tea.Cmd { - var cmds []tea.Cmd - d := m.common.cfg.DocumentTypes - - if d.Contains(StashedDoc) || d.Contains(NewsDoc) { - cmds = append(cmds, - newCharmClient, - m.stash.spinner.Tick, - ) - } - - if d.Contains(LocalDoc) { - cmds = append(cmds, findLocalFiles(m)) - } - + cmds := []tea.Cmd{m.stash.spinner.Tick} + cmds = append(cmds, m.stash.loadDocs()) return tea.Batch(cmds...) } @@ -261,7 +182,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case tea.KeyMsg: switch msg.String() { case "esc": - if m.state == stateShowDocument { + if m.state == stateShowDocument || m.stash.viewState == stashStateLoadingDocument { batch := m.unloadDocument() return m, tea.Batch(batch...) } @@ -272,28 +193,16 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch m.state { case stateShowStash: // pass through all keys if we're editing the filter - if m.stash.filterState == filtering || m.stash.selectionState == selectionSettingNote { + if m.stash.filterState == filtering { m.stash, cmd = m.stash.update(msg) return m, cmd } - - // Special cases for the pager - case stateShowDocument: - switch m.pager.state { - // If setting a note send all keys straight through - case pagerStateSetNote: - var batch []tea.Cmd - newPagerModel, cmd := m.pager.update(msg) - m.pager = newPagerModel - batch = append(batch, cmd) - return m, tea.Batch(batch...) - } } return m, tea.Quit case "left", "h", "delete": - if m.state == stateShowDocument && m.pager.state != pagerStateSetNote { + if m.state == stateShowDocument { cmds = append(cmds, m.unloadDocument()...) return m, tea.Batch(cmds...) } @@ -315,66 +224,16 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.common.cwd = msg.cwd cmds = append(cmds, findNextLocalFile(m)) - case sshAuthErrMsg: - if m.keygenState != keygenFinished { // if we haven't run the keygen yet, do that - m.keygenState = keygenRunning - cmds = append(cmds, generateSSHKeys) - } else { - // The keygen ran but things still didn't work and we can't auth - m.common.authStatus = authFailed - m.stash.err = errors.New("SSH authentication failed; we tried ssh-agent, loading keys from disk, and generating SSH keys") - if debug { - log.Println("entering offline mode;", m.stash.err) - } - - // Even though it failed, news/stash loading is finished - m.stash.loaded.Add(StashedDoc, NewsDoc) - } - - case keygenFailedMsg: - // Keygen failed. That sucks. - m.common.authStatus = authFailed - m.stash.err = errors.New("could not authenticate; could not generate SSH keys") - if debug { - log.Println("entering offline mode;", m.stash.err) - } - - m.keygenState = keygenFinished - - // Even though it failed, news/stash loading is finished - m.stash.loaded.Add(StashedDoc, NewsDoc) - - case keygenSuccessMsg: - // The keygen's done, so let's try initializing the charm client again - m.keygenState = keygenFinished - cmds = append(cmds, newCharmClient) - - case newCharmClientMsg: - m.common.cc = msg - m.common.authStatus = authOK - cmds = append(cmds, loadStash(m.stash), loadNews(m.stash)) - - case stashLoadErrMsg: - m.common.authStatus = authFailed - case fetchedMarkdownMsg: // We've loaded a markdown file's contents for rendering m.pager.currentDocument = *msg - msg.Body = string(utils.RemoveFrontmatter([]byte(msg.Body))) - cmds = append(cmds, renderWithGlamour(m.pager, msg.Body)) + body := string(utils.RemoveFrontmatter([]byte(msg.Body))) + cmds = append(cmds, renderWithGlamour(m.pager, body)) case contentRenderedMsg: m.state = stateShowDocument - case noteSavedMsg: - // A note was saved to a document. This will have been done in the - // pager, so we'll need to find the corresponding note in the stash. - // So, pass the message to the stash for processing. - stashModel, cmd := m.stash.update(msg) - m.stash = stashModel - return m, cmd - - case localFileSearchFinished, gotStashMsg, gotNewsMsg: + case localFileSearchFinished: // Always pass these messages to the stash so we can keep it updated // about network activity, even if the user isn't currently viewing // the stash. @@ -393,35 +252,6 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } cmds = append(cmds, findNextLocalFile(m)) - case stashSuccessMsg: - // Common handling that should happen regardless of application state - md := markdown(msg) - m.stash.addMarkdowns(&md) - m.common.filesStashed[msg.stashID] = struct{}{} - delete(m.common.filesStashing, md.stashID) - - if m.stash.filterApplied() { - for _, v := range m.stash.filteredMarkdowns { - if v.stashID == msg.stashID && v.docType == ConvertedDoc { - // Add the server-side ID we got back so we can do things - // like rename and stash it. - v.ID = msg.ID - - // Keep the unique ID in sync so we can do things like - // delete. Note that the markdown received a new unique ID - // when it was added to the file listing in - // stash.addMarkdowns. - v.uniqueID = md.uniqueID - break - } - } - } - - case stashFailMsg: - // Common handling that should happen regardless of application state - delete(m.common.filesStashed, msg.markdown.stashID) - delete(m.common.filesStashing, msg.markdown.stashID) - case filteredMarkdownMsg: if m.state == stateShowDocument { newStashModel, cmd := m.stash.update(msg) @@ -476,10 +306,11 @@ func errorView(err error, fatal bool) string { // COMMANDS -func findLocalFiles(m model) tea.Cmd { +func findLocalFiles(m commonModel) tea.Cmd { return func() tea.Msg { + log.Info("findLocalFiles") var ( - cwd = m.common.cfg.WorkingDirectory + cwd = m.cfg.WorkingDirectory err error ) @@ -495,26 +326,19 @@ func findLocalFiles(m model) tea.Cmd { // Note that this is one error check for both cases above if err != nil { - if debug { - log.Println("error finding local files:", err) - } + log.Error("error finding local files", "error", err) return errMsg{err} } - if debug { - log.Println("local directory is:", cwd) - } - + log.Debug("local directory is", "cwd", cwd) var ignore []string - if !m.common.cfg.ShowAllFiles { + if !m.cfg.ShowAllFiles { ignore = ignorePatterns(m) } ch, err := gitcha.FindFilesExcept(cwd, markdownExtensions, ignore) if err != nil { - if debug { - log.Println("error finding local files:", err) - } + log.Error("error finding local files", "error", err) return errMsg{err} } @@ -531,186 +355,11 @@ func findNextLocalFile(m model) tea.Cmd { return foundLocalFileMsg(res) } // We're done - if debug { - log.Println("local file search finished") - } + log.Debug("local file search finished") return localFileSearchFinished{} } } -func newCharmClient() tea.Msg { - cfg, err := charm.ConfigFromEnv() - if err != nil { - return errMsg{err} - } - - cc, err := charm.NewClient(cfg) - if err == charm.ErrMissingSSHAuth { - if debug { - log.Println("missing SSH auth:", err) - } - return sshAuthErrMsg{} - } else if err != nil { - if debug { - log.Println("error creating new charm client:", err) - } - return errMsg{err} - } - - return newCharmClientMsg(cc) -} - -func loadStash(m stashModel) tea.Cmd { - return func() tea.Msg { - if m.common.cc == nil { - err := errors.New("no charm client") - if debug { - log.Println("error loading stash:", err) - } - return stashLoadErrMsg{err} - } - stash, err := m.common.cc.GetStash(m.serverPage) - if err != nil { - if debug { - if _, ok := err.(charm.ErrAuthFailed); ok { - log.Println("auth failure while loading stash:", err) - } else { - log.Println("error loading stash:", err) - } - } - return stashLoadErrMsg{err} - } - if debug { - log.Println("loaded stash page", m.serverPage) - } - return gotStashMsg(stash) - } -} - -func loadNews(m stashModel) tea.Cmd { - return func() tea.Msg { - if m.common.cc == nil { - err := errors.New("no charm client") - if debug { - log.Println("error loading news:", err) - } - return newsLoadErrMsg{err} - } - news, err := m.common.cc.GetNews(1) // just fetch the first page - if err != nil { - if debug { - log.Println("error loading news:", err) - } - return newsLoadErrMsg{err} - } - if debug { - log.Println("fetched news") - } - return gotNewsMsg(news) - } -} - -func generateSSHKeys() tea.Msg { - if debug { - log.Println("running keygen...") - } - _, err := keygen.NewSSHKeyPair(nil) - if err != nil { - if debug { - log.Println("keygen failed:", err) - } - return keygenFailedMsg{err} - } - if debug { - log.Println("keys generated successfully") - } - return keygenSuccessMsg{} -} - -func saveDocumentNote(cc *charm.Client, id int, note string) tea.Cmd { - if cc == nil { - return func() tea.Msg { - err := errors.New("can't set note; no charm client") - if debug { - log.Println("error saving note:", err) - } - return errMsg{err} - } - } - return func() tea.Msg { - if err := cc.SetMarkdownNote(id, note); err != nil { - if debug { - log.Println("error saving note:", err) - } - return errMsg{err} - } - return noteSavedMsg(&charm.Markdown{ID: id, Note: note}) - } -} - -func stashDocument(cc *charm.Client, md markdown) tea.Cmd { - return func() tea.Msg { - if cc == nil { - err := errors.New("can't stash; no charm client") - if debug { - log.Println("error stashing document:", err) - } - return stashFailMsg{err, md} - } - - // Is the document missing a body? If so, it likely means it needs to - // be loaded. But...if it turns out the document body really is empty - // then we'll stash it anyway. - if len(md.Body) == 0 { - switch md.docType { - case LocalDoc: - data, err := os.ReadFile(md.localPath) - if err != nil { - if debug { - log.Println("error loading document body for stashing:", err) - } - return stashFailMsg{err, md} - } - md.Body = string(data) - - case NewsDoc: - newMD, err := fetchMarkdown(cc, md.ID, md.docType) - if err != nil { - if debug { - log.Println(err) - } - return stashFailMsg{err, md} - } - md.Body = newMD.Body - - default: - err := fmt.Errorf("user is attempting to stash an unsupported markdown type: %s", md.docType) - if debug { - log.Println(err) - } - return stashFailMsg{err, md} - } - } - - newMd, err := cc.StashMarkdown(md.Note, md.Body) - if err != nil { - if debug { - log.Println("error stashing document:", err) - } - return stashFailMsg{err, md} - } - - md.convertToStashed() - - // The server sends the whole stashed document back, but we really just - // need to know the ID so we can operate on this newly stashed - // markdown. - md.ID = newMd.ID - - return stashSuccessMsg(md) - } -} - func waitForStatusMessageTimeout(appCtx applicationContext, t *time.Timer) tea.Cmd { return func() tea.Msg { <-t.C @@ -725,19 +374,16 @@ func waitForStatusMessageTimeout(appCtx applicationContext, t *time.Timer) tea.C // a directory, but we trust that gitcha has already done that. func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { md := &markdown{ - docType: LocalDoc, localPath: res.Path, - Markdown: charm.Markdown{ - Note: stripAbsolutePath(res.Path, cwd), - CreatedAt: res.Info.ModTime(), - }, + Note: stripAbsolutePath(res.Path, cwd), + Modtime: res.Info.ModTime(), } return md } func stripAbsolutePath(fullPath, cwd string) string { - return strings.Replace(fullPath, cwd+string(os.PathSeparator), "", -1) + return strings.ReplaceAll(fullPath, cwd+string(os.PathSeparator), "") } // Lightweight version of reflow's indent function. diff --git a/utils/utils.go b/utils/utils.go index fe38c13..693cccc 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -2,8 +2,13 @@ package utils import ( "os" + "path/filepath" "regexp" + "strings" + "github.com/charmbracelet/glamour" + "github.com/charmbracelet/glamour/ansi" + "github.com/charmbracelet/lipgloss" "github.com/mitchellh/go-homedir" ) @@ -32,3 +37,73 @@ func ExpandPath(path string) string { } return os.ExpandEnv(path) } + +// WrapCodeBlock wraps a string in a code block with the given language. +func WrapCodeBlock(s, language string) string { + return "```" + language + "\n" + s + "```" +} + +var markdownExtensions = []string{ + ".md", ".mdown", ".mkdn", ".mkd", ".markdown", +} + +// IsMarkdownFile returns whether the filename has a markdown extension. +func IsMarkdownFile(filename string) bool { + ext := filepath.Ext(filename) + + if ext == "" { + // By default, assume it's a markdown file. + return true + } + + for _, v := range markdownExtensions { + if strings.EqualFold(ext, v) { + return true + } + } + + // Has an extension but not markdown + // so assume this is a code file. + return false +} + +func GlamourStyle(style string, isCode bool) glamour.TermRendererOption { + if !isCode { + if style == glamour.AutoStyle { + return glamour.WithAutoStyle() + } else { + return glamour.WithStylePath(style) + } + } + + // If we are rendering a pure code block, we need to modify the style to + // remove the indentation. + + var styleConfig ansi.StyleConfig + + switch style { + case glamour.AutoStyle: + if lipgloss.HasDarkBackground() { + styleConfig = glamour.DarkStyleConfig + } else { + styleConfig = glamour.LightStyleConfig + } + case glamour.DarkStyle: + styleConfig = glamour.DarkStyleConfig + case glamour.LightStyle: + styleConfig = glamour.LightStyleConfig + case glamour.PinkStyle: + styleConfig = glamour.PinkStyleConfig + case glamour.NoTTYStyle: + styleConfig = glamour.NoTTYStyleConfig + case glamour.DraculaStyle: + styleConfig = glamour.DraculaStyleConfig + default: + return glamour.WithStylesFromJSONFile(style) + } + + var margin uint + styleConfig.CodeBlock.Margin = &margin + + return glamour.WithStyles(styleConfig) +} From c47e2acd30ea786420adab3c26df9047b4af2b43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Jul 2024 12:26:01 -0300 Subject: [PATCH 765/911] chore(deps): bump golangci/golangci-lint-action from 4 to 6 (#612) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 4 to 6. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v4...v6) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index be5fbb2..6fd0ab7 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: golangci-lint - uses: golangci/golangci-lint-action@v4 + uses: golangci/golangci-lint-action@v6 with: # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 From 3ee20895b129ee7cf6d52da48e7db822bc3ce070 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Jul 2024 12:26:38 -0300 Subject: [PATCH 766/911] chore(deps): bump github.com/charmbracelet/glamour from 0.6.0 to 0.7.0 (#600) Bumps [github.com/charmbracelet/glamour](https://github.com/charmbracelet/glamour) from 0.6.0 to 0.7.0. - [Release notes](https://github.com/charmbracelet/glamour/releases) - [Commits](https://github.com/charmbracelet/glamour/compare/v0.6.0...v0.7.0) --- updated-dependencies: - dependency-name: github.com/charmbracelet/glamour dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c92758b..4a535ce 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/caarlos0/env/v11 v11.0.1 github.com/charmbracelet/bubbles v0.18.0 github.com/charmbracelet/bubbletea v0.26.4 - github.com/charmbracelet/glamour v0.6.1-0.20230519131405-7528eaad6620 + github.com/charmbracelet/glamour v0.7.0 github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd github.com/charmbracelet/log v0.4.0 github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d diff --git a/go.sum b/go.sum index cdfa083..95f233d 100644 --- a/go.sum +++ b/go.sum @@ -59,8 +59,8 @@ github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/ github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= github.com/charmbracelet/bubbletea v0.26.4 h1:2gDkkzLZaTjMl/dQBpNVtnvcCxsh/FCkimep7FC9c40= github.com/charmbracelet/bubbletea v0.26.4/go.mod h1:P+r+RRA5qtI1DOHNFn0otoNwB4rn+zNAzSj/EXz6xU0= -github.com/charmbracelet/glamour v0.6.1-0.20230519131405-7528eaad6620 h1:kjH+o66+/WLisZBZ+30/5Z6UQk69KVFdqcjr7mlMC8Y= -github.com/charmbracelet/glamour v0.6.1-0.20230519131405-7528eaad6620/go.mod h1:swCB3CXFsh22H1ESDYdY1tirLiNqCziulDyJ1B6Nt7Q= +github.com/charmbracelet/glamour v0.7.0 h1:2BtKGZ4iVJCDfMF229EzbeR1QRKLWztO9dMtjmqZSng= +github.com/charmbracelet/glamour v0.7.0/go.mod h1:jUMh5MeihljJPQbJ/wf4ldw2+yBP59+ctV36jASy7ps= github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd h1:vK2fQGG+d7VMa/Ly4f6HoCqzTGC8wnwl4dKulWCHaH0= github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd/go.mod h1:U8h88bAaHc+dNaV2UXjn0U3WChVxskgaD8/52JAIupM= github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM= From 7e471f17877ce2dd69a4f443f6b0c9bf0f95382d Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 3 Jul 2024 13:05:46 -0300 Subject: [PATCH 767/911] fix: lint issue Signed-off-by: Carlos Alexandro Becker --- config_cmd.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_cmd.go b/config_cmd.go index 902ea82..73aba54 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -34,7 +34,7 @@ var configCmd = &cobra.Command{ Long: paragraph(fmt.Sprintf("\n%s the glow config file. We’ll use EDITOR to determine which editor to use. If the config file doesn't exist, it will be created.", keyword("Edit"))), Example: paragraph("glow config\nglow config --config path/to/config.yml"), Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { + RunE: func(*cobra.Command, []string) error { if err := ensureConfigFile(); err != nil { return err } From f3d0cb89da8fbe6845e1d5cd032b5dd67a8aa661 Mon Sep 17 00:00:00 2001 From: rustfix <155627174+rustfix@users.noreply.github.com> Date: Thu, 4 Jul 2024 00:06:57 +0800 Subject: [PATCH 768/911] chore: fix typo in comment (#607) Signed-off-by: rustfix <771054535@qq.com> From 8e5139657547918b8e83c544cf68ec1e7e87b7c4 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 3 Jul 2024 13:09:20 -0300 Subject: [PATCH 769/911] fix: check other possible readme paths/branches (#450) * fix: check other possible readme paths/branches Signed-off-by: Carlos A Becker * fix: url Signed-off-by: Carlos A Becker * fix: Readme.md --------- Signed-off-by: Carlos A Becker --- github.go | 25 ++++++++++++++----------- gitlab.go | 25 ++++++++++++++----------- glow_test.go | 19 ++++++++++--------- main.go | 15 ++++++++------- 4 files changed, 46 insertions(+), 38 deletions(-) diff --git a/github.go b/github.go index b824cf5..ac64096 100644 --- a/github.go +++ b/github.go @@ -2,6 +2,7 @@ package main import ( "errors" + "fmt" "net/http" "net/url" "strings" @@ -29,19 +30,21 @@ func findGitHubREADME(s string) (*source, error) { } u.Host = "raw.githubusercontent.com" - for _, r := range readmeNames { - v := u - v.Path += "/master/" + r + for _, b := range readmeBranches { + for _, r := range readmeNames { + v := *u + v.Path += fmt.Sprintf("/%s/%s", b, r) - // nolint:bodyclose - // it is closed on the caller - resp, err := http.Get(v.String()) - if err != nil { - return nil, err - } + // nolint:bodyclose + // it is closed on the caller + resp, err := http.Get(v.String()) + if err != nil { + return nil, err + } - if resp.StatusCode == http.StatusOK { - return &source{resp.Body, v.String()}, nil + if resp.StatusCode == http.StatusOK { + return &source{resp.Body, v.String()}, nil + } } } diff --git a/gitlab.go b/gitlab.go index e8c8a57..47059bb 100644 --- a/gitlab.go +++ b/gitlab.go @@ -2,6 +2,7 @@ package main import ( "errors" + "fmt" "net/http" "net/url" "strings" @@ -28,19 +29,21 @@ func findGitLabREADME(s string) (*source, error) { return nil, err } - for _, r := range readmeNames { - v := u - v.Path += "/raw/master/" + r + for _, b := range readmeBranches { + for _, r := range readmeNames { + v := *u + v.Path += fmt.Sprintf("/raw/%s/%s", b, r) - // nolint:bodyclose - // it is closed on the caller - resp, err := http.Get(v.String()) - if err != nil { - return nil, err - } + // nolint:bodyclose + // it is closed on the caller + resp, err := http.Get(v.String()) + if err != nil { + return nil, err + } - if resp.StatusCode == http.StatusOK { - return &source{resp.Body, v.String()}, nil + if resp.StatusCode == http.StatusOK { + return &source{resp.Body, v.String()}, nil + } } } diff --git a/glow_test.go b/glow_test.go index ed4f0cd..37f4079 100644 --- a/glow_test.go +++ b/glow_test.go @@ -14,15 +14,16 @@ func TestGlowSources(t *testing.T) { } for _, v := range tt { - buf := &bytes.Buffer{} - err := executeArg(rootCmd, v, buf) - - if err != nil { - t.Errorf("Error during execution (args: %s): %v", v, err) - } - if buf.Len() == 0 { - t.Errorf("Output buffer should not be empty (args: %s)", v) - } + t.Run(v, func(t *testing.T) { + buf := &bytes.Buffer{} + err := executeArg(rootCmd, v, buf) + if err != nil { + t.Errorf("Error during execution (args: %s): %v", v, err) + } + if buf.Len() == 0 { + t.Errorf("Output buffer should not be empty (args: %s)", v) + } + }) } } diff --git a/main.go b/main.go index 4aac4e7..6ca2eea 100644 --- a/main.go +++ b/main.go @@ -28,13 +28,14 @@ var ( // CommitSHA as provided by goreleaser. CommitSHA = "" - readmeNames = []string{"README.md", "README"} - configFile string - pager bool - style string - width uint - showAllFiles bool - mouse bool + readmeNames = []string{"README.md", "README", "Readme.md", "Readme", "readme.md", "readme"} + readmeBranches = []string{"main", "master"} + configFile string + pager bool + style string + width uint + showAllFiles bool + mouse bool rootCmd = &cobra.Command{ Use: "glow [SOURCE|DIR]", From 08c564c8588e972b920807cca8e5335ddbd6632f Mon Sep 17 00:00:00 2001 From: Aitva Date: Wed, 3 Jul 2024 18:19:19 +0200 Subject: [PATCH 770/911] fix: --all bypass .gitignore rules (#285) (#504) * feat(deps): bump github.com/muesli/gitcha from 0.2.0 to 0.3.0 * fix: --all bypass .gitignore rules (#285) * Update ui/ui.go --------- Co-authored-by: Carlos Alexandro Becker --- go.mod | 2 +- go.sum | 3 +++ ui/ui.go | 11 +++++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 4a535ce..d0962fa 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/dustin/go-humanize v1.0.1 github.com/mattn/go-runewidth v0.0.15 github.com/mitchellh/go-homedir v1.1.0 - github.com/muesli/gitcha v0.2.0 + github.com/muesli/gitcha v0.3.0 github.com/muesli/go-app-paths v0.2.2 github.com/muesli/reflow v0.3.0 github.com/muesli/termenv v0.15.2 diff --git a/go.sum b/go.sum index 95f233d..37fc917 100644 --- a/go.sum +++ b/go.sum @@ -214,6 +214,9 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/gitcha v0.2.0 h1:+wOgT2dI9s2Tznj1t1rb/qkK5e0cb6qD8c4IX2TR/YY= github.com/muesli/gitcha v0.2.0/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= +github.com/muesli/gitcha v0.3.0 h1:+PJkVKrDXVB0VgRn/yVx2CqSVSDGMSepzvohsCrPYtQ= +github.com/muesli/gitcha v0.3.0/go.mod h1:vX3jFL+XcEUq1uY74RCjLSZfAV+ZuvLg70/NGPdXn84= +github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/go-app-paths v0.2.2 h1:NqG4EEZwNIhBq/pREgfBmgDmt3h1Smr1MjZiXbpZUnI= github.com/muesli/go-app-paths v0.2.2/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= diff --git a/ui/ui.go b/ui/ui.go index ac2bd95..bb7703d 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -331,12 +331,15 @@ func findLocalFiles(m commonModel) tea.Cmd { } log.Debug("local directory is", "cwd", cwd) - var ignore []string - if !m.cfg.ShowAllFiles { - ignore = ignorePatterns(m) + + // Switch between FindFiles and FindAllFiles to bypass .gitignore rules + var ch chan gitcha.SearchResult + if m.cfg.ShowAllFiles { + ch, err = gitcha.FindAllFilesExcept(cwd, markdownExtensions, nil) + } else { + ch, err = gitcha.FindFilesExcept(cwd, markdownExtensions, ignorePatterns(m)) } - ch, err := gitcha.FindFilesExcept(cwd, markdownExtensions, ignore) if err != nil { log.Error("error finding local files", "error", err) return errMsg{err} From dbfcc27dadf23b01e46832ad971fee0b520ef603 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 3 Jul 2024 13:27:07 -0300 Subject: [PATCH 771/911] chore: go mod tidy Signed-off-by: Carlos Alexandro Becker --- go.sum | 3 --- 1 file changed, 3 deletions(-) diff --git a/go.sum b/go.sum index 37fc917..42a28f0 100644 --- a/go.sum +++ b/go.sum @@ -212,11 +212,8 @@ github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= -github.com/muesli/gitcha v0.2.0 h1:+wOgT2dI9s2Tznj1t1rb/qkK5e0cb6qD8c4IX2TR/YY= -github.com/muesli/gitcha v0.2.0/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/muesli/gitcha v0.3.0 h1:+PJkVKrDXVB0VgRn/yVx2CqSVSDGMSepzvohsCrPYtQ= github.com/muesli/gitcha v0.3.0/go.mod h1:vX3jFL+XcEUq1uY74RCjLSZfAV+ZuvLg70/NGPdXn84= -github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/go-app-paths v0.2.2 h1:NqG4EEZwNIhBq/pREgfBmgDmt3h1Smr1MjZiXbpZUnI= github.com/muesli/go-app-paths v0.2.2/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= From 821d51da131170be16469c0692a6dca8f3ccc540 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 3 Jul 2024 13:36:17 -0300 Subject: [PATCH 772/911] fix: do not show absolute path as note --- ui/stash.go | 1 - 1 file changed, 1 deletion(-) diff --git a/ui/stash.go b/ui/stash.go index ea2b4ce..86aeec0 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -859,7 +859,6 @@ func loadLocalMarkdown(md *markdown) tea.Cmd { log.Debug("error reading local file", "error", err) return errMsg{err} } - md.Note = md.localPath md.Body = string(data) return fetchedMarkdownMsg(md) } From d7032fe57f7aa06e3e8f04f810db6796ed8fe42d Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 3 Jul 2024 13:41:11 -0300 Subject: [PATCH 773/911] feat: shell completions closes #533 closes #546 closes #512 --- main.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/main.go b/main.go index 6ca2eea..3f67f9a 100644 --- a/main.go +++ b/main.go @@ -46,6 +46,10 @@ var ( SilenceErrors: false, SilenceUsage: true, TraverseChildren: true, + Args: cobra.MaximumNArgs(1), + ValidArgsFunction: func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + return nil, cobra.ShellCompDirectiveDefault + }, PersistentPreRunE: func(cmd *cobra.Command, _ []string) error { return validateOptions(cmd) }, @@ -360,6 +364,7 @@ func init() { Version = "unknown (built from source)" } rootCmd.Version = Version + rootCmd.InitDefaultCompletionCmd() // "Glow Classic" cli arguments rootCmd.PersistentFlags().StringVar(&configFile, "config", "", fmt.Sprintf("config file (default %s)", defaultConfigFile())) From f1cf0ba7856ec7d8f203a1a2c9b8597b3a0cdb14 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 3 Jul 2024 13:59:11 -0300 Subject: [PATCH 774/911] feat: man pages closes #269 --- go.mod | 4 ++++ go.sum | 8 ++++++++ main.go | 2 +- man_cmd.go | 27 +++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 man_cmd.go diff --git a/go.mod b/go.mod index d0962fa..fe93674 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,9 @@ require ( github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.3.0 github.com/muesli/go-app-paths v0.2.2 + github.com/muesli/mango-cobra v1.2.0 github.com/muesli/reflow v0.3.0 + github.com/muesli/roff v0.1.0 github.com/muesli/termenv v0.15.2 github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.7.0 @@ -51,6 +53,8 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect + github.com/muesli/mango v0.1.0 // indirect + github.com/muesli/mango-pflag v0.1.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/rivo/uniseg v0.4.7 // indirect diff --git a/go.sum b/go.sum index 42a28f0..ccf451f 100644 --- a/go.sum +++ b/go.sum @@ -216,8 +216,16 @@ github.com/muesli/gitcha v0.3.0 h1:+PJkVKrDXVB0VgRn/yVx2CqSVSDGMSepzvohsCrPYtQ= github.com/muesli/gitcha v0.3.0/go.mod h1:vX3jFL+XcEUq1uY74RCjLSZfAV+ZuvLg70/NGPdXn84= github.com/muesli/go-app-paths v0.2.2 h1:NqG4EEZwNIhBq/pREgfBmgDmt3h1Smr1MjZiXbpZUnI= github.com/muesli/go-app-paths v0.2.2/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= +github.com/muesli/mango v0.1.0 h1:DZQK45d2gGbql1arsYA4vfg4d7I9Hfx5rX/GCmzsAvI= +github.com/muesli/mango v0.1.0/go.mod h1:5XFpbC8jY5UUv89YQciiXNlbi+iJgt29VDC5xbzrLL4= +github.com/muesli/mango-cobra v1.2.0 h1:DQvjzAM0PMZr85Iv9LIMaYISpTOliMEg+uMFtNbYvWg= +github.com/muesli/mango-cobra v1.2.0/go.mod h1:vMJL54QytZAJhCT13LPVDfkvCUJ5/4jNUKF/8NC2UjA= +github.com/muesli/mango-pflag v0.1.0 h1:UADqbYgpUyRoBja3g6LUL+3LErjpsOwaC9ywvBWe7Sg= +github.com/muesli/mango-pflag v0.1.0/go.mod h1:YEQomTxaCUp8PrbhFh10UfbhbQrM/xJ4i2PB8VTLLW0= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= +github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8= +github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig= github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= diff --git a/main.go b/main.go index 3f67f9a..b5f1537 100644 --- a/main.go +++ b/main.go @@ -384,7 +384,7 @@ func init() { viper.SetDefault("style", glamour.AutoStyle) viper.SetDefault("width", 0) - rootCmd.AddCommand(configCmd) + rootCmd.AddCommand(configCmd, manCmd) } func tryLoadConfigFromDefaultPlaces() { diff --git a/man_cmd.go b/man_cmd.go new file mode 100644 index 0000000..9aa5951 --- /dev/null +++ b/man_cmd.go @@ -0,0 +1,27 @@ +package main + +import ( + "fmt" + "os" + + mcobra "github.com/muesli/mango-cobra" + "github.com/muesli/roff" + "github.com/spf13/cobra" +) + +var manCmd = &cobra.Command{ + Use: "man", + Short: "Generates manpages", + SilenceUsage: true, + DisableFlagsInUseLine: true, + Hidden: true, + Args: cobra.NoArgs, + RunE: func(*cobra.Command, []string) error { + manPage, err := mcobra.NewManPage(1, rootCmd) + if err != nil { + return err + } + _, err = fmt.Fprint(os.Stdout, manPage.Build(roff.NewDocument())) + return err + }, +} From 0a7db867251a8c9467e28115e7f63e7ec66fcc9d Mon Sep 17 00:00:00 2001 From: haennes <66882117+haennes@users.noreply.github.com> Date: Mon, 8 Jul 2024 16:19:02 +0200 Subject: [PATCH 775/911] docs: use nix-shell as nix-env -iA is bad practice (#622) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3750751..6294de5 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,8 @@ pacman -S glow # Void Linux xbps-install -S glow -# Nix -nix-env -iA nixpkgs.glow +# Nix shell +nix-shell -p glow --command glow # FreeBSD pkg install glow From b1d377237d81d8149f6c0dd3c70ddacd2ac2b5c5 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Mon, 8 Jul 2024 16:15:08 -0300 Subject: [PATCH 776/911] feat: add 'r' to refresh list and document (#624) * feat: add 'r' to refresh list closes #416 Co-authored-by: Dieter Eickstaedt * feat: refresh document Closes #501 Co-authored-by: fedeztk --------- Co-authored-by: Dieter Eickstaedt Co-authored-by: fedeztk --- ui/pager.go | 8 +++++--- ui/stash.go | 4 ---- ui/stashhelp.go | 1 + ui/ui.go | 7 ++++++- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 3ed307c..ade9b49 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -205,6 +205,9 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { _ = clipboard.WriteAll(m.currentDocument.Body) cmds = append(cmds, m.showStatusMessage(pagerStatusMessage{"Copied contents", false})) + case "r": + return m, loadLocalMarkdown(&m.currentDocument) + case "?": m.toggleHelp() if m.viewport.HighPerformanceRendering { @@ -330,13 +333,12 @@ func (m pagerModel) statusBarView(b *strings.Builder) { } func (m pagerModel) helpView() (s string) { - edit := "e edit this document" - col1 := []string{ "g/home go to top", "G/end go to bottom", "c copy contents", - edit, + "e edit this document", + "r reload this document", "esc back to files", "q quit", } diff --git a/ui/stash.go b/ui/stash.go index 86aeec0..d6849c1 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -888,7 +888,3 @@ func filterMarkdowns(m stashModel) tea.Cmd { return filteredMarkdownMsg(filtered) } } - -func (m *stashModel) loadDocs() tea.Cmd { - return findLocalFiles(*m.common) -} diff --git a/ui/stashhelp.go b/ui/stashhelp.go index af9c16d..636b751 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -144,6 +144,7 @@ func (m stashModel) helpView() (string, int) { appHelp = append(appHelp, "!", "errors") } + appHelp = append(appHelp, "r", "refresh") appHelp = append(appHelp, "q", "quit") // Detailed help diff --git a/ui/ui.go b/ui/ui.go index bb7703d..6cdfd25 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -164,7 +164,7 @@ func newModel(cfg Config) tea.Model { func (m model) Init() tea.Cmd { cmds := []tea.Cmd{m.stash.spinner.Tick} - cmds = append(cmds, m.stash.loadDocs()) + cmds = append(cmds, findLocalFiles(*m.common)) return tea.Batch(cmds...) } @@ -186,6 +186,11 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { batch := m.unloadDocument() return m, tea.Batch(batch...) } + case "r": + if m.state == stateShowStash { + m.stash.markdowns = nil + return m, m.Init() + } case "q": var cmd tea.Cmd From fe066f214006c51cd87e0e36e86c06cf52dd97d5 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Mon, 8 Jul 2024 22:33:49 -0300 Subject: [PATCH 777/911] feat: allow config from CHARM_CONFIG_HOME and XDG_CONFIG_HOME (#621) * feat: allow config from CHARM_CONFIG_HOME closes #594 closes #495 closes #328 closes #475 Signed-off-by: Carlos Alexandro Becker * fix: improvements on config handling Signed-off-by: Carlos Alexandro Becker * chore: log --------- Signed-off-by: Carlos Alexandro Becker --- config_cmd.go | 10 ++-------- go.mod | 1 - go.sum | 3 --- log.go | 9 +++++++-- main.go | 10 +++++++++- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/config_cmd.go b/config_cmd.go index 73aba54..adce1de 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -7,8 +7,8 @@ import ( "path/filepath" "github.com/charmbracelet/x/editor" - gap "github.com/muesli/go-app-paths" "github.com/spf13/cobra" + "github.com/spf13/viper" ) const defaultConfig = `# style name or JSON path (default "auto") @@ -21,12 +21,6 @@ pager: false width: 80 ` -func defaultConfigFile() string { - scope := gap.NewScope(gap.User, "glow") - path, _ := scope.ConfigPath("glow.yml") - return path -} - var configCmd = &cobra.Command{ Use: "config", Hidden: false, @@ -57,7 +51,7 @@ var configCmd = &cobra.Command{ func ensureConfigFile() error { if configFile == "" { - configFile = defaultConfigFile() + configFile = viper.GetViper().ConfigFileUsed() if err := os.MkdirAll(filepath.Dir(configFile), 0o755); err != nil { return fmt.Errorf("Could not write config file: %w", err) } diff --git a/go.mod b/go.mod index fe93674..eab31ac 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module github.com/charmbracelet/glow go 1.21.4 require ( - github.com/adrg/xdg v0.4.0 github.com/atotto/clipboard v0.1.4 github.com/caarlos0/env/v11 v11.0.1 github.com/charmbracelet/bubbles v0.18.0 diff --git a/go.sum b/go.sum index ccf451f..64b0e36 100644 --- a/go.sum +++ b/go.sum @@ -38,8 +38,6 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/alecthomas/assert/v2 v2.2.1 h1:XivOgYcduV98QCahG8T5XTezV5bylXe+lBxLG2K2ink= github.com/alecthomas/assert/v2 v2.2.1/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= github.com/alecthomas/chroma/v2 v2.8.0 h1:w9WJUjFFmHHB2e8mRpL9jjy3alYDlU0QLDezj1xE264= @@ -426,7 +424,6 @@ golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= diff --git a/log.go b/log.go index 330db7c..f5e2bc1 100644 --- a/log.go +++ b/log.go @@ -2,13 +2,18 @@ package main import ( "os" + "path/filepath" - "github.com/adrg/xdg" "github.com/charmbracelet/log" + gap "github.com/muesli/go-app-paths" ) func getLogFilePath() (string, error) { - return xdg.CacheFile("glow/glow.log") + dir, err := gap.NewScope(gap.User, "glow").CacheDir() + if err != nil { + return "", err + } + return filepath.Join(dir, "glow.log"), nil } func setupLog() (func() error, error) { diff --git a/main.go b/main.go index b5f1537..ebca4af 100644 --- a/main.go +++ b/main.go @@ -367,7 +367,7 @@ func init() { rootCmd.InitDefaultCompletionCmd() // "Glow Classic" cli arguments - rootCmd.PersistentFlags().StringVar(&configFile, "config", "", fmt.Sprintf("config file (default %s)", defaultConfigFile())) + rootCmd.PersistentFlags().StringVar(&configFile, "config", "", fmt.Sprintf("config file (default %s)", viper.GetViper().ConfigFileUsed())) rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") rootCmd.Flags().StringVarP(&style, "style", "s", glamour.AutoStyle, "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") @@ -395,6 +395,14 @@ func tryLoadConfigFromDefaultPlaces() { os.Exit(1) } + if c := os.Getenv("CHARM_CONFIG_HOME"); c != "" { + viper.AddConfigPath(c) + } + + if c := os.Getenv("XDG_CONFIG_HOME"); c != "" { + viper.AddConfigPath(filepath.Join(c, "glow")) + } + for _, v := range dirs { viper.AddConfigPath(v) } From d89d79a00ce257fca142b6b4d3b20ea25e377ca7 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 9 Jul 2024 09:50:10 -0300 Subject: [PATCH 778/911] feat: --preserve-new-lines (#623) closes #502 --- main.go | 23 ++++++++++++++--------- ui/config.go | 13 +++++++------ ui/pager.go | 9 +++++++-- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/main.go b/main.go index ebca4af..0b9dcff 100644 --- a/main.go +++ b/main.go @@ -28,14 +28,15 @@ var ( // CommitSHA as provided by goreleaser. CommitSHA = "" - readmeNames = []string{"README.md", "README", "Readme.md", "Readme", "readme.md", "readme"} - readmeBranches = []string{"main", "master"} - configFile string - pager bool - style string - width uint - showAllFiles bool - mouse bool + readmeNames = []string{"README.md", "README", "Readme.md", "Readme", "readme.md", "readme"} + readmeBranches = []string{"main", "master"} + configFile string + pager bool + style string + width uint + showAllFiles bool + preserveNewLines bool + mouse bool rootCmd = &cobra.Command{ Use: "glow [SOURCE|DIR]", @@ -151,6 +152,7 @@ func validateOptions(cmd *cobra.Command) error { width = viper.GetUint("width") mouse = viper.GetBool("mouse") pager = viper.GetBool("pager") + preserveNewLines = viper.GetBool("preserveNewLines") // validate the glamour style style = viper.GetString("style") @@ -332,6 +334,7 @@ func runTUI(workingDirectory string) error { cfg.GlamourMaxWidth = width cfg.GlamourStyle = style cfg.EnableMouse = mouse + cfg.PreserveNewLines = preserveNewLines // Run Bubble Tea program if _, err := ui.NewProgram(cfg).Run(); err != nil { @@ -372,7 +375,7 @@ func init() { rootCmd.Flags().StringVarP(&style, "style", "s", glamour.AutoStyle, "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") rootCmd.Flags().BoolVarP(&showAllFiles, "all", "a", false, "show system files and directories (TUI-mode only)") - + rootCmd.Flags().BoolVarP(&preserveNewLines, "preserve-new-lines", "n", false, "preserve newlines in the output") rootCmd.Flags().BoolVarP(&mouse, "mouse", "m", false, "enable mouse wheel (TUI-mode only)") _ = rootCmd.Flags().MarkHidden("mouse") @@ -381,6 +384,8 @@ func init() { _ = viper.BindPFlag("width", rootCmd.Flags().Lookup("width")) _ = viper.BindPFlag("debug", rootCmd.Flags().Lookup("debug")) _ = viper.BindPFlag("mouse", rootCmd.Flags().Lookup("mouse")) + _ = viper.BindPFlag("preserveNewLines", rootCmd.Flags().Lookup("preserve-new-lines")) + viper.SetDefault("style", glamour.AutoStyle) viper.SetDefault("width", 0) diff --git a/ui/config.go b/ui/config.go index 2365528..44ddfec 100644 --- a/ui/config.go +++ b/ui/config.go @@ -2,12 +2,13 @@ package ui // Config contains TUI-specific configuration. type Config struct { - ShowAllFiles bool - Gopath string `env:"GOPATH"` - HomeDir string `env:"HOME"` - GlamourMaxWidth uint - GlamourStyle string - EnableMouse bool + ShowAllFiles bool + Gopath string `env:"GOPATH"` + HomeDir string `env:"HOME"` + GlamourMaxWidth uint + GlamourStyle string + EnableMouse bool + PreserveNewLines bool // Which directory should we start from? WorkingDirectory string diff --git a/ui/pager.go b/ui/pager.go index ade9b49..95b70c3 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -399,10 +399,15 @@ func glamourRender(m pagerModel, markdown string) (string, error) { width = 0 } - r, err := glamour.NewTermRenderer( + options := []glamour.TermRendererOption{ utils.GlamourStyle(m.common.cfg.GlamourStyle, isCode), glamour.WithWordWrap(width), - ) + } + + if m.common.cfg.PreserveNewLines { + options = append(options, glamour.WithPreservedNewLines()) + } + r, err := glamour.NewTermRenderer(options...) if err != nil { return "", err } From f44e5b5f5c431eaa6451aa62841659b4fdad00b3 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 9 Jul 2024 10:17:18 -0300 Subject: [PATCH 779/911] fix: improve message Signed-off-by: Carlos Alexandro Becker --- main.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/main.go b/main.go index 0b9dcff..f1791ec 100644 --- a/main.go +++ b/main.go @@ -396,7 +396,7 @@ func tryLoadConfigFromDefaultPlaces() { scope := gap.NewScope(gap.User, "glow") dirs, err := scope.ConfigDirs() if err != nil { - fmt.Println("Could not load find config directory.") + fmt.Println("Could not load find configuration directory.") os.Exit(1) } @@ -425,10 +425,11 @@ func tryLoadConfigFromDefaultPlaces() { if used := viper.ConfigFileUsed(); used != "" { log.Debug("Using configuration file", "path", viper.ConfigFileUsed()) - } else { - if err := ensureConfigFile(); err != nil { - fmt.Println("Could not create default config.") - os.Exit(1) - } + return + } + + if err := ensureConfigFile(); err != nil { + fmt.Println("Could not create default configuration.") + os.Exit(1) } } From 1133e5047b24cae6a932c15189f81897b74697a4 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 9 Jul 2024 10:47:44 -0300 Subject: [PATCH 780/911] fix: config failing in tests (#625) Signed-off-by: Carlos Alexandro Becker --- config_cmd.go | 4 ++-- main.go | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/config_cmd.go b/config_cmd.go index adce1de..104b010 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -53,12 +53,12 @@ func ensureConfigFile() error { if configFile == "" { configFile = viper.GetViper().ConfigFileUsed() if err := os.MkdirAll(filepath.Dir(configFile), 0o755); err != nil { - return fmt.Errorf("Could not write config file: %w", err) + return fmt.Errorf("could not write configuration file: %w", err) } } if ext := path.Ext(configFile); ext != ".yaml" && ext != ".yml" { - return fmt.Errorf("'%s' is not a supported config type: use '%s' or '%s'", ext, ".yaml", ".yml") + return fmt.Errorf("'%s' is not a supported configuration type: use '%s' or '%s'", ext, ".yaml", ".yml") } if _, err := os.Stat(configFile); os.IsNotExist(err) { diff --git a/main.go b/main.go index f1791ec..fdef25d 100644 --- a/main.go +++ b/main.go @@ -400,12 +400,12 @@ func tryLoadConfigFromDefaultPlaces() { os.Exit(1) } - if c := os.Getenv("CHARM_CONFIG_HOME"); c != "" { - viper.AddConfigPath(c) + if c := os.Getenv("XDG_CONFIG_HOME"); c != "" { + dirs = append([]string{filepath.Join(c, "glow")}, dirs...) } - if c := os.Getenv("XDG_CONFIG_HOME"); c != "" { - viper.AddConfigPath(filepath.Join(c, "glow")) + if c := os.Getenv("GLOW_CONFIG_HOME"); c != "" { + dirs = append([]string{c}, dirs...) } for _, v := range dirs { @@ -428,8 +428,11 @@ func tryLoadConfigFromDefaultPlaces() { return } + if viper.ConfigFileUsed() == "" { + configFile = filepath.Join(dirs[0], "glow.yml") + } if err := ensureConfigFile(); err != nil { - fmt.Println("Could not create default configuration.") + log.Error("Could not create default configuration", "error", err) os.Exit(1) } } From dbf6e3e7996a65e235e7c7e36f68787f35a0a353 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 9 Jul 2024 10:48:29 -0300 Subject: [PATCH 781/911] ci: fix goreleaser config Signed-off-by: Carlos Alexandro Becker --- .github/workflows/goreleaser.yml | 4 ++-- .goreleaser.yml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index 1ccf980..fbc2046 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -1,3 +1,5 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json + name: goreleaser on: @@ -21,5 +23,3 @@ jobs: nfpm_gpg_key: ${{ secrets.NFPM_GPG_KEY }} nfpm_passphrase: ${{ secrets.NFPM_PASSPHRASE }} snapcraft_token: ${{ secrets.SNAPCRAFT_TOKEN }} - -# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json diff --git a/.goreleaser.yml b/.goreleaser.yml index aa0c1ae..22bd6e5 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -1,14 +1,14 @@ +# yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json + +version: 2 + includes: - from_url: url: charmbracelet/meta/main/goreleaser-glow.yaml variables: - main: "." - binary_name: glow description: "Render markdown on the CLI, with pizzazz!" github_url: "https://github.com/charmbracelet/soft-serve" maintainer: "Christian Muehlhaeuser " brew_commit_author_name: "Christian Muehlhaeuser" brew_commit_author_email: "muesli@charm.sh" - -# yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json From 2288311e82f616abe9d87f76dbefacd3f5bb0f99 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 9 Jul 2024 10:58:52 -0300 Subject: [PATCH 782/911] fix: do not hard fail if no config Signed-off-by: Carlos Alexandro Becker --- main.go | 1 - 1 file changed, 1 deletion(-) diff --git a/main.go b/main.go index fdef25d..16b0c05 100644 --- a/main.go +++ b/main.go @@ -433,6 +433,5 @@ func tryLoadConfigFromDefaultPlaces() { } if err := ensureConfigFile(); err != nil { log.Error("Could not create default configuration", "error", err) - os.Exit(1) } } From ab94744c392d4d36e79bddde1f757803844ba5d0 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 9 Jul 2024 16:04:11 -0300 Subject: [PATCH 783/911] chore: fix codeowners Signed-off-by: Carlos Alexandro Becker --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d834ea6..34f5f9e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @meowgorithm @muesli +* @meowgorithm @caarlos0 From 9ebe39cd090ac49d4345ba5c8459328ecd146b91 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 9 Jul 2024 16:07:39 -0300 Subject: [PATCH 784/911] feat: improve gitlab/github readme url (#456) * Use GitHub API to find readme filename * Fix lint errors and typos * Bring back "tries to find" instead of "finds" * Rename `readmeURL` to `apiURL` * Don't close body * Use GitLab API to find readme filename * feat: improve gitlab/github readme url Signed-off-by: Carlos A Becker --------- Signed-off-by: Carlos A Becker Signed-off-by: Carlos Alexandro Becker Co-authored-by: danielwerg <35052399+danielwerg@users.noreply.github.com> --- github.go | 57 +++++++++++++++++++++----------------- gitlab.go | 60 +++++++++++++++++++++++----------------- main.go | 16 ++--------- url.go | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++ url_test.go | 29 +++++++++++++++++++ 5 files changed, 178 insertions(+), 64 deletions(-) create mode 100644 url.go create mode 100644 url_test.go diff --git a/github.go b/github.go index ac64096..6b169fa 100644 --- a/github.go +++ b/github.go @@ -1,50 +1,55 @@ package main import ( + "encoding/json" "errors" "fmt" + "io" "net/http" "net/url" "strings" ) -// isGitHubURL tests a string to determine if it is a well-structured GitHub URL. -func isGitHubURL(s string) (string, bool) { - if strings.HasPrefix(s, "github.com/") { - s = "https://" + s +// findGitHubREADME tries to find the correct README filename in a repository using GitHub API. +func findGitHubREADME(u *url.URL) (*source, error) { + owner, repo, ok := strings.Cut(strings.TrimPrefix(u.Path, "/"), "/") + if !ok { + return nil, fmt.Errorf("invalid url: %s", u.String()) } - u, err := url.ParseRequestURI(s) - if err != nil { - return "", false + type readme struct { + DownloadURL string `json:"download_url"` } - return u.String(), strings.ToLower(u.Host) == "github.com" -} + apiURL := fmt.Sprintf("https://api.%s/repos/%s/%s/readme", u.Hostname(), owner, repo) -// findGitHubREADME tries to find the correct README filename in a repository. -func findGitHubREADME(s string) (*source, error) { - u, err := url.ParseRequestURI(s) + // nolint:bodyclose + // it is closed on the caller + res, err := http.Get(apiURL) // nolint: gosec if err != nil { return nil, err } - u.Host = "raw.githubusercontent.com" - for _, b := range readmeBranches { - for _, r := range readmeNames { - v := *u - v.Path += fmt.Sprintf("/%s/%s", b, r) + body, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } - // nolint:bodyclose - // it is closed on the caller - resp, err := http.Get(v.String()) - if err != nil { - return nil, err - } + var result readme + if err := json.Unmarshal(body, &result); err != nil { + return nil, err + } - if resp.StatusCode == http.StatusOK { - return &source{resp.Body, v.String()}, nil - } + if res.StatusCode == http.StatusOK { + // nolint:bodyclose + // it is closed on the caller + resp, err := http.Get(result.DownloadURL) + if err != nil { + return nil, err + } + + if resp.StatusCode == http.StatusOK { + return &source{resp.Body, result.DownloadURL}, nil } } diff --git a/gitlab.go b/gitlab.go index 47059bb..05e1239 100644 --- a/gitlab.go +++ b/gitlab.go @@ -1,49 +1,59 @@ package main import ( + "encoding/json" "errors" "fmt" + "io" "net/http" "net/url" "strings" ) -// isGitLabURL tests a string to determine if it is a well-structured GitLab URL. -func isGitLabURL(s string) (string, bool) { - if strings.HasPrefix(s, "gitlab.com/") { - s = "https://" + s +// findGitLabREADME tries to find the correct README filename in a repository using GitLab API. +func findGitLabREADME(u *url.URL) (*source, error) { + owner, repo, ok := strings.Cut(strings.TrimPrefix(u.Path, "/"), "/") + if !ok { + return nil, fmt.Errorf("invalid url: %s", u.String()) } - u, err := url.ParseRequestURI(s) - if err != nil { - return "", false + projectPath := url.QueryEscape(owner + "/" + repo) + + type readme struct { + ReadmeURL string `json:"readme_url"` } - return u.String(), strings.ToLower(u.Host) == "gitlab.com" -} + apiURL := fmt.Sprintf("https://%s/api/v4/projects/%s", u.Hostname(), projectPath) -// findGitLabREADME tries to find the correct README filename in a repository. -func findGitLabREADME(s string) (*source, error) { - u, err := url.ParseRequestURI(s) + // nolint:bodyclose + // it is closed on the caller + res, err := http.Get(apiURL) // nolint: gosec if err != nil { return nil, err } - for _, b := range readmeBranches { - for _, r := range readmeNames { - v := *u - v.Path += fmt.Sprintf("/raw/%s/%s", b, r) + body, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } - // nolint:bodyclose - // it is closed on the caller - resp, err := http.Get(v.String()) - if err != nil { - return nil, err - } + var result readme + if err := json.Unmarshal(body, &result); err != nil { + return nil, err + } - if resp.StatusCode == http.StatusOK { - return &source{resp.Body, v.String()}, nil - } + readmeRawURL := strings.Replace(result.ReadmeURL, "blob", "raw", -1) + + if res.StatusCode == http.StatusOK { + // nolint:bodyclose + // it is closed on the caller + resp, err := http.Get(readmeRawURL) // nolint: gosec + if err != nil { + return nil, err + } + + if resp.StatusCode == http.StatusOK { + return &source{resp.Body, readmeRawURL}, nil } } diff --git a/main.go b/main.go index 16b0c05..832cb9a 100644 --- a/main.go +++ b/main.go @@ -72,19 +72,9 @@ func sourceFromArg(arg string) (*source, error) { } // a GitHub or GitLab URL (even without the protocol): - if u, ok := isGitHubURL(arg); ok { - src, err := findGitHubREADME(u) - if err != nil { - return nil, err - } - return src, nil - } - if u, ok := isGitLabURL(arg); ok { - src, err := findGitLabREADME(u) - if err != nil { - return nil, err - } - return src, nil + src, err := readmeURL(arg) + if src != nil || err != nil { + return src, err } // HTTP(S) URLs: diff --git a/url.go b/url.go new file mode 100644 index 0000000..43ca167 --- /dev/null +++ b/url.go @@ -0,0 +1,80 @@ +package main + +import ( + "net/url" + "strings" + "sync" +) + +const ( + protoGithub = "github://" + protoGitlab = "gitlab://" + protoHTTPS = "https://" +) + +var ( + githubURL *url.URL + gitlabURL *url.URL + urlsOnce sync.Once +) + +func init() { + urlsOnce.Do(func() { + githubURL, _ = url.Parse("https://github.com") + gitlabURL, _ = url.Parse("https://gitlab.com") + }) +} + +func readmeURL(path string) (*source, error) { + switch { + case strings.HasPrefix(path, protoGithub): + if u := githubReadmeURL(path); u != nil { + return readmeURL(u.String()) + } + return nil, nil + case strings.HasPrefix(path, protoGitlab): + if u := gitlabReadmeURL(path); u != nil { + return readmeURL(u.String()) + } + return nil, nil + } + + if !strings.HasPrefix(path, protoHTTPS) { + path = protoHTTPS + path + } + u, err := url.Parse(path) + if err != nil { + return nil, err + } + + switch { + case u.Hostname() == githubURL.Hostname(): + return findGitHubREADME(u) + case u.Hostname() == gitlabURL.Hostname(): + return findGitLabREADME(u) + } + + return nil, nil +} + +func githubReadmeURL(path string) *url.URL { + path = strings.TrimPrefix(path, protoGithub) + parts := strings.Split(path, "/") + if len(parts) != 2 { + // custom hostnames are not supported yet + return nil + } + u, _ := url.Parse(githubURL.String()) + return u.JoinPath(path) +} + +func gitlabReadmeURL(path string) *url.URL { + path = strings.TrimPrefix(path, protoGitlab) + parts := strings.Split(path, "/") + if len(parts) != 2 { + // custom hostnames are not supported yet + return nil + } + u, _ := url.Parse(gitlabURL.String()) + return u.JoinPath(path) +} diff --git a/url_test.go b/url_test.go new file mode 100644 index 0000000..f19e57f --- /dev/null +++ b/url_test.go @@ -0,0 +1,29 @@ +package main + +import "testing" + +func TestURLParser(t *testing.T) { + for path, url := range map[string]string{ + "github.com/charmbracelet/glow": "https://raw.githubusercontent.com/charmbracelet/glow/master/README.md", + "github://charmbracelet/glow": "https://raw.githubusercontent.com/charmbracelet/glow/master/README.md", + "github://caarlos0/dotfiles.fish": "https://raw.githubusercontent.com/caarlos0/dotfiles.fish/main/README.md", + "github://tj/git-extras": "https://raw.githubusercontent.com/tj/git-extras/main/Readme.md", + "https://github.com/goreleaser/nfpm": "https://raw.githubusercontent.com/goreleaser/nfpm/main/README.md", + "gitlab.com/caarlos0/test": "https://gitlab.com/caarlos0/test/-/raw/master/README.md", + "gitlab://caarlos0/test": "https://gitlab.com/caarlos0/test/-/raw/master/README.md", + "https://gitlab.com/terrakok/gitlab-client": "https://gitlab.com/terrakok/gitlab-client/-/raw/develop/Readme.md", + } { + t.Run(path, func(t *testing.T) { + got, err := readmeURL(path) + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + if got == nil { + t.Fatalf("should not be nil") + } + if url != got.URL { + t.Errorf("expected url for %s to be %s, was %s", path, url, got.URL) + } + }) + } +} From 401610afa4e0c2a7aa97ee84d2a26af65907575e Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 9 Jul 2024 16:13:05 -0300 Subject: [PATCH 785/911] ci: run govulncheck, semgrep, etc (#627) * ci: run govulncheck, semgrep, etc Signed-off-by: Carlos Alexandro Becker * fix: error check --------- Signed-off-by: Carlos Alexandro Becker --- .github/workflows/build.yml | 13 +++++++++++++ config_cmd.go | 4 +++- main.go | 3 ++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 20a7a22..adcb449 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,3 +10,16 @@ jobs: uses: charmbracelet/meta/.github/workflows/snapshot.yml@main secrets: goreleaser_key: ${{ secrets.GORELEASER_KEY }} + + govulncheck: + uses: charmbracelet/meta/.github/workflows/govulncheck.yml@main + with: + go-version: stable + + semgrep: + uses: charmbracelet/meta/.github/workflows/semgrep.yml@main + + ruleguard: + uses: charmbracelet/meta/.github/workflows/ruleguard.yml@main + with: + go-version: stable diff --git a/config_cmd.go b/config_cmd.go index 104b010..d3defcc 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -1,7 +1,9 @@ package main import ( + "errors" "fmt" + "io/fs" "os" "path" "path/filepath" @@ -61,7 +63,7 @@ func ensureConfigFile() error { return fmt.Errorf("'%s' is not a supported configuration type: use '%s' or '%s'", ext, ".yaml", ".yml") } - if _, err := os.Stat(configFile); os.IsNotExist(err) { + if _, err := os.Stat(configFile); errors.Is(err, fs.ErrNotExist) { // File doesn't exist yet, create all necessary directories and // write the default config file if err := os.MkdirAll(filepath.Dir(configFile), 0o700); err != nil { diff --git a/main.go b/main.go index 832cb9a..6a8b229 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "io" + "io/fs" "net/http" "net/url" "os" @@ -148,7 +149,7 @@ func validateOptions(cmd *cobra.Command) error { style = viper.GetString("style") if style != glamour.AutoStyle && glamour.DefaultStyles[style] == nil { style = utils.ExpandPath(style) - if _, err := os.Stat(style); os.IsNotExist(err) { + if _, err := os.Stat(style); errors.Is(err, fs.ErrNotExist) { return fmt.Errorf("Specified style does not exist: %s", style) } else if err != nil { return err From 1407793c5d11ceed9086c9779322617e633067a0 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 9 Jul 2024 16:13:32 -0300 Subject: [PATCH 786/911] fix: pass color profile down to glamour (#626) Signed-off-by: Carlos Alexandro Becker --- main.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.go b/main.go index 6a8b229..9876d16 100644 --- a/main.go +++ b/main.go @@ -16,6 +16,7 @@ import ( "github.com/charmbracelet/glamour" "github.com/charmbracelet/glow/ui" "github.com/charmbracelet/glow/utils" + "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/log" gap "github.com/muesli/go-app-paths" "github.com/spf13/cobra" @@ -262,6 +263,7 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { // initialize glamour r, err := glamour.NewTermRenderer( + glamour.WithColorProfile(lipgloss.ColorProfile()), utils.GlamourStyle(style, isCode), glamour.WithWordWrap(int(width)), glamour.WithBaseURL(baseURL), From 400228cff6b51906ea5a01de8e2e9be621d286d5 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 9 Jul 2024 16:38:10 -0300 Subject: [PATCH 787/911] docs: update install --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6294de5..0a24e4e 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ Or just install it with `go`: go install github.com/charmbracelet/glow@latest ``` -### Build (requires Go 1.13+) +### Build (requires Go 1.21+) ```bash git clone https://github.com/charmbracelet/glow.git From 597e56bad4599857dde4c36174ce7a5ec371b7cc Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 9 Jul 2024 16:38:32 -0300 Subject: [PATCH 788/911] feat: open editor in current line closes #547 --- ui/editor.go | 4 ++-- ui/pager.go | 14 ++++++++------ ui/stash.go | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/ui/editor.go b/ui/editor.go index e2d4439..5eb2a06 100644 --- a/ui/editor.go +++ b/ui/editor.go @@ -7,11 +7,11 @@ import ( type editorFinishedMsg struct{ err error } -func openEditor(path string) tea.Cmd { +func openEditor(path string, lineno int) tea.Cmd { cb := func(err error) tea.Msg { return editorFinishedMsg{err} } - cmd, err := editor.Cmd("Glow", path) + cmd, err := editor.Cmd("Glow", path, editor.OpenAtLine(uint(lineno))) if err != nil { return func() tea.Msg { return cb(err) } } diff --git a/ui/pager.go b/ui/pager.go index 95b70c3..02a7b12 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -196,7 +196,14 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { } case "e": - return m, openEditor(m.currentDocument.localPath) + l := int(math.Round(float64(m.viewport.TotalLineCount()) * m.viewport.ScrollPercent())) + if m.viewport.AtTop() { + l = 0 + } + if m.viewport.AtBottom() { + l = m.viewport.TotalLineCount() + } + return m, openEditor(m.currentDocument.localPath, l) case "c": // Copy using OSC 52 @@ -222,9 +229,6 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { cmds = append(cmds, viewport.Sync(m.viewport)) } - case editMardownMsg: - return m, openEditor(msg.md.localPath) - // We've finished editing the document, potentially making changes. Let's // retrieve the latest version of the document so that we display // up-to-date contents. @@ -445,5 +449,3 @@ func glamourRender(m pagerModel, markdown string) (string, error) { return content.String(), nil } - -type editMardownMsg struct{ md *markdown } diff --git a/ui/stash.go b/ui/stash.go index d6849c1..2334c66 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -519,7 +519,7 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Edit document in EDITOR case "e": md := m.selectedMarkdown() - return openEditor(md.localPath) + return openEditor(md.localPath, 0) // Open document case keyEnter: From ad01f380bd85a9aee962050f83e22c1ad8069145 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Tue, 9 Jul 2024 16:46:49 -0300 Subject: [PATCH 789/911] fix: improve line no --- ui/pager.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 02a7b12..aec9c7e 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -196,14 +196,16 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { } case "e": - l := int(math.Round(float64(m.viewport.TotalLineCount()) * m.viewport.ScrollPercent())) + lineno := int(math.RoundToEven(float64(m.viewport.TotalLineCount()) * m.viewport.ScrollPercent())) if m.viewport.AtTop() { - l = 0 + lineno = 0 } - if m.viewport.AtBottom() { - l = m.viewport.TotalLineCount() - } - return m, openEditor(m.currentDocument.localPath, l) + log.Info( + "opening editor", + "file", m.currentDocument.localPath, + "line", fmt.Sprintf("%d/%d", lineno, m.viewport.TotalLineCount()), + ) + return m, openEditor(m.currentDocument.localPath, lineno) case "c": // Copy using OSC 52 From e4cacf7319340b95d6d7d9059218c32251bf9b11 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 10 Jul 2024 10:35:52 -0300 Subject: [PATCH 790/911] fix: mkdir cache dir --- log.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/log.go b/log.go index f5e2bc1..0221ef9 100644 --- a/log.go +++ b/log.go @@ -22,6 +22,9 @@ func setupLog() (func() error, error) { if err != nil { return nil, err } + if err := os.MkdirAll(filepath.Dir(logFile), 0o644); err != nil { + return nil, err + } f, err := os.OpenFile(logFile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0o644) if err != nil { return nil, err From 39c336f823db551fcc8f73657790de6bc536871b Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 10 Jul 2024 10:37:00 -0300 Subject: [PATCH 791/911] ci: improve coverage workflow --- .github/workflows/coverage.yml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index d197e45..f82e3d0 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -3,21 +3,17 @@ on: [push, pull_request] jobs: coverage: - strategy: - matrix: - go-version: [^1] - os: [ubuntu-latest] - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest env: GO111MODULE: "on" steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Install Go uses: actions/setup-go@v5 with: - go-version: ${{ matrix.go-version }} - - - name: Checkout code - uses: actions/checkout@v4 + go-version: stable - name: Coverage env: From b80e8312f214b662ac298fb9c20c26b903e0f9b2 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 10 Jul 2024 10:39:05 -0300 Subject: [PATCH 792/911] fix: handle permission denied --- log.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/log.go b/log.go index 0221ef9..3f29cdc 100644 --- a/log.go +++ b/log.go @@ -1,6 +1,7 @@ package main import ( + "errors" "os" "path/filepath" @@ -23,6 +24,10 @@ func setupLog() (func() error, error) { return nil, err } if err := os.MkdirAll(filepath.Dir(logFile), 0o644); err != nil { + if errors.Is(err, os.ErrPermission) { + // log disabled + return nil, nil + } return nil, err } f, err := os.OpenFile(logFile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0o644) From a1a85636eafc36192eb1efe110f4f79c2b4eb74a Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 10 Jul 2024 10:42:21 -0300 Subject: [PATCH 793/911] fix: handle not being able to create log file --- log.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/log.go b/log.go index 3f29cdc..7638624 100644 --- a/log.go +++ b/log.go @@ -1,7 +1,6 @@ package main import ( - "errors" "os" "path/filepath" @@ -24,15 +23,13 @@ func setupLog() (func() error, error) { return nil, err } if err := os.MkdirAll(filepath.Dir(logFile), 0o644); err != nil { - if errors.Is(err, os.ErrPermission) { - // log disabled - return nil, nil - } - return nil, err + // log disabled + return nil, nil } f, err := os.OpenFile(logFile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0o644) if err != nil { - return nil, err + // log disabled + return nil, nil } log.SetOutput(f) log.SetLevel(log.DebugLevel) From 3f9102d1162191c4523c1f9fcf109215e4dce6da Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 10 Jul 2024 12:02:50 -0300 Subject: [PATCH 794/911] fix: yet another log handling fix --- log.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/log.go b/log.go index 7638624..69acef3 100644 --- a/log.go +++ b/log.go @@ -24,12 +24,12 @@ func setupLog() (func() error, error) { } if err := os.MkdirAll(filepath.Dir(logFile), 0o644); err != nil { // log disabled - return nil, nil + return func() error { return nil }, nil } f, err := os.OpenFile(logFile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0o644) if err != nil { // log disabled - return nil, nil + return func() error { return nil }, nil } log.SetOutput(f) log.SetLevel(log.DebugLevel) From c356273a76f110d1b0b0aa128c82984abc9c2750 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 10 Jul 2024 17:02:37 -0300 Subject: [PATCH 795/911] chore: update glamour to master fixes #485 Signed-off-by: Carlos Alexandro Becker --- go.mod | 22 +++++++++++----------- go.sum | 54 +++++++++++++++++++++++++++--------------------------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/go.mod b/go.mod index eab31ac..62c9e5f 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/caarlos0/env/v11 v11.0.1 github.com/charmbracelet/bubbles v0.18.0 github.com/charmbracelet/bubbletea v0.26.4 - github.com/charmbracelet/glamour v0.7.0 + github.com/charmbracelet/glamour v0.7.1-0.20240709165248-5e17ca86e5d3 github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd github.com/charmbracelet/log v0.4.0 github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d @@ -19,28 +19,28 @@ require ( github.com/muesli/mango-cobra v1.2.0 github.com/muesli/reflow v0.3.0 github.com/muesli/roff v0.1.0 - github.com/muesli/termenv v0.15.2 + github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.15.0 - golang.org/x/sys v0.21.0 - golang.org/x/term v0.21.0 + golang.org/x/sys v0.22.0 + golang.org/x/term v0.22.0 golang.org/x/text v0.16.0 ) require ( - github.com/alecthomas/chroma/v2 v2.8.0 // indirect + github.com/alecthomas/chroma/v2 v2.14.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/charmbracelet/x/ansi v0.1.2 // indirect github.com/charmbracelet/x/input v0.1.2 // indirect github.com/charmbracelet/x/term v0.1.1 // indirect github.com/charmbracelet/x/windows v0.1.2 // indirect - github.com/dlclark/regexp2 v1.4.0 // indirect + github.com/dlclark/regexp2 v1.11.0 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/gorilla/css v1.0.0 // indirect + github.com/gorilla/css v1.0.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/kr/pretty v0.3.1 // indirect @@ -48,7 +48,7 @@ require ( github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect - github.com/microcosm-cc/bluemonday v1.0.25 // indirect + github.com/microcosm-cc/bluemonday v1.0.27 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect @@ -65,10 +65,10 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - github.com/yuin/goldmark v1.5.4 // indirect - github.com/yuin/goldmark-emoji v1.0.2 // indirect + github.com/yuin/goldmark v1.7.4 // indirect + github.com/yuin/goldmark-emoji v1.0.3 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect - golang.org/x/net v0.26.0 // indirect + golang.org/x/net v0.27.0 // indirect golang.org/x/sync v0.7.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index 64b0e36..aa960a7 100644 --- a/go.sum +++ b/go.sum @@ -38,12 +38,12 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/alecthomas/assert/v2 v2.2.1 h1:XivOgYcduV98QCahG8T5XTezV5bylXe+lBxLG2K2ink= -github.com/alecthomas/assert/v2 v2.2.1/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/chroma/v2 v2.8.0 h1:w9WJUjFFmHHB2e8mRpL9jjy3alYDlU0QLDezj1xE264= -github.com/alecthomas/chroma/v2 v2.8.0/go.mod h1:yrkMI9807G1ROx13fhe1v6PN2DDeaR73L3d+1nmYQtw= -github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= -github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE= +github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= +github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= +github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= +github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= +github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= @@ -57,8 +57,8 @@ github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/ github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= github.com/charmbracelet/bubbletea v0.26.4 h1:2gDkkzLZaTjMl/dQBpNVtnvcCxsh/FCkimep7FC9c40= github.com/charmbracelet/bubbletea v0.26.4/go.mod h1:P+r+RRA5qtI1DOHNFn0otoNwB4rn+zNAzSj/EXz6xU0= -github.com/charmbracelet/glamour v0.7.0 h1:2BtKGZ4iVJCDfMF229EzbeR1QRKLWztO9dMtjmqZSng= -github.com/charmbracelet/glamour v0.7.0/go.mod h1:jUMh5MeihljJPQbJ/wf4ldw2+yBP59+ctV36jASy7ps= +github.com/charmbracelet/glamour v0.7.1-0.20240709165248-5e17ca86e5d3 h1:F96j0/I+0BT700ibG3o2ecRsWU8oY2Q9n4xebIpazvs= +github.com/charmbracelet/glamour v0.7.1-0.20240709165248-5e17ca86e5d3/go.mod h1:6B/tVR6ecNnDnDg9VJq/CtzNrmZTVaUpxivJrOWsOEk= github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd h1:vK2fQGG+d7VMa/Ly4f6HoCqzTGC8wnwl4dKulWCHaH0= github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd/go.mod h1:U8h88bAaHc+dNaV2UXjn0U3WChVxskgaD8/52JAIupM= github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM= @@ -85,8 +85,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= -github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= +github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -162,8 +162,8 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= -github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= +github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -200,8 +200,8 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg= -github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE= +github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= +github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -224,8 +224,8 @@ github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8= github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig= -github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= -github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= +github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg= +github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= @@ -282,11 +282,11 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.7/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.5.4 h1:2uY/xC0roWy8IBEGLgB1ywIoEJFGmRrX21YQcvGZzjU= -github.com/yuin/goldmark v1.5.4/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark-emoji v1.0.2 h1:c/RgTShNgHTtc6xdz2KKI74jJr6rWi7FPgnP9GAsO5s= -github.com/yuin/goldmark-emoji v1.0.2/go.mod h1:RhP/RWpexdp+KHs7ghKnifRoIs/Bq4nDS7tRbCkOwKY= +github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= +github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark-emoji v1.0.3 h1:aLRkLHOuBR2czCY4R8olwMjID+tENfhyFDMCRhbIQY4= +github.com/yuin/goldmark-emoji v1.0.3/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -366,8 +366,8 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -426,11 +426,11 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= +golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 247c707b25ad07808b5a8fc6830b78740fa89dca Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Thu, 11 Jul 2024 12:02:03 -0300 Subject: [PATCH 796/911] fix: glow URL closes #464 --- main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 9876d16..fe0eb08 100644 --- a/main.go +++ b/main.go @@ -31,7 +31,6 @@ var ( CommitSHA = "" readmeNames = []string{"README.md", "README", "Readme.md", "Readme", "readme.md", "readme"} - readmeBranches = []string{"main", "master"} configFile string pager bool style string @@ -75,8 +74,9 @@ func sourceFromArg(arg string) (*source, error) { // a GitHub or GitLab URL (even without the protocol): src, err := readmeURL(arg) - if src != nil || err != nil { - return src, err + if src != nil && err == nil { + // if there's an error, try next methods... + return src, nil } // HTTP(S) URLs: From 2d5bd3b7995fc7af57d72646d41bb7ad204a6df9 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Thu, 11 Jul 2024 12:08:57 -0300 Subject: [PATCH 797/911] feat: show line numbers configuration option closes #311 --- main.go | 5 +++++ ui/config.go | 1 + ui/pager.go | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index fe0eb08..3bd2154 100644 --- a/main.go +++ b/main.go @@ -36,6 +36,7 @@ var ( style string width uint showAllFiles bool + showLineNumbers bool preserveNewLines bool mouse bool @@ -324,6 +325,7 @@ func runTUI(workingDirectory string) error { cfg.WorkingDirectory = workingDirectory cfg.ShowAllFiles = showAllFiles + cfg.ShowLineNumbers = showLineNumbers cfg.GlamourMaxWidth = width cfg.GlamourStyle = style cfg.EnableMouse = mouse @@ -368,6 +370,7 @@ func init() { rootCmd.Flags().StringVarP(&style, "style", "s", glamour.AutoStyle, "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") rootCmd.Flags().BoolVarP(&showAllFiles, "all", "a", false, "show system files and directories (TUI-mode only)") + rootCmd.Flags().BoolVarP(&showLineNumbers, "line-numbers", "l", false, "show line numbers (TUI-mode only)") rootCmd.Flags().BoolVarP(&preserveNewLines, "preserve-new-lines", "n", false, "preserve newlines in the output") rootCmd.Flags().BoolVarP(&mouse, "mouse", "m", false, "enable mouse wheel (TUI-mode only)") _ = rootCmd.Flags().MarkHidden("mouse") @@ -378,6 +381,8 @@ func init() { _ = viper.BindPFlag("debug", rootCmd.Flags().Lookup("debug")) _ = viper.BindPFlag("mouse", rootCmd.Flags().Lookup("mouse")) _ = viper.BindPFlag("preserveNewLines", rootCmd.Flags().Lookup("preserve-new-lines")) + _ = viper.BindPFlag("showLineNumbers", rootCmd.Flags().Lookup("line-numbers")) + _ = viper.BindPFlag("showAllFiles", rootCmd.Flags().Lookup("all")) viper.SetDefault("style", glamour.AutoStyle) viper.SetDefault("width", 0) diff --git a/ui/config.go b/ui/config.go index 44ddfec..b0669d7 100644 --- a/ui/config.go +++ b/ui/config.go @@ -3,6 +3,7 @@ package ui // Config contains TUI-specific configuration. type Config struct { ShowAllFiles bool + ShowLineNumbers bool Gopath string `env:"GOPATH"` HomeDir string `env:"HOME"` GlamourMaxWidth uint diff --git a/ui/pager.go b/ui/pager.go index aec9c7e..c4c22d4 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -436,7 +436,7 @@ func glamourRender(m pagerModel, markdown string) (string, error) { var content strings.Builder for i, s := range lines { - if isCode { + if isCode || m.common.cfg.ShowLineNumbers { content.WriteString(lineNumberStyle(fmt.Sprintf("%"+fmt.Sprint(lineNumberWidth)+"d", i+1))) content.WriteString(trunc(s)) } else { From 96d2a38e67d03c08cecb89e8317512bc401825d1 Mon Sep 17 00:00:00 2001 From: "kalle (jag)" <2477952+applejag@users.noreply.github.com> Date: Thu, 11 Jul 2024 17:16:12 +0200 Subject: [PATCH 798/911] feat: allow --width=0 to disable wordwrap (#366) Co-authored-by: Carlos Alexandro Becker --- main.go | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/main.go b/main.go index 3bd2154..666d919 100644 --- a/main.go +++ b/main.go @@ -166,18 +166,20 @@ func validateOptions(cmd *cobra.Command) error { } // Detect terminal width - if isTerminal && width == 0 && !cmd.Flags().Changed("width") { - w, _, err := term.GetSize(int(os.Stdout.Fd())) - if err == nil { - width = uint(w) - } + if !cmd.Flags().Changed("width") { + if isTerminal && width == 0 { + w, _, err := term.GetSize(int(os.Stdout.Fd())) + if err == nil { + width = uint(w) + } - if width > 120 { - width = 120 + if width > 120 { + width = 120 + } + } + if width == 0 { + width = 80 } - } - if width == 0 { - width = 80 } return nil } @@ -368,7 +370,7 @@ func init() { rootCmd.PersistentFlags().StringVar(&configFile, "config", "", fmt.Sprintf("config file (default %s)", viper.GetViper().ConfigFileUsed())) rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") rootCmd.Flags().StringVarP(&style, "style", "s", glamour.AutoStyle, "style name or JSON path") - rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width") + rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width (set to 0 to disable)") rootCmd.Flags().BoolVarP(&showAllFiles, "all", "a", false, "show system files and directories (TUI-mode only)") rootCmd.Flags().BoolVarP(&showLineNumbers, "line-numbers", "l", false, "show line numbers (TUI-mode only)") rootCmd.Flags().BoolVarP(&preserveNewLines, "preserve-new-lines", "n", false, "preserve newlines in the output") From 94835d99ee05e8ce335564bea43b8791eb5843a7 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Thu, 11 Jul 2024 12:20:59 -0300 Subject: [PATCH 799/911] test: skip flukish test --- url_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/url_test.go b/url_test.go index f19e57f..9683892 100644 --- a/url_test.go +++ b/url_test.go @@ -14,6 +14,7 @@ func TestURLParser(t *testing.T) { "https://gitlab.com/terrakok/gitlab-client": "https://gitlab.com/terrakok/gitlab-client/-/raw/develop/Readme.md", } { t.Run(path, func(t *testing.T) { + t.Skip("test uses network, sometimes fails for no reason") got, err := readmeURL(path) if err != nil { t.Fatalf("expected no error, got %v", err) From 0dcf1271dd6012d686998c6e42efe9c2fea1a476 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Thu, 11 Jul 2024 18:07:35 -0300 Subject: [PATCH 800/911] feat: suspend closes #333 --- go.mod | 4 ++-- go.sum | 8 ++++---- ui/ui.go | 3 +++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 62c9e5f..c35298c 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/atotto/clipboard v0.1.4 github.com/caarlos0/env/v11 v11.0.1 github.com/charmbracelet/bubbles v0.18.0 - github.com/charmbracelet/bubbletea v0.26.4 + github.com/charmbracelet/bubbletea v0.26.7-0.20240711210516-ea13ffb9a18d github.com/charmbracelet/glamour v0.7.1-0.20240709165248-5e17ca86e5d3 github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd github.com/charmbracelet/log v0.4.0 @@ -32,7 +32,7 @@ require ( github.com/alecthomas/chroma/v2 v2.14.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect - github.com/charmbracelet/x/ansi v0.1.2 // indirect + github.com/charmbracelet/x/ansi v0.1.3 // indirect github.com/charmbracelet/x/input v0.1.2 // indirect github.com/charmbracelet/x/term v0.1.1 // indirect github.com/charmbracelet/x/windows v0.1.2 // indirect diff --git a/go.sum b/go.sum index aa960a7..61d4177 100644 --- a/go.sum +++ b/go.sum @@ -55,16 +55,16 @@ github.com/caarlos0/env/v11 v11.0.1/go.mod h1:2RC3HQu8BQqtEK3V4iHPxj0jOdWdbPpWJ6 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= -github.com/charmbracelet/bubbletea v0.26.4 h1:2gDkkzLZaTjMl/dQBpNVtnvcCxsh/FCkimep7FC9c40= -github.com/charmbracelet/bubbletea v0.26.4/go.mod h1:P+r+RRA5qtI1DOHNFn0otoNwB4rn+zNAzSj/EXz6xU0= +github.com/charmbracelet/bubbletea v0.26.7-0.20240711210516-ea13ffb9a18d h1:IHcf2pu0D9dau/Z1Jff53mke0Yc62lf1sVRl0vWsAew= +github.com/charmbracelet/bubbletea v0.26.7-0.20240711210516-ea13ffb9a18d/go.mod h1:MT/hMxp8fkrH8YV7AZ0KM7SeveivHPy0lUaZL0sBOxU= github.com/charmbracelet/glamour v0.7.1-0.20240709165248-5e17ca86e5d3 h1:F96j0/I+0BT700ibG3o2ecRsWU8oY2Q9n4xebIpazvs= github.com/charmbracelet/glamour v0.7.1-0.20240709165248-5e17ca86e5d3/go.mod h1:6B/tVR6ecNnDnDg9VJq/CtzNrmZTVaUpxivJrOWsOEk= github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd h1:vK2fQGG+d7VMa/Ly4f6HoCqzTGC8wnwl4dKulWCHaH0= github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd/go.mod h1:U8h88bAaHc+dNaV2UXjn0U3WChVxskgaD8/52JAIupM= github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM= github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM= -github.com/charmbracelet/x/ansi v0.1.2 h1:6+LR39uG8DE6zAmbu023YlqjJHkYXDF1z36ZwzO4xZY= -github.com/charmbracelet/x/ansi v0.1.2/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= +github.com/charmbracelet/x/ansi v0.1.3 h1:RBh/eleNWML5R524mjUF0yVRePTwqN9tPtV+DPgO5Lw= +github.com/charmbracelet/x/ansi v0.1.3/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d h1:QCbdJx9CBznXPO5Wk/5FWXft/mSPzeWX5HMdIH9bNAA= github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d/go.mod h1:oivrEbcP/AYt/Hpvk5pwDXXrQ933gQS6UzL6fxqAGSA= github.com/charmbracelet/x/input v0.1.2 h1:QJAZr33eOhDowkkEQ24rsJy4Llxlm+fRDf/cQrmqJa0= diff --git a/ui/ui.go b/ui/ui.go index 6cdfd25..512df58 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -212,6 +212,9 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, tea.Batch(cmds...) } + case "ctrl+z": + return m, tea.Suspend + // Ctrl+C always quits no matter where in the application you are. case "ctrl+c": return m, tea.Quit From 4578bc149a6d1400edb4ad84bcf0819a822556bc Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Thu, 25 Jul 2024 10:32:08 -0400 Subject: [PATCH 801/911] feat: updating glamour (#631) * feat: updating glamour Signed-off-by: Carlos Alexandro Becker * fix: trim space * chore: bump Signed-off-by: Carlos Alexandro Becker * chore(deps): bump Signed-off-by: Carlos Alexandro Becker --------- Signed-off-by: Carlos Alexandro Becker --- go.mod | 7 +++---- go.sum | 19 ++++++++++--------- main.go | 18 +++--------------- ui/pager.go | 2 +- 4 files changed, 17 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index c35298c..abba41a 100644 --- a/go.mod +++ b/go.mod @@ -7,8 +7,8 @@ require ( github.com/caarlos0/env/v11 v11.0.1 github.com/charmbracelet/bubbles v0.18.0 github.com/charmbracelet/bubbletea v0.26.7-0.20240711210516-ea13ffb9a18d - github.com/charmbracelet/glamour v0.7.1-0.20240709165248-5e17ca86e5d3 - github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd + github.com/charmbracelet/glamour v0.7.1-0.20240725142829-adb0b8d1c3ea + github.com/charmbracelet/lipgloss v0.12.2-0.20240712161825-87dd58def709 github.com/charmbracelet/log v0.4.0 github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d github.com/dustin/go-humanize v1.0.1 @@ -32,7 +32,7 @@ require ( github.com/alecthomas/chroma/v2 v2.14.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect - github.com/charmbracelet/x/ansi v0.1.3 // indirect + github.com/charmbracelet/x/ansi v0.1.4 // indirect github.com/charmbracelet/x/input v0.1.2 // indirect github.com/charmbracelet/x/term v0.1.1 // indirect github.com/charmbracelet/x/windows v0.1.2 // indirect @@ -54,7 +54,6 @@ require ( github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/mango v0.1.0 // indirect github.com/muesli/mango-pflag v0.1.0 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect diff --git a/go.sum b/go.sum index 61d4177..1fd41c1 100644 --- a/go.sum +++ b/go.sum @@ -48,6 +48,8 @@ github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= +github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/caarlos0/env/v11 v11.0.1 h1:A8dDt9Ub9ybqRSUF3fQc/TA/gTam2bKT4Pit+cwrsPs= @@ -57,16 +59,18 @@ github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/ github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= github.com/charmbracelet/bubbletea v0.26.7-0.20240711210516-ea13ffb9a18d h1:IHcf2pu0D9dau/Z1Jff53mke0Yc62lf1sVRl0vWsAew= github.com/charmbracelet/bubbletea v0.26.7-0.20240711210516-ea13ffb9a18d/go.mod h1:MT/hMxp8fkrH8YV7AZ0KM7SeveivHPy0lUaZL0sBOxU= -github.com/charmbracelet/glamour v0.7.1-0.20240709165248-5e17ca86e5d3 h1:F96j0/I+0BT700ibG3o2ecRsWU8oY2Q9n4xebIpazvs= -github.com/charmbracelet/glamour v0.7.1-0.20240709165248-5e17ca86e5d3/go.mod h1:6B/tVR6ecNnDnDg9VJq/CtzNrmZTVaUpxivJrOWsOEk= -github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd h1:vK2fQGG+d7VMa/Ly4f6HoCqzTGC8wnwl4dKulWCHaH0= -github.com/charmbracelet/lipgloss v0.11.1-0.20240608174255-33b3263db7dd/go.mod h1:U8h88bAaHc+dNaV2UXjn0U3WChVxskgaD8/52JAIupM= +github.com/charmbracelet/glamour v0.7.1-0.20240725142829-adb0b8d1c3ea h1:+zL7DrRjedvLEMQtKEajxpGMHMMD1y9yyk30TZyEx34= +github.com/charmbracelet/glamour v0.7.1-0.20240725142829-adb0b8d1c3ea/go.mod h1:8oyd4gn8mrEWXeMnQq172bcowKd6LSmR8tOCS3sXn/s= +github.com/charmbracelet/lipgloss v0.12.2-0.20240712161825-87dd58def709 h1:xKyYI89iCZPBA4QOBN1WQ8Fqt+iH09K3Ywx0qOKVPUo= +github.com/charmbracelet/lipgloss v0.12.2-0.20240712161825-87dd58def709/go.mod h1:lVwxBOJ0KkZflL9y+DObgGY8V90IZUJ1e6jjZ+PBcnE= github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM= github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM= -github.com/charmbracelet/x/ansi v0.1.3 h1:RBh/eleNWML5R524mjUF0yVRePTwqN9tPtV+DPgO5Lw= -github.com/charmbracelet/x/ansi v0.1.3/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= +github.com/charmbracelet/x/ansi v0.1.4 h1:IEU3D6+dWwPSgZ6HBH+v6oUuZ/nVawMiWj5831KfiLM= +github.com/charmbracelet/x/ansi v0.1.4/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d h1:QCbdJx9CBznXPO5Wk/5FWXft/mSPzeWX5HMdIH9bNAA= github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d/go.mod h1:oivrEbcP/AYt/Hpvk5pwDXXrQ933gQS6UzL6fxqAGSA= +github.com/charmbracelet/x/exp/golden v0.0.0-20240715153702-9ba8adf781c4 h1:6KzMkQeAF56rggw2NZu1L+TH7j9+DM1/2Kmh7KUxg1I= +github.com/charmbracelet/x/exp/golden v0.0.0-20240715153702-9ba8adf781c4/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= github.com/charmbracelet/x/input v0.1.2 h1:QJAZr33eOhDowkkEQ24rsJy4Llxlm+fRDf/cQrmqJa0= github.com/charmbracelet/x/input v0.1.2/go.mod h1:LGBim0maUY4Pitjn/4fHnuXb4KirU3DODsyuHuXdOyA= github.com/charmbracelet/x/term v0.1.1 h1:3cosVAiPOig+EV4X9U+3LDgtwwAoEzJjNdwbXDjF6yI= @@ -196,7 +200,6 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -226,8 +229,6 @@ github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8= github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig= github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg= github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= diff --git a/main.go b/main.go index 666d919..513482a 100644 --- a/main.go +++ b/main.go @@ -287,18 +287,6 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { return err } - // trim lines - lines := strings.Split(out, "\n") - var content strings.Builder - for i, s := range lines { - content.WriteString(strings.TrimSpace(s)) - - // don't add an artificial newline after the last split - if i+1 < len(lines) { - content.WriteByte('\n') - } - } - // display if pager || cmd.Flags().Changed("pager") { pagerCmd := os.Getenv("PAGER") @@ -308,13 +296,13 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { pa := strings.Split(pagerCmd, " ") c := exec.Command(pa[0], pa[1:]...) // nolint:gosec - c.Stdin = strings.NewReader(content.String()) + c.Stdin = strings.NewReader(out) c.Stdout = os.Stdout return c.Run() } - fmt.Fprint(w, content.String()) //nolint: errcheck - return nil + _, err = fmt.Fprint(w, out) + return err } func runTUI(workingDirectory string) error { diff --git a/ui/pager.go b/ui/pager.go index c4c22d4..1fd7c03 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -440,7 +440,7 @@ func glamourRender(m pagerModel, markdown string) (string, error) { content.WriteString(lineNumberStyle(fmt.Sprintf("%"+fmt.Sprint(lineNumberWidth)+"d", i+1))) content.WriteString(trunc(s)) } else { - content.WriteString(strings.TrimSpace(s)) + content.WriteString(s) } // don't add an artificial newline after the last split From c89c8bd6e78de0e7d3a30d5b44b14e598ccb443e Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 21 Aug 2024 14:43:05 -0300 Subject: [PATCH 802/911] feat: update glamour (#634) * feat: updating glamour Signed-off-by: Carlos Alexandro Becker * fix: trim space * chore: bump Signed-off-by: Carlos Alexandro Becker * chore(deps): bump Signed-off-by: Carlos Alexandro Becker * fix: perms * fix: improve logs * feat: update glamour --------- Signed-off-by: Carlos Alexandro Becker --- go.mod | 2 +- go.sum | 4 ++-- log.go | 4 +++- main.go | 7 ++++--- ui/ui.go | 8 ++++---- utils/utils.go | 31 +++++++++++++++++-------------- 6 files changed, 31 insertions(+), 25 deletions(-) diff --git a/go.mod b/go.mod index abba41a..21e029d 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/caarlos0/env/v11 v11.0.1 github.com/charmbracelet/bubbles v0.18.0 github.com/charmbracelet/bubbletea v0.26.7-0.20240711210516-ea13ffb9a18d - github.com/charmbracelet/glamour v0.7.1-0.20240725142829-adb0b8d1c3ea + github.com/charmbracelet/glamour v0.8.0 github.com/charmbracelet/lipgloss v0.12.2-0.20240712161825-87dd58def709 github.com/charmbracelet/log v0.4.0 github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d diff --git a/go.sum b/go.sum index 1fd41c1..dc8370e 100644 --- a/go.sum +++ b/go.sum @@ -59,8 +59,8 @@ github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/ github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= github.com/charmbracelet/bubbletea v0.26.7-0.20240711210516-ea13ffb9a18d h1:IHcf2pu0D9dau/Z1Jff53mke0Yc62lf1sVRl0vWsAew= github.com/charmbracelet/bubbletea v0.26.7-0.20240711210516-ea13ffb9a18d/go.mod h1:MT/hMxp8fkrH8YV7AZ0KM7SeveivHPy0lUaZL0sBOxU= -github.com/charmbracelet/glamour v0.7.1-0.20240725142829-adb0b8d1c3ea h1:+zL7DrRjedvLEMQtKEajxpGMHMMD1y9yyk30TZyEx34= -github.com/charmbracelet/glamour v0.7.1-0.20240725142829-adb0b8d1c3ea/go.mod h1:8oyd4gn8mrEWXeMnQq172bcowKd6LSmR8tOCS3sXn/s= +github.com/charmbracelet/glamour v0.8.0 h1:tPrjL3aRcQbn++7t18wOpgLyl8wrOHUEDS7IZ68QtZs= +github.com/charmbracelet/glamour v0.8.0/go.mod h1:ViRgmKkf3u5S7uakt2czJ272WSg2ZenlYEZXT2x7Bjw= github.com/charmbracelet/lipgloss v0.12.2-0.20240712161825-87dd58def709 h1:xKyYI89iCZPBA4QOBN1WQ8Fqt+iH09K3Ywx0qOKVPUo= github.com/charmbracelet/lipgloss v0.12.2-0.20240712161825-87dd58def709/go.mod h1:lVwxBOJ0KkZflL9y+DObgGY8V90IZUJ1e6jjZ+PBcnE= github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM= diff --git a/log.go b/log.go index 69acef3..531feac 100644 --- a/log.go +++ b/log.go @@ -1,6 +1,7 @@ package main import ( + "io" "os" "path/filepath" @@ -17,12 +18,13 @@ func getLogFilePath() (string, error) { } func setupLog() (func() error, error) { + log.SetOutput(io.Discard) // Log to file, if set logFile, err := getLogFilePath() if err != nil { return nil, err } - if err := os.MkdirAll(filepath.Dir(logFile), 0o644); err != nil { + if err := os.MkdirAll(filepath.Dir(logFile), 0o755); err != nil { // log disabled return func() error { return nil }, nil } diff --git a/main.go b/main.go index 513482a..31ae6f3 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,7 @@ import ( "github.com/caarlos0/env/v11" "github.com/charmbracelet/glamour" + "github.com/charmbracelet/glamour/styles" "github.com/charmbracelet/glow/ui" "github.com/charmbracelet/glow/utils" "github.com/charmbracelet/lipgloss" @@ -149,7 +150,7 @@ func validateOptions(cmd *cobra.Command) error { // validate the glamour style style = viper.GetString("style") - if style != glamour.AutoStyle && glamour.DefaultStyles[style] == nil { + if style != styles.AutoStyle && styles.DefaultStyles[style] == nil { style = utils.ExpandPath(style) if _, err := os.Stat(style); errors.Is(err, fs.ErrNotExist) { return fmt.Errorf("Specified style does not exist: %s", style) @@ -357,7 +358,7 @@ func init() { // "Glow Classic" cli arguments rootCmd.PersistentFlags().StringVar(&configFile, "config", "", fmt.Sprintf("config file (default %s)", viper.GetViper().ConfigFileUsed())) rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") - rootCmd.Flags().StringVarP(&style, "style", "s", glamour.AutoStyle, "style name or JSON path") + rootCmd.Flags().StringVarP(&style, "style", "s", styles.AutoStyle, "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width (set to 0 to disable)") rootCmd.Flags().BoolVarP(&showAllFiles, "all", "a", false, "show system files and directories (TUI-mode only)") rootCmd.Flags().BoolVarP(&showLineNumbers, "line-numbers", "l", false, "show line numbers (TUI-mode only)") @@ -374,7 +375,7 @@ func init() { _ = viper.BindPFlag("showLineNumbers", rootCmd.Flags().Lookup("line-numbers")) _ = viper.BindPFlag("showAllFiles", rootCmd.Flags().Lookup("all")) - viper.SetDefault("style", glamour.AutoStyle) + viper.SetDefault("style", styles.AutoStyle) viper.SetDefault("width", 0) rootCmd.AddCommand(configCmd, manCmd) diff --git a/ui/ui.go b/ui/ui.go index 512df58..960f82c 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -9,7 +9,7 @@ import ( "github.com/charmbracelet/bubbles/list" tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/glamour" + "github.com/charmbracelet/glamour/styles" "github.com/charmbracelet/glow/utils" "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/log" @@ -134,11 +134,11 @@ func (m *model) unloadDocument() []tea.Cmd { func newModel(cfg Config) tea.Model { initSections() - if cfg.GlamourStyle == glamour.AutoStyle { + if cfg.GlamourStyle == styles.AutoStyle { if te.HasDarkBackground() { - cfg.GlamourStyle = glamour.DarkStyle + cfg.GlamourStyle = styles.DarkStyle } else { - cfg.GlamourStyle = glamour.LightStyle + cfg.GlamourStyle = styles.LightStyle } } diff --git a/utils/utils.go b/utils/utils.go index 693cccc..8240c36 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -8,6 +8,7 @@ import ( "github.com/charmbracelet/glamour" "github.com/charmbracelet/glamour/ansi" + "github.com/charmbracelet/glamour/styles" "github.com/charmbracelet/lipgloss" "github.com/mitchellh/go-homedir" ) @@ -69,7 +70,7 @@ func IsMarkdownFile(filename string) bool { func GlamourStyle(style string, isCode bool) glamour.TermRendererOption { if !isCode { - if style == glamour.AutoStyle { + if style == styles.AutoStyle { return glamour.WithAutoStyle() } else { return glamour.WithStylePath(style) @@ -82,22 +83,24 @@ func GlamourStyle(style string, isCode bool) glamour.TermRendererOption { var styleConfig ansi.StyleConfig switch style { - case glamour.AutoStyle: + case styles.AutoStyle: if lipgloss.HasDarkBackground() { - styleConfig = glamour.DarkStyleConfig + styleConfig = styles.DarkStyleConfig } else { - styleConfig = glamour.LightStyleConfig + styleConfig = styles.LightStyleConfig } - case glamour.DarkStyle: - styleConfig = glamour.DarkStyleConfig - case glamour.LightStyle: - styleConfig = glamour.LightStyleConfig - case glamour.PinkStyle: - styleConfig = glamour.PinkStyleConfig - case glamour.NoTTYStyle: - styleConfig = glamour.NoTTYStyleConfig - case glamour.DraculaStyle: - styleConfig = glamour.DraculaStyleConfig + case styles.DarkStyle: + styleConfig = styles.DarkStyleConfig + case styles.LightStyle: + styleConfig = styles.LightStyleConfig + case styles.PinkStyle: + styleConfig = styles.PinkStyleConfig + case styles.NoTTYStyle: + styleConfig = styles.NoTTYStyleConfig + case styles.DraculaStyle: + styleConfig = styles.DraculaStyleConfig + case styles.TokyoNightStyle: + styleConfig = styles.DraculaStyleConfig default: return glamour.WithStylesFromJSONFile(style) } From 3f3b2c458637a0dce7db30b0e4b83c3eee01eef1 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Wed, 21 Aug 2024 15:07:42 -0300 Subject: [PATCH 803/911] test: github:// proto --- glow_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/glow_test.go b/glow_test.go index 37f4079..1a8ad18 100644 --- a/glow_test.go +++ b/glow_test.go @@ -10,6 +10,7 @@ func TestGlowSources(t *testing.T) { ".", "README.md", "github.com/charmbracelet/glow", + "github://charmbracelet/glow", "https://github.com/charmbracelet/glow", } From cd99146e9ea95e0b74f82e317f9d2cdb977d3684 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Fri, 23 Aug 2024 12:45:18 -0300 Subject: [PATCH 804/911] fix: update codeowners (#637) Signed-off-by: Carlos Alexandro Becker --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 34f5f9e..3c190d7 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @meowgorithm @caarlos0 +* @charmbracelet/everyone From 736e77dbc66ac95913b77e06095311546e32e2cb Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Fri, 23 Aug 2024 12:45:30 -0300 Subject: [PATCH 805/911] feat!: rename module to /v2 (#640) Next version of Glow drops stash support, which is a breaking change. This makes it accordingly. Signed-off-by: Carlos Alexandro Becker --- go.mod | 2 +- main.go | 4 ++-- ui/pager.go | 2 +- ui/ui.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 21e029d..1370418 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/charmbracelet/glow +module github.com/charmbracelet/glow/v2 go 1.21.4 diff --git a/main.go b/main.go index 31ae6f3..8a5ca90 100644 --- a/main.go +++ b/main.go @@ -15,8 +15,8 @@ import ( "github.com/caarlos0/env/v11" "github.com/charmbracelet/glamour" "github.com/charmbracelet/glamour/styles" - "github.com/charmbracelet/glow/ui" - "github.com/charmbracelet/glow/utils" + "github.com/charmbracelet/glow/v2/ui" + "github.com/charmbracelet/glow/v2/utils" "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/log" gap "github.com/muesli/go-app-paths" diff --git a/ui/pager.go b/ui/pager.go index 1fd7c03..06f47b4 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -11,7 +11,7 @@ import ( "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/glamour" - "github.com/charmbracelet/glow/utils" + "github.com/charmbracelet/glow/v2/utils" "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/log" runewidth "github.com/mattn/go-runewidth" diff --git a/ui/ui.go b/ui/ui.go index 960f82c..d98ddd5 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -10,7 +10,7 @@ import ( "github.com/charmbracelet/bubbles/list" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/glamour/styles" - "github.com/charmbracelet/glow/utils" + "github.com/charmbracelet/glow/v2/utils" "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/log" "github.com/muesli/gitcha" From b26341ec7ba0fb434935e877c8b8a4b35ee10cf0 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 23 Aug 2024 13:23:40 -0400 Subject: [PATCH 806/911] docs(readme): pull network stuff from config example --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0a24e4e..58d7654 100644 --- a/README.md +++ b/README.md @@ -176,13 +176,11 @@ Here's an example config: ```yaml # style name or JSON path (default "auto") style: "light" -# show local files only; no network (TUI-mode only) -local: true -# mouse support (TUI-mode only) +# mouse wheel support (TUI-mode only) mouse: true # use pager to display markdown pager: true -# word-wrap at width +# at which column should we word wrap? width: 80 ``` From f02c9a8fdc61da5ab42a825f63b2a765487baec3 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 23 Aug 2024 14:49:31 -0400 Subject: [PATCH 807/911] docs(readme): update GIF --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 58d7654..225ed8c 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Render markdown on the CLI, with _pizzazz_!

- Glow UI Demo + Glow UI Demo

## What is it? From 67243bb6fbf6d49eddb6ab644e8e2c1395f9cb00 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Fri, 23 Aug 2024 15:00:20 -0400 Subject: [PATCH 808/911] docs(license): update copyright date --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index e5a2916..1e27a61 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019-2023 Charmbracelet, Inc +Copyright (c) 2019-2024 Charmbracelet, Inc Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From f1b565125fff2ebe99b3c92fb89bd4bc3ab4ced0 Mon Sep 17 00:00:00 2001 From: "Stanislav (Stas) Katkov" Date: Tue, 1 Oct 2024 19:23:20 +0200 Subject: [PATCH 809/911] feat: make --all configurable globally (#651) * Make --all configurable globally * docs: add all option to docs and default config * refactor: tidy fields, set showAllFiles to true if unset --------- Co-authored-by: Stanislav (Stas) Katkov Co-authored-by: bashbunni --- README.md | 2 ++ config_cmd.go | 2 ++ main.go | 4 +++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 225ed8c..1e81167 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,8 @@ mouse: true pager: true # at which column should we word wrap? width: 80 +# show all files, including hidden and ignored. +all: true ``` ## Feedback diff --git a/config_cmd.go b/config_cmd.go index d3defcc..e737696 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -21,6 +21,8 @@ mouse: false pager: false # word-wrap at width width: 80 +# show all files, including hidden and ignored. +all: true ` var configCmd = &cobra.Command{ diff --git a/main.go b/main.go index 8a5ca90..fb3ce57 100644 --- a/main.go +++ b/main.go @@ -146,6 +146,7 @@ func validateOptions(cmd *cobra.Command) error { width = viper.GetUint("width") mouse = viper.GetBool("mouse") pager = viper.GetBool("pager") + showAllFiles = viper.GetBool("all") preserveNewLines = viper.GetBool("preserveNewLines") // validate the glamour style @@ -373,10 +374,11 @@ func init() { _ = viper.BindPFlag("mouse", rootCmd.Flags().Lookup("mouse")) _ = viper.BindPFlag("preserveNewLines", rootCmd.Flags().Lookup("preserve-new-lines")) _ = viper.BindPFlag("showLineNumbers", rootCmd.Flags().Lookup("line-numbers")) - _ = viper.BindPFlag("showAllFiles", rootCmd.Flags().Lookup("all")) + _ = viper.BindPFlag("all", rootCmd.Flags().Lookup("all")) viper.SetDefault("style", styles.AutoStyle) viper.SetDefault("width", 0) + viper.SetDefault("all", true) rootCmd.AddCommand(configCmd, manCmd) } From ae57cced064f77b4f349078ea1bc8962339a9a10 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Thu, 31 Oct 2024 09:53:59 -0300 Subject: [PATCH 810/911] fix: remove more stash-related stuff (#656) Signed-off-by: Carlos Alexandro Becker --- ui/stash.go | 5 ----- ui/stashhelp.go | 3 --- ui/ui.go | 10 ---------- 3 files changed, 18 deletions(-) diff --git a/ui/stash.go b/ui/stash.go index 2334c66..2021966 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -141,7 +141,6 @@ type stashModel struct { err error spinner spinner.Model filterInput textinput.Model - stashFullyLoaded bool // have we loaded all available stashed documents from the server? viewState stashViewState filterState filterState showFullHelp bool @@ -726,10 +725,6 @@ func (m stashModel) view() string { p.Type = paginator.Arabic pagination = paginationStyle.Render(p.View()) } - - // We could also look at m.stashFullyLoaded and add an indicator - // showing that we don't actually know how many more pages there - // are. } s += fmt.Sprintf( diff --git a/ui/stashhelp.go b/ui/stashhelp.go index 636b751..7c009e7 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -130,9 +130,6 @@ func (m stashModel) helpView() (string, int) { filterHelp = []string{"/", "edit search", "esc", "clear filter"} } else { filterHelp = []string{"/", "find"} - if m.stashFullyLoaded { - filterHelp = append(filterHelp, "t", "team filter") - } } if isEditable { diff --git a/ui/ui.go b/ui/ui.go index d98ddd5..32fb5da 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -7,11 +7,9 @@ import ( "strings" "time" - "github.com/charmbracelet/bubbles/list" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/glamour/styles" "github.com/charmbracelet/glow/v2/utils" - "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/log" "github.com/muesli/gitcha" te "github.com/muesli/termenv" @@ -142,14 +140,6 @@ func newModel(cfg Config) tea.Model { } } - teamList := list.New([]list.Item{}, list.NewDefaultDelegate(), 0, 0) - teamList.Styles.Title = lipgloss.NewStyle().Foreground(yellowGreen) - teamList.SetStatusBarItemName("team", "teams") - teamList.SetShowHelp(true) - - // We use the team list status message as a permanent placeholder. - teamList.StatusMessageLifetime = time.Hour - common := commonModel{ cfg: cfg, } From f255f3a60317948820a8f08165e422d1074b0126 Mon Sep 17 00:00:00 2001 From: bashbunni <15822994+bashbunni@users.noreply.github.com> Date: Mon, 16 Dec 2024 07:55:09 -0800 Subject: [PATCH 811/911] feat: support GLAMOUR_STYLE for custom pager styles (#587) * feat: support GLAMOUR_STYLE for custom pager styles * fix: resolve errors --- main.go | 31 +++++++++++++++++++++---------- ui/config.go | 2 +- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/main.go b/main.go index fb3ce57..6915dae 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "io" - "io/fs" "net/http" "net/url" "os" @@ -141,6 +140,20 @@ func sourceFromArg(arg string) (*source, error) { return &source{r, u}, err } +// validateStyle checks if the style is a default style, if not, checks that +// the custom style exists. +func validateStyle(style string) error { + if style != "auto" && styles.DefaultStyles[style] == nil { + style = utils.ExpandPath(style) + if _, err := os.Stat(style); os.IsNotExist(err) { + return fmt.Errorf("Specified style does not exist: %s", style) + } else if err != nil { + return err + } + } + return nil +} + func validateOptions(cmd *cobra.Command) error { // grab config values from Viper width = viper.GetUint("width") @@ -151,13 +164,8 @@ func validateOptions(cmd *cobra.Command) error { // validate the glamour style style = viper.GetString("style") - if style != styles.AutoStyle && styles.DefaultStyles[style] == nil { - style = utils.ExpandPath(style) - if _, err := os.Stat(style); errors.Is(err, fs.ErrNotExist) { - return fmt.Errorf("Specified style does not exist: %s", style) - } else if err != nil { - return err - } + if err := validateStyle(style); err != nil { + return err } isTerminal := term.IsTerminal(int(os.Stdout.Fd())) @@ -314,12 +322,15 @@ func runTUI(workingDirectory string) error { return fmt.Errorf("error parsing config: %v", err) } - cfg.WorkingDirectory = workingDirectory + // use style set in env, or auto if unset + if err := validateStyle(cfg.GlamourStyle); err != nil { + cfg.GlamourStyle = style + } + cfg.WorkingDirectory = workingDirectory cfg.ShowAllFiles = showAllFiles cfg.ShowLineNumbers = showLineNumbers cfg.GlamourMaxWidth = width - cfg.GlamourStyle = style cfg.EnableMouse = mouse cfg.PreserveNewLines = preserveNewLines diff --git a/ui/config.go b/ui/config.go index b0669d7..4d4eae7 100644 --- a/ui/config.go +++ b/ui/config.go @@ -7,7 +7,7 @@ type Config struct { Gopath string `env:"GOPATH"` HomeDir string `env:"HOME"` GlamourMaxWidth uint - GlamourStyle string + GlamourStyle string `env:"GLAMOUR_STYLE"` EnableMouse bool PreserveNewLines bool From 7b3bfac3068c5501adc83c2c1a3914c84b0cb136 Mon Sep 17 00:00:00 2001 From: bashbunni <15822994+bashbunni@users.noreply.github.com> Date: Wed, 18 Dec 2024 11:10:03 -0800 Subject: [PATCH 812/911] test: skip networked tests if no connection (#661) * test: skip networked tests if no connection * fix: handle unexpected http responses * fix: return if a valid URL is generated * test: delete networked test --- glow_test.go | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/glow_test.go b/glow_test.go index 1a8ad18..8743be2 100644 --- a/glow_test.go +++ b/glow_test.go @@ -1,33 +1,9 @@ package main import ( - "bytes" "testing" ) -func TestGlowSources(t *testing.T) { - tt := []string{ - ".", - "README.md", - "github.com/charmbracelet/glow", - "github://charmbracelet/glow", - "https://github.com/charmbracelet/glow", - } - - for _, v := range tt { - t.Run(v, func(t *testing.T) { - buf := &bytes.Buffer{} - err := executeArg(rootCmd, v, buf) - if err != nil { - t.Errorf("Error during execution (args: %s): %v", v, err) - } - if buf.Len() == 0 { - t.Errorf("Output buffer should not be empty (args: %s)", v) - } - }) - } -} - func TestGlowFlags(t *testing.T) { tt := []struct { args []string From 3989fe0d5e024fd3ea75c109109bb554b65f9441 Mon Sep 17 00:00:00 2001 From: NijeboerFrank <44158679+NijeboerFrank@users.noreply.github.com> Date: Mon, 3 Feb 2025 21:03:38 +0100 Subject: [PATCH 813/911] fix: ensure `r` key works when filtering files (#648) --- ui/ui.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ui/ui.go b/ui/ui.go index 32fb5da..a270a3e 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -177,7 +177,13 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, tea.Batch(batch...) } case "r": + var cmd tea.Cmd if m.state == stateShowStash { + // pass through all keys if we're editing the filter + if m.stash.filterState == filtering { + m.stash, cmd = m.stash.update(msg) + return m, cmd + } m.stash.markdowns = nil return m, m.Init() } From 009c37602af724f771307006b14da1e001edc323 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 3 Feb 2025 18:20:54 -0300 Subject: [PATCH 814/911] fix: restore hint for `e` / `edit` on the footer (#678) --- ui/stashhelp.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ui/stashhelp.go b/ui/stashhelp.go index 7c009e7..01a0458 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -100,7 +100,6 @@ func (m stashModel) helpView() (string, int) { } var ( - isEditable bool navHelp []string filterHelp []string selectionHelp []string @@ -132,16 +131,13 @@ func (m stashModel) helpView() (string, int) { filterHelp = []string{"/", "find"} } - if isEditable { - editHelp = []string{"e", "edit"} - } - // If there are errors if m.err != nil { appHelp = append(appHelp, "!", "errors") } appHelp = append(appHelp, "r", "refresh") + appHelp = append(appHelp, "e", "edit") appHelp = append(appHelp, "q", "quit") // Detailed help From e03817b2cb1cb86b454db28aaddd773c2388aea7 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 5 Feb 2025 16:45:36 -0300 Subject: [PATCH 815/911] feat: add new `--tui` / `-t` flag (#679) --- main.go | 24 ++++++++++++++++++------ ui/config.go | 4 ++-- ui/ui.go | 46 +++++++++++++++++++++++++++++++++++++++------- 3 files changed, 59 insertions(+), 15 deletions(-) diff --git a/main.go b/main.go index 6915dae..ef8f4e4 100644 --- a/main.go +++ b/main.go @@ -33,6 +33,7 @@ var ( readmeNames = []string{"README.md", "README", "Readme.md", "Readme", "readme.md", "readme"} configFile string pager bool + tui bool style string width uint showAllFiles bool @@ -159,9 +160,14 @@ func validateOptions(cmd *cobra.Command) error { width = viper.GetUint("width") mouse = viper.GetBool("mouse") pager = viper.GetBool("pager") + tui = viper.GetBool("tui") showAllFiles = viper.GetBool("all") preserveNewLines = viper.GetBool("preserveNewLines") + if pager && tui { + return errors.New("glow: cannot use both pager and tui") + } + // validate the glamour style style = viper.GetString("style") if err := validateStyle(style); err != nil { @@ -298,7 +304,8 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { } // display - if pager || cmd.Flags().Changed("pager") { + switch { + case pager || cmd.Flags().Changed("pager"): pagerCmd := os.Getenv("PAGER") if pagerCmd == "" { pagerCmd = "less -r" @@ -309,13 +316,15 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { c.Stdin = strings.NewReader(out) c.Stdout = os.Stdout return c.Run() + case tui || cmd.Flags().Changed("tui"): + return runTUI(src.URL) + default: + _, err = fmt.Fprint(w, out) + return err } - - _, err = fmt.Fprint(w, out) - return err } -func runTUI(workingDirectory string) error { +func runTUI(path string) error { // Read environment to get debugging stuff cfg, err := env.ParseAs[ui.Config]() if err != nil { @@ -327,7 +336,7 @@ func runTUI(workingDirectory string) error { cfg.GlamourStyle = style } - cfg.WorkingDirectory = workingDirectory + cfg.Path = path cfg.ShowAllFiles = showAllFiles cfg.ShowLineNumbers = showLineNumbers cfg.GlamourMaxWidth = width @@ -370,6 +379,7 @@ func init() { // "Glow Classic" cli arguments rootCmd.PersistentFlags().StringVar(&configFile, "config", "", fmt.Sprintf("config file (default %s)", viper.GetViper().ConfigFileUsed())) rootCmd.Flags().BoolVarP(&pager, "pager", "p", false, "display with pager") + rootCmd.Flags().BoolVarP(&tui, "tui", "t", false, "display with tui") rootCmd.Flags().StringVarP(&style, "style", "s", styles.AutoStyle, "style name or JSON path") rootCmd.Flags().UintVarP(&width, "width", "w", 0, "word-wrap at width (set to 0 to disable)") rootCmd.Flags().BoolVarP(&showAllFiles, "all", "a", false, "show system files and directories (TUI-mode only)") @@ -379,6 +389,8 @@ func init() { _ = rootCmd.Flags().MarkHidden("mouse") // Config bindings + _ = viper.BindPFlag("pager", rootCmd.Flags().Lookup("pager")) + _ = viper.BindPFlag("tui", rootCmd.Flags().Lookup("tui")) _ = viper.BindPFlag("style", rootCmd.Flags().Lookup("style")) _ = viper.BindPFlag("width", rootCmd.Flags().Lookup("width")) _ = viper.BindPFlag("debug", rootCmd.Flags().Lookup("debug")) diff --git a/ui/config.go b/ui/config.go index 4d4eae7..001d5b8 100644 --- a/ui/config.go +++ b/ui/config.go @@ -11,8 +11,8 @@ type Config struct { EnableMouse bool PreserveNewLines bool - // Which directory should we start from? - WorkingDirectory string + // Working directory or file path + Path string // For debugging the UI HighPerformancePager bool `env:"GLOW_HIGH_PERFORMANCE_PAGER" envDefault:"true"` diff --git a/ui/ui.go b/ui/ui.go index a270a3e..874a15e 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -144,17 +144,50 @@ func newModel(cfg Config) tea.Model { cfg: cfg, } - return model{ + m := model{ common: &common, state: stateShowStash, pager: newPagerModel(&common), stash: newStashModel(&common), } + + info, err := os.Stat(cfg.Path) + if err != nil { + log.Error("unable to stat file", "file", m.common.cfg.Path, "error", err) + m.fatalErr = err + return m + } + if info.IsDir() { + m.state = stateShowStash + } else { + cwd, _ := os.Getwd() + m.state = stateShowDocument + m.pager.currentDocument = markdown{ + localPath: cfg.Path, + Note: stripAbsolutePath(cfg.Path, cwd), + Modtime: info.ModTime(), + } + } + + return m } func (m model) Init() tea.Cmd { cmds := []tea.Cmd{m.stash.spinner.Tick} - cmds = append(cmds, findLocalFiles(*m.common)) + + switch m.state { + case stateShowStash: + cmds = append(cmds, findLocalFiles(*m.common)) + case stateShowDocument: + content, err := os.ReadFile(m.common.cfg.Path) + if err != nil { + log.Error("unable to read file", "file", m.common.cfg.Path, "error", err) + return func() tea.Msg { return errMsg{err} } + } + body := string(utils.RemoveFrontmatter(content)) + cmds = append(cmds, renderWithGlamour(m.pager, body)) + } + return tea.Batch(cmds...) } @@ -314,7 +347,7 @@ func findLocalFiles(m commonModel) tea.Cmd { return func() tea.Msg { log.Info("findLocalFiles") var ( - cwd = m.cfg.WorkingDirectory + cwd = m.cfg.Path err error ) @@ -380,17 +413,16 @@ func waitForStatusMessageTimeout(appCtx applicationContext, t *time.Timer) tea.C // document. Note that we could be doing things like checking if the file is // a directory, but we trust that gitcha has already done that. func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { - md := &markdown{ + return &markdown{ localPath: res.Path, Note: stripAbsolutePath(res.Path, cwd), Modtime: res.Info.ModTime(), } - - return md } func stripAbsolutePath(fullPath, cwd string) string { - return strings.ReplaceAll(fullPath, cwd+string(os.PathSeparator), "") + path, _ := filepath.Rel(cwd, fullPath) + return path } // Lightweight version of reflow's indent function. From 8e363644f685455ddd1a6baf901a23481cd5fb09 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 3 Feb 2025 15:23:45 -0300 Subject: [PATCH 816/911] chore: add missing line end to `.gitignore` --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a9d459b..8a5159a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ glow dist/ .envrc completions/ -manpages/ \ No newline at end of file +manpages/ From 2671509003da4994a4664192fe8f1fc934adf275 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 3 Feb 2025 15:24:10 -0300 Subject: [PATCH 817/911] fix: make `all` setting `false` by default --- README.md | 2 +- config_cmd.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1e81167..1e2b202 100644 --- a/README.md +++ b/README.md @@ -183,7 +183,7 @@ pager: true # at which column should we word wrap? width: 80 # show all files, including hidden and ignored. -all: true +all: false ``` ## Feedback diff --git a/config_cmd.go b/config_cmd.go index e737696..7147ab8 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -22,7 +22,7 @@ pager: false # word-wrap at width width: 80 # show all files, including hidden and ignored. -all: true +all: false ` var configCmd = &cobra.Command{ From e44e4684e1421f0aebe4e2db3e9bf93d652e7793 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 6 Feb 2025 11:14:36 -0300 Subject: [PATCH 818/911] fix: fallback to the current directory if no argument was given --- ui/ui.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index 874a15e..dbc6fd7 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -151,9 +151,13 @@ func newModel(cfg Config) tea.Model { stash: newStashModel(&common), } - info, err := os.Stat(cfg.Path) + path := cfg.Path + if path == "" { + path = "." + } + info, err := os.Stat(path) if err != nil { - log.Error("unable to stat file", "file", m.common.cfg.Path, "error", err) + log.Error("unable to stat file", "file", path, "error", err) m.fatalErr = err return m } @@ -163,8 +167,8 @@ func newModel(cfg Config) tea.Model { cwd, _ := os.Getwd() m.state = stateShowDocument m.pager.currentDocument = markdown{ - localPath: cfg.Path, - Note: stripAbsolutePath(cfg.Path, cwd), + localPath: path, + Note: stripAbsolutePath(path, cwd), Modtime: info.ModTime(), } } From 05e5b2e279eb07bc4ce7d041ae0f3113948c4bc7 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 6 Feb 2025 16:48:05 -0300 Subject: [PATCH 819/911] feat: watch for file changes and reload automatically --- ui/pager.go | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index 06f47b4..6d4209b 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -3,6 +3,7 @@ package ui import ( "fmt" "math" + "os" "path/filepath" "strings" "time" @@ -14,6 +15,7 @@ import ( "github.com/charmbracelet/glow/v2/utils" "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/log" + "github.com/fsnotify/fsnotify" runewidth "github.com/mattn/go-runewidth" "github.com/muesli/reflow/ansi" "github.com/muesli/reflow/truncate" @@ -78,6 +80,7 @@ var ( type ( contentRenderedMsg string + reloadMsg struct{} ) type pagerState int @@ -99,6 +102,8 @@ type pagerModel struct { // Current document being rendered, sans-glamour rendering. We cache // it here so we can re-render it on resize. currentDocument markdown + + watcher *fsnotify.Watcher } func newPagerModel(common *commonModel) pagerModel { @@ -107,11 +112,13 @@ func newPagerModel(common *commonModel) pagerModel { vp.YPosition = 0 vp.HighPerformanceRendering = config.HighPerformancePager - return pagerModel{ + m := pagerModel{ common: common, state: pagerStateBrowse, viewport: vp, } + m.initWatcher() + return m } func (m *pagerModel) setSize(w, h int) { @@ -159,6 +166,7 @@ func (m *pagerModel) showStatusMessage(msg pagerStatusMessage) tea.Cmd { } func (m *pagerModel) unload() { + log.Debug("unload") if m.showHelp { m.toggleHelp() } @@ -168,6 +176,7 @@ func (m *pagerModel) unload() { m.state = pagerStateBrowse m.viewport.SetContent("") m.viewport.YOffset = 0 + m.unwatchFile() } func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { @@ -226,10 +235,17 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { // Glow has rendered the content case contentRenderedMsg: + log.Info("content rendered", "state", m.state) + m.setContent(string(msg)) if m.viewport.HighPerformanceRendering { cmds = append(cmds, viewport.Sync(m.viewport)) } + cmds = append(cmds, m.watchFile) + + // The file was changed on disk and we're reloading it + case reloadMsg: + return m, loadLocalMarkdown(&m.currentDocument) // We've finished editing the document, potentially making changes. Let's // retrieve the latest version of the document so that we display @@ -451,3 +467,54 @@ func glamourRender(m pagerModel, markdown string) (string, error) { return content.String(), nil } + +func (m *pagerModel) initWatcher() { + var err error + m.watcher, err = fsnotify.NewWatcher() + if err != nil { + log.Error("error creating fsnotify watcher", "error", err) + } +} + +func (m *pagerModel) watchFile() tea.Msg { + path := m.relFilePath() + + if err := m.watcher.Add(path); err != nil { + log.Error("error adding file to fsnotify watcher", "error", err) + return nil + } + + log.Info("fsnotify watching file", "file", path) + + for { + select { + case event, ok := <-m.watcher.Events: + if !ok || !event.Has(fsnotify.Write) { + continue + } + log.Debug("fsnotify event", "file", path, "event", event.Op) + return reloadMsg{} + case err, ok := <-m.watcher.Errors: + if !ok { + continue + } + log.Debug("fsnotify error", "file", path, "error", err) + } + } +} + +func (m *pagerModel) unwatchFile() { + path := m.relFilePath() + + err := m.watcher.Remove(path) + if err == nil { + log.Debug("fsnotify file unwatched", "file", path) + } else { + log.Error("fsnotify fail to unwatch file", "file", path, "error", err) + } +} + +func (m *pagerModel) relFilePath() string { + wd, _ := os.Getwd() + return stripAbsolutePath(m.currentDocument.localPath, wd) +} From 51fa19b8b495d500aff08a2d5d07f85e776dae9d Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 10 Feb 2025 15:05:20 -0300 Subject: [PATCH 820/911] ci: fix semgrep --- main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index ef8f4e4..186ae62 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "io" + "io/fs" "net/http" "net/url" "os" @@ -146,7 +147,7 @@ func sourceFromArg(arg string) (*source, error) { func validateStyle(style string) error { if style != "auto" && styles.DefaultStyles[style] == nil { style = utils.ExpandPath(style) - if _, err := os.Stat(style); os.IsNotExist(err) { + if _, err := os.Stat(style); errors.Is(err, fs.ErrNotExist) { return fmt.Errorf("Specified style does not exist: %s", style) } else if err != nil { return err From f689c90084a025da025a957db91bdc3eb373896a Mon Sep 17 00:00:00 2001 From: Shane-XB-Qian Date: Tue, 11 Feb 2025 21:53:34 +0800 Subject: [PATCH 821/911] fix: correct abs to rel path conversion (#683) --- ui/ui.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index dbc6fd7..dc4ce87 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -425,8 +425,9 @@ func localFileToMarkdown(cwd string, res gitcha.SearchResult) *markdown { } func stripAbsolutePath(fullPath, cwd string) string { - path, _ := filepath.Rel(cwd, fullPath) - return path + fp, _ := filepath.EvalSymlinks(fullPath) + cp, _ := filepath.EvalSymlinks(cwd) + return strings.ReplaceAll(fp, cp+string(os.PathSeparator), "") } // Lightweight version of reflow's indent function. From 546b6287d80af885cc3069de895083af36aa91e3 Mon Sep 17 00:00:00 2001 From: Shane-XB-Qian Date: Wed, 12 Feb 2025 22:11:44 +0800 Subject: [PATCH 822/911] ci: upgrade go and golangci-lint ver (#685) --- .github/workflows/lint.yml | 2 +- .golangci.yml | 2 -- go.mod | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 6fd0ab7..f19c4b3 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: golangci-lint - uses: golangci/golangci-lint-action@v6 + uses: golangci/golangci-lint-action@v6.3.2 with: # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 diff --git a/.golangci.yml b/.golangci.yml index 2d4d24e..911a28b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -16,7 +16,6 @@ linters: enable: - bodyclose - dupl - - exportloopref - goconst - godot - godox @@ -24,7 +23,6 @@ linters: - goimports - goprintffuncname - gosec - # - ifshort - misspell - prealloc - revive diff --git a/go.mod b/go.mod index 1370418..c2216e4 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/charmbracelet/glow/v2 -go 1.21.4 +go 1.23.6 require ( github.com/atotto/clipboard v0.1.4 From b17f04c0ef178bf85ad6c1dfba27d62464594abc Mon Sep 17 00:00:00 2001 From: Charm <124303983+charmcli@users.noreply.github.com> Date: Thu, 13 Feb 2025 10:40:53 -0300 Subject: [PATCH 823/911] ci: sync dependabot config (#688) --- .github/dependabot.yml | 25 +++++++++++++++++++++++-- .github/workflows/dependabot-sync.yml | 15 +++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/dependabot-sync.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c0e481b..cbc9aa4 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,20 +1,41 @@ version: 2 + updates: - package-ecosystem: "gomod" directory: "/" schedule: - interval: "daily" + interval: "weekly" + day: "monday" + time: "05:00" + timezone: "America/New_York" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" + - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "daily" + interval: "weekly" + day: "monday" + time: "05:00" + timezone: "America/New_York" labels: - "dependencies" commit-message: prefix: "chore" include: "scope" + + - package-ecosystem: "docker" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + time: "05:00" + timezone: "America/New_York" + labels: + - "dependencies" + commit-message: + prefix: "feat" + include: "scope" diff --git a/.github/workflows/dependabot-sync.yml b/.github/workflows/dependabot-sync.yml new file mode 100644 index 0000000..e5aa74e --- /dev/null +++ b/.github/workflows/dependabot-sync.yml @@ -0,0 +1,15 @@ +name: dependabot-sync +on: + schedule: + - cron: "0 0 * * 0" # every Sunday at midnight + workflow_dispatch: # allows manual triggering + +permissions: + contents: write + pull-requests: write + +jobs: + dependabot-sync: + uses: charmbracelet/meta/.github/workflows/dependabot-sync.yml@main + with: + repo_name: ${{ github.event.repository.name }} From 19c6af747f4edd867cb70e0794d53255bfeb2745 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:43:38 +0000 Subject: [PATCH 824/911] chore(deps): bump golang.org/x/text from 0.16.0 to 0.22.0 (#691) Bumps [golang.org/x/text](https://github.com/golang/text) from 0.16.0 to 0.22.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.16.0...v0.22.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index c2216e4..ba99583 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/charmbracelet/log v0.4.0 github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d github.com/dustin/go-humanize v1.0.1 + github.com/fsnotify/fsnotify v1.6.0 github.com/mattn/go-runewidth v0.0.15 github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.3.0 @@ -25,7 +26,7 @@ require ( github.com/spf13/viper v1.15.0 golang.org/x/sys v0.22.0 golang.org/x/term v0.22.0 - golang.org/x/text v0.16.0 + golang.org/x/text v0.22.0 ) require ( @@ -38,7 +39,6 @@ require ( github.com/charmbracelet/x/windows v0.1.2 // indirect github.com/dlclark/regexp2 v1.11.0 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/gorilla/css v1.0.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -68,7 +68,7 @@ require ( github.com/yuin/goldmark-emoji v1.0.3 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect golang.org/x/net v0.27.0 // indirect - golang.org/x/sync v0.7.0 // indirect + golang.org/x/sync v0.11.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index dc8370e..5cecd44 100644 --- a/go.sum +++ b/go.sum @@ -388,8 +388,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -438,8 +438,8 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 4db03045738d13170b02701f2fe28d6fb855155d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:43:46 +0000 Subject: [PATCH 825/911] chore(deps): bump golangci/golangci-lint-action from 6.3.2 to 6.3.3 (#689) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 6.3.2 to 6.3.3. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v6.3.2...v6.3.3) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index f19c4b3..878f06b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: golangci-lint - uses: golangci/golangci-lint-action@v6.3.2 + uses: golangci/golangci-lint-action@v6.3.3 with: # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 From 8850757e80cf75ef1d57d3b54180a9122b6e1450 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:45:29 +0000 Subject: [PATCH 826/911] chore(deps): bump github.com/charmbracelet/bubbletea (#693) Bumps [github.com/charmbracelet/bubbletea](https://github.com/charmbracelet/bubbletea) from 0.26.7-0.20240711210516-ea13ffb9a18d to 1.3.3. - [Release notes](https://github.com/charmbracelet/bubbletea/releases) - [Changelog](https://github.com/charmbracelet/bubbletea/blob/main/.goreleaser.yml) - [Commits](https://github.com/charmbracelet/bubbletea/commits/v1.3.3) --- updated-dependencies: - dependency-name: github.com/charmbracelet/bubbletea dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 15 ++++++--------- go.sum | 34 ++++++++++++++-------------------- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index ba99583..b2560d7 100644 --- a/go.mod +++ b/go.mod @@ -6,14 +6,14 @@ require ( github.com/atotto/clipboard v0.1.4 github.com/caarlos0/env/v11 v11.0.1 github.com/charmbracelet/bubbles v0.18.0 - github.com/charmbracelet/bubbletea v0.26.7-0.20240711210516-ea13ffb9a18d + github.com/charmbracelet/bubbletea v1.3.3 github.com/charmbracelet/glamour v0.8.0 - github.com/charmbracelet/lipgloss v0.12.2-0.20240712161825-87dd58def709 + github.com/charmbracelet/lipgloss v1.0.0 github.com/charmbracelet/log v0.4.0 github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d github.com/dustin/go-humanize v1.0.1 github.com/fsnotify/fsnotify v1.6.0 - github.com/mattn/go-runewidth v0.0.15 + github.com/mattn/go-runewidth v0.0.16 github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.3.0 github.com/muesli/go-app-paths v0.2.2 @@ -24,7 +24,7 @@ require ( github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.15.0 - golang.org/x/sys v0.22.0 + golang.org/x/sys v0.30.0 golang.org/x/term v0.22.0 golang.org/x/text v0.22.0 ) @@ -33,10 +33,8 @@ require ( github.com/alecthomas/chroma/v2 v2.14.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect - github.com/charmbracelet/x/ansi v0.1.4 // indirect - github.com/charmbracelet/x/input v0.1.2 // indirect - github.com/charmbracelet/x/term v0.1.1 // indirect - github.com/charmbracelet/x/windows v0.1.2 // indirect + github.com/charmbracelet/x/ansi v0.8.0 // indirect + github.com/charmbracelet/x/term v0.2.1 // indirect github.com/dlclark/regexp2 v1.11.0 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect @@ -63,7 +61,6 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.2 // indirect - github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/yuin/goldmark v1.7.4 // indirect github.com/yuin/goldmark-emoji v1.0.3 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect diff --git a/go.sum b/go.sum index 5cecd44..9336a3a 100644 --- a/go.sum +++ b/go.sum @@ -57,26 +57,22 @@ github.com/caarlos0/env/v11 v11.0.1/go.mod h1:2RC3HQu8BQqtEK3V4iHPxj0jOdWdbPpWJ6 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= -github.com/charmbracelet/bubbletea v0.26.7-0.20240711210516-ea13ffb9a18d h1:IHcf2pu0D9dau/Z1Jff53mke0Yc62lf1sVRl0vWsAew= -github.com/charmbracelet/bubbletea v0.26.7-0.20240711210516-ea13ffb9a18d/go.mod h1:MT/hMxp8fkrH8YV7AZ0KM7SeveivHPy0lUaZL0sBOxU= +github.com/charmbracelet/bubbletea v1.3.3 h1:WpU6fCY0J2vDWM3zfS3vIDi/ULq3SYphZhkAGGvmEUY= +github.com/charmbracelet/bubbletea v1.3.3/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= github.com/charmbracelet/glamour v0.8.0 h1:tPrjL3aRcQbn++7t18wOpgLyl8wrOHUEDS7IZ68QtZs= github.com/charmbracelet/glamour v0.8.0/go.mod h1:ViRgmKkf3u5S7uakt2czJ272WSg2ZenlYEZXT2x7Bjw= -github.com/charmbracelet/lipgloss v0.12.2-0.20240712161825-87dd58def709 h1:xKyYI89iCZPBA4QOBN1WQ8Fqt+iH09K3Ywx0qOKVPUo= -github.com/charmbracelet/lipgloss v0.12.2-0.20240712161825-87dd58def709/go.mod h1:lVwxBOJ0KkZflL9y+DObgGY8V90IZUJ1e6jjZ+PBcnE= +github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg= +github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo= github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM= github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM= -github.com/charmbracelet/x/ansi v0.1.4 h1:IEU3D6+dWwPSgZ6HBH+v6oUuZ/nVawMiWj5831KfiLM= -github.com/charmbracelet/x/ansi v0.1.4/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= +github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= +github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d h1:QCbdJx9CBznXPO5Wk/5FWXft/mSPzeWX5HMdIH9bNAA= github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d/go.mod h1:oivrEbcP/AYt/Hpvk5pwDXXrQ933gQS6UzL6fxqAGSA= -github.com/charmbracelet/x/exp/golden v0.0.0-20240715153702-9ba8adf781c4 h1:6KzMkQeAF56rggw2NZu1L+TH7j9+DM1/2Kmh7KUxg1I= -github.com/charmbracelet/x/exp/golden v0.0.0-20240715153702-9ba8adf781c4/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= -github.com/charmbracelet/x/input v0.1.2 h1:QJAZr33eOhDowkkEQ24rsJy4Llxlm+fRDf/cQrmqJa0= -github.com/charmbracelet/x/input v0.1.2/go.mod h1:LGBim0maUY4Pitjn/4fHnuXb4KirU3DODsyuHuXdOyA= -github.com/charmbracelet/x/term v0.1.1 h1:3cosVAiPOig+EV4X9U+3LDgtwwAoEzJjNdwbXDjF6yI= -github.com/charmbracelet/x/term v0.1.1/go.mod h1:wB1fHt5ECsu3mXYusyzcngVWWlu1KKUmmLhfgr/Flxw= -github.com/charmbracelet/x/windows v0.1.2 h1:Iumiwq2G+BRmgoayww/qfcvof7W/3uLoelhxojXlRWg= -github.com/charmbracelet/x/windows v0.1.2/go.mod h1:GLEO/l+lizvFDBPLIOk+49gdX49L9YWMB5t+DZd0jkQ= +github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99klV19u0QnhiizODirwVksQB91TJKV/UaTnACcG30= +github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= +github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= +github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -201,8 +197,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -277,8 +273,6 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -427,8 +421,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= From 929a9e326f5253fc063a16c6b7296012ad5f273e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:46:44 +0000 Subject: [PATCH 827/911] chore(deps): bump github.com/charmbracelet/x/editor (#692) Bumps [github.com/charmbracelet/x/editor](https://github.com/charmbracelet/x) from 0.0.0-20240625164403-2627ec16405d to 0.1.0. - [Release notes](https://github.com/charmbracelet/x/releases) - [Commits](https://github.com/charmbracelet/x/commits/v0.1.0) --- updated-dependencies: - dependency-name: github.com/charmbracelet/x/editor dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b2560d7..a0d45c2 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/charmbracelet/glamour v0.8.0 github.com/charmbracelet/lipgloss v1.0.0 github.com/charmbracelet/log v0.4.0 - github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d + github.com/charmbracelet/x/editor v0.1.0 github.com/dustin/go-humanize v1.0.1 github.com/fsnotify/fsnotify v1.6.0 github.com/mattn/go-runewidth v0.0.16 diff --git a/go.sum b/go.sum index 9336a3a..7915860 100644 --- a/go.sum +++ b/go.sum @@ -67,8 +67,8 @@ github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8 github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM= github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= -github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d h1:QCbdJx9CBznXPO5Wk/5FWXft/mSPzeWX5HMdIH9bNAA= -github.com/charmbracelet/x/editor v0.0.0-20240625164403-2627ec16405d/go.mod h1:oivrEbcP/AYt/Hpvk5pwDXXrQ933gQS6UzL6fxqAGSA= +github.com/charmbracelet/x/editor v0.1.0 h1:p69/dpvlwRTs9uYiPeAWruwsHqTFzHhTvQOd/WVSX98= +github.com/charmbracelet/x/editor v0.1.0/go.mod h1:oivrEbcP/AYt/Hpvk5pwDXXrQ933gQS6UzL6fxqAGSA= github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99klV19u0QnhiizODirwVksQB91TJKV/UaTnACcG30= github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= From 305ea9d447f7a4d9a035c34030835288bc435cd1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:49:30 +0000 Subject: [PATCH 828/911] chore(deps): bump golang.org/x/term from 0.22.0 to 0.29.0 (#694) Bumps [golang.org/x/term](https://github.com/golang/term) from 0.22.0 to 0.29.0. - [Commits](https://github.com/golang/term/compare/v0.22.0...v0.29.0) --- updated-dependencies: - dependency-name: golang.org/x/term dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a0d45c2..5875685 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.15.0 golang.org/x/sys v0.30.0 - golang.org/x/term v0.22.0 + golang.org/x/term v0.29.0 golang.org/x/text v0.22.0 ) diff --git a/go.sum b/go.sum index 7915860..e1463eb 100644 --- a/go.sum +++ b/go.sum @@ -424,8 +424,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 436aa682be9ba53967d332e1ace7a59da7c0b2fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:51:18 +0000 Subject: [PATCH 829/911] chore(deps): bump github.com/charmbracelet/bubbles from 0.18.0 to 0.20.0 (#690) Bumps [github.com/charmbracelet/bubbles](https://github.com/charmbracelet/bubbles) from 0.18.0 to 0.20.0. - [Release notes](https://github.com/charmbracelet/bubbles/releases) - [Changelog](https://github.com/charmbracelet/bubbles/blob/master/.goreleaser.yml) - [Commits](https://github.com/charmbracelet/bubbles/compare/v0.18.0...v0.20.0) --- updated-dependencies: - dependency-name: github.com/charmbracelet/bubbles dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 5875685..1416e13 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.6 require ( github.com/atotto/clipboard v0.1.4 github.com/caarlos0/env/v11 v11.0.1 - github.com/charmbracelet/bubbles v0.18.0 + github.com/charmbracelet/bubbles v0.20.0 github.com/charmbracelet/bubbletea v1.3.3 github.com/charmbracelet/glamour v0.8.0 github.com/charmbracelet/lipgloss v1.0.0 diff --git a/go.sum b/go.sum index e1463eb..cbf871f 100644 --- a/go.sum +++ b/go.sum @@ -55,8 +55,8 @@ github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd3 github.com/caarlos0/env/v11 v11.0.1 h1:A8dDt9Ub9ybqRSUF3fQc/TA/gTam2bKT4Pit+cwrsPs= github.com/caarlos0/env/v11 v11.0.1/go.mod h1:2RC3HQu8BQqtEK3V4iHPxj0jOdWdbPpWJ6pOueeU1xM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= -github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= +github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE= +github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= github.com/charmbracelet/bubbletea v1.3.3 h1:WpU6fCY0J2vDWM3zfS3vIDi/ULq3SYphZhkAGGvmEUY= github.com/charmbracelet/bubbletea v1.3.3/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= github.com/charmbracelet/glamour v0.8.0 h1:tPrjL3aRcQbn++7t18wOpgLyl8wrOHUEDS7IZ68QtZs= @@ -69,8 +69,8 @@ github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2ll github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= github.com/charmbracelet/x/editor v0.1.0 h1:p69/dpvlwRTs9uYiPeAWruwsHqTFzHhTvQOd/WVSX98= github.com/charmbracelet/x/editor v0.1.0/go.mod h1:oivrEbcP/AYt/Hpvk5pwDXXrQ933gQS6UzL6fxqAGSA= -github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99klV19u0QnhiizODirwVksQB91TJKV/UaTnACcG30= -github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= +github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b h1:MnAMdlwSltxJyULnrYbkZpp4k58Co7Tah3ciKhSNo0Q= +github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= From 1b840ba22722d7f026fead579986df78eac2ad48 Mon Sep 17 00:00:00 2001 From: Charm <124303983+charmcli@users.noreply.github.com> Date: Thu, 13 Feb 2025 11:17:14 -0300 Subject: [PATCH 830/911] ci: sync dependabot config (#695) --- .github/workflows/dependabot-sync.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/dependabot-sync.yml b/.github/workflows/dependabot-sync.yml index e5aa74e..9b08259 100644 --- a/.github/workflows/dependabot-sync.yml +++ b/.github/workflows/dependabot-sync.yml @@ -13,3 +13,5 @@ jobs: uses: charmbracelet/meta/.github/workflows/dependabot-sync.yml@main with: repo_name: ${{ github.event.repository.name }} + secrets: + gh_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} From 9dd8a6f3fd35efd5429700051d5ff670c3bdbe22 Mon Sep 17 00:00:00 2001 From: "shane.xb.qian" Date: Wed, 12 Feb 2025 19:29:10 +0800 Subject: [PATCH 831/911] fix: make pipeline for tui work * 'cat foo.md | glow -t' Signed-off-by: shane.xb.qian --- main.go | 10 +++++----- ui/ui.go | 14 +++++++++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/main.go b/main.go index 186ae62..e78d6bf 100644 --- a/main.go +++ b/main.go @@ -226,7 +226,7 @@ func execute(cmd *cobra.Command, args []string) error { switch len(args) { // TUI running on cwd case 0: - return runTUI("") + return runTUI("", "") // TUI with possible dir argument case 1: @@ -236,7 +236,7 @@ func execute(cmd *cobra.Command, args []string) error { if err == nil && info.IsDir() { p, err := filepath.Abs(args[0]) if err == nil { - return runTUI(p) + return runTUI(p, "") } } fallthrough @@ -318,14 +318,14 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { c.Stdout = os.Stdout return c.Run() case tui || cmd.Flags().Changed("tui"): - return runTUI(src.URL) + return runTUI(src.URL, s) default: _, err = fmt.Fprint(w, out) return err } } -func runTUI(path string) error { +func runTUI(path string, s string) error { // Read environment to get debugging stuff cfg, err := env.ParseAs[ui.Config]() if err != nil { @@ -345,7 +345,7 @@ func runTUI(path string) error { cfg.PreserveNewLines = preserveNewLines // Run Bubble Tea program - if _, err := ui.NewProgram(cfg).Run(); err != nil { + if _, err := ui.NewProgram(cfg, s).Run(); err != nil { return err } diff --git a/ui/ui.go b/ui/ui.go index dc4ce87..c23e63a 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -29,7 +29,7 @@ var ( ) // NewProgram returns a new Tea program. -func NewProgram(cfg Config) *tea.Program { +func NewProgram(cfg Config, s string) *tea.Program { log.Debug( "Starting glow", "high_perf_pager", @@ -43,7 +43,7 @@ func NewProgram(cfg Config) *tea.Program { if cfg.EnableMouse { opts = append(opts, tea.WithMouseCellMotion()) } - m := newModel(cfg) + m := newModel(cfg, s) return tea.NewProgram(m, opts...) } @@ -129,7 +129,7 @@ func (m *model) unloadDocument() []tea.Cmd { return batch } -func newModel(cfg Config) tea.Model { +func newModel(cfg Config, s string) tea.Model { initSections() if cfg.GlamourStyle == styles.AutoStyle { @@ -152,6 +152,14 @@ func newModel(cfg Config) tea.Model { } path := cfg.Path + if path == "" && s != "" { + m.state = stateShowDocument + m.pager.currentDocument = markdown{ + Body: s, + } + return m + } + if path == "" { path = "." } From 7fbc040cc894c0ead8aec492a3e48669485b7905 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 13 Feb 2025 13:58:14 -0300 Subject: [PATCH 832/911] refactor: rename `s` to `content` --- main.go | 12 ++++++------ ui/ui.go | 12 +++++------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/main.go b/main.go index e78d6bf..02209fa 100644 --- a/main.go +++ b/main.go @@ -293,13 +293,13 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { return err } - s := string(b) + content := string(b) ext := filepath.Ext(src.URL) if isCode { - s = utils.WrapCodeBlock(string(b), ext) + content = utils.WrapCodeBlock(string(b), ext) } - out, err := r.Render(s) + out, err := r.Render(content) if err != nil { return err } @@ -318,14 +318,14 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { c.Stdout = os.Stdout return c.Run() case tui || cmd.Flags().Changed("tui"): - return runTUI(src.URL, s) + return runTUI(src.URL, content) default: _, err = fmt.Fprint(w, out) return err } } -func runTUI(path string, s string) error { +func runTUI(path string, content string) error { // Read environment to get debugging stuff cfg, err := env.ParseAs[ui.Config]() if err != nil { @@ -345,7 +345,7 @@ func runTUI(path string, s string) error { cfg.PreserveNewLines = preserveNewLines // Run Bubble Tea program - if _, err := ui.NewProgram(cfg, s).Run(); err != nil { + if _, err := ui.NewProgram(cfg, content).Run(); err != nil { return err } diff --git a/ui/ui.go b/ui/ui.go index c23e63a..eeda361 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -29,7 +29,7 @@ var ( ) // NewProgram returns a new Tea program. -func NewProgram(cfg Config, s string) *tea.Program { +func NewProgram(cfg Config, content string) *tea.Program { log.Debug( "Starting glow", "high_perf_pager", @@ -43,7 +43,7 @@ func NewProgram(cfg Config, s string) *tea.Program { if cfg.EnableMouse { opts = append(opts, tea.WithMouseCellMotion()) } - m := newModel(cfg, s) + m := newModel(cfg, content) return tea.NewProgram(m, opts...) } @@ -129,7 +129,7 @@ func (m *model) unloadDocument() []tea.Cmd { return batch } -func newModel(cfg Config, s string) tea.Model { +func newModel(cfg Config, content string) tea.Model { initSections() if cfg.GlamourStyle == styles.AutoStyle { @@ -152,11 +152,9 @@ func newModel(cfg Config, s string) tea.Model { } path := cfg.Path - if path == "" && s != "" { + if path == "" && content != "" { m.state = stateShowDocument - m.pager.currentDocument = markdown{ - Body: s, - } + m.pager.currentDocument = markdown{Body: content} return m } From 490cfcafd0838e87170df5ac764e013ed096a8e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:13:28 +0000 Subject: [PATCH 833/911] chore(deps): bump golangci/golangci-lint-action from 6.3.3 to 6.5.0 (#697) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 6.3.3 to 6.5.0. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v6.3.3...v6.5.0) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 878f06b..6a2418e 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: golangci-lint - uses: golangci/golangci-lint-action@v6.3.3 + uses: golangci/golangci-lint-action@v6.5.0 with: # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 From f0f1201ba58797ed462804a33f5b0636038c8b1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:24:53 +0000 Subject: [PATCH 834/911] chore(deps): bump github.com/fsnotify/fsnotify from 1.6.0 to 1.8.0 (#698) Bumps [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify) from 1.6.0 to 1.8.0. - [Release notes](https://github.com/fsnotify/fsnotify/releases) - [Changelog](https://github.com/fsnotify/fsnotify/blob/main/CHANGELOG.md) - [Commits](https://github.com/fsnotify/fsnotify/compare/v1.6.0...v1.8.0) --- updated-dependencies: - dependency-name: github.com/fsnotify/fsnotify dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 1416e13..44e53d8 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/charmbracelet/log v0.4.0 github.com/charmbracelet/x/editor v0.1.0 github.com/dustin/go-humanize v1.0.1 - github.com/fsnotify/fsnotify v1.6.0 + github.com/fsnotify/fsnotify v1.8.0 github.com/mattn/go-runewidth v0.0.16 github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.3.0 diff --git a/go.sum b/go.sum index cbf871f..a9038bb 100644 --- a/go.sum +++ b/go.sum @@ -99,8 +99,8 @@ github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6 github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -419,7 +419,6 @@ golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= From 5526167854a36d119838b9b03ead85e927ab1937 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:25:26 +0000 Subject: [PATCH 835/911] chore(deps): bump github.com/spf13/cobra from 1.7.0 to 1.9.1 (#699) Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.7.0 to 1.9.1. - [Release notes](https://github.com/spf13/cobra/releases) - [Commits](https://github.com/spf13/cobra/compare/v1.7.0...v1.9.1) --- updated-dependencies: - dependency-name: github.com/spf13/cobra dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 44e53d8..36882f2 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/muesli/roff v0.1.0 github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a github.com/sahilm/fuzzy v0.1.1 - github.com/spf13/cobra v1.7.0 + github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.15.0 golang.org/x/sys v0.30.0 golang.org/x/term v0.29.0 @@ -59,7 +59,7 @@ require ( github.com/spf13/afero v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/yuin/goldmark v1.7.4 // indirect github.com/yuin/goldmark-emoji v1.0.3 // indirect diff --git a/go.sum b/go.sum index a9038bb..3a0a898 100644 --- a/go.sum +++ b/go.sum @@ -80,7 +80,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -250,12 +250,12 @@ github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= From 6175a7989e719cb2df7afcf76b65405301e2e383 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:25:33 +0000 Subject: [PATCH 836/911] chore(deps): bump github.com/caarlos0/env/v11 from 11.0.1 to 11.3.1 (#700) Bumps [github.com/caarlos0/env/v11](https://github.com/caarlos0/env) from 11.0.1 to 11.3.1. - [Release notes](https://github.com/caarlos0/env/releases) - [Changelog](https://github.com/caarlos0/env/blob/main/.goreleaser.yml) - [Commits](https://github.com/caarlos0/env/compare/v11.0.1...v11.3.1) --- updated-dependencies: - dependency-name: github.com/caarlos0/env/v11 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 36882f2..4e72679 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.23.6 require ( github.com/atotto/clipboard v0.1.4 - github.com/caarlos0/env/v11 v11.0.1 + github.com/caarlos0/env/v11 v11.3.1 github.com/charmbracelet/bubbles v0.20.0 github.com/charmbracelet/bubbletea v1.3.3 github.com/charmbracelet/glamour v0.8.0 diff --git a/go.sum b/go.sum index 3a0a898..bd494e2 100644 --- a/go.sum +++ b/go.sum @@ -52,8 +52,8 @@ github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWp github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/caarlos0/env/v11 v11.0.1 h1:A8dDt9Ub9ybqRSUF3fQc/TA/gTam2bKT4Pit+cwrsPs= -github.com/caarlos0/env/v11 v11.0.1/go.mod h1:2RC3HQu8BQqtEK3V4iHPxj0jOdWdbPpWJ6pOueeU1xM= +github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5mCA= +github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE= github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= From 0401d5512550b6d702b88c42d8c162a3e56a6cfd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:28:14 +0000 Subject: [PATCH 837/911] chore(deps): bump github.com/spf13/viper from 1.15.0 to 1.19.0 (#701) Bumps [github.com/spf13/viper](https://github.com/spf13/viper) from 1.15.0 to 1.19.0. - [Release notes](https://github.com/spf13/viper/releases) - [Commits](https://github.com/spf13/viper/compare/v1.15.0...v1.19.0) --- updated-dependencies: - dependency-name: github.com/spf13/viper dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 17 ++- go.sum | 473 ++++----------------------------------------------------- 2 files changed, 39 insertions(+), 451 deletions(-) diff --git a/go.mod b/go.mod index 4e72679..dfa1309 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.9.1 - github.com/spf13/viper v1.15.0 + github.com/spf13/viper v1.19.0 golang.org/x/sys v0.30.0 golang.org/x/term v0.29.0 golang.org/x/text v0.22.0 @@ -41,7 +41,6 @@ require ( github.com/gorilla/css v1.0.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/kr/pretty v0.3.1 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -52,17 +51,21 @@ require ( github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/mango v0.1.0 // indirect github.com/muesli/mango-pflag v0.1.0 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 // indirect - github.com/spf13/afero v1.9.3 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.6 // indirect - github.com/subosito/gotenv v1.4.2 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/yuin/goldmark v1.7.4 // indirect github.com/yuin/goldmark-emoji v1.0.3 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect golang.org/x/net v0.27.0 // indirect golang.org/x/sync v0.11.0 // indirect diff --git a/go.sum b/go.sum index bd494e2..e873f8c 100644 --- a/go.sum +++ b/go.sum @@ -1,43 +1,3 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE= github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= @@ -54,7 +14,6 @@ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuP github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5mCA= github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE= github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= github.com/charmbracelet/bubbletea v1.3.3 h1:WpU6fCY0J2vDWM3zfS3vIDi/ULq3SYphZhkAGGvmEUY= @@ -73,112 +32,33 @@ github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b h1:MnAM github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -225,374 +105,79 @@ github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8= github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig= github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg= github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sahilm/fuzzy v0.1.1 h1:ceu5RHF8DGgoi+/dR5PsECjCDH1BE3Fnmpo7aVXOdRA= github.com/sahilm/fuzzy v0.1.1/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark-emoji v1.0.3 h1:aLRkLHOuBR2czCY4R8olwMjID+tENfhyFDMCRhbIQY4= github.com/yuin/goldmark-emoji v1.0.3/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuhGX/+R1ZpfJ4/ia80JM= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= From 7154552fa0e9acb2b27a2e11c64593125ec41b2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 11:06:44 +0000 Subject: [PATCH 838/911] chore(deps): bump github.com/muesli/termenv (#704) Bumps [github.com/muesli/termenv](https://github.com/muesli/termenv) from 0.15.3-0.20240618155329-98d742f6907a to 0.16.0. - [Release notes](https://github.com/muesli/termenv/releases) - [Commits](https://github.com/muesli/termenv/commits/v0.16.0) --- updated-dependencies: - dependency-name: github.com/muesli/termenv dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index dfa1309..6f20913 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/muesli/mango-cobra v1.2.0 github.com/muesli/reflow v0.3.0 github.com/muesli/roff v0.1.0 - github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a + github.com/muesli/termenv v0.16.0 github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.19.0 diff --git a/go.sum b/go.sum index e873f8c..b191e36 100644 --- a/go.sum +++ b/go.sum @@ -103,8 +103,8 @@ github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8= github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig= -github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg= -github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ= +github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= +github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= From 2da054e8022a4ec2291d215e515174c6b6f20ea0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Feb 2025 20:39:11 +0000 Subject: [PATCH 839/911] chore(deps): bump golang.org/x/net from 0.27.0 to 0.33.0 (#707) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.27.0 to 0.33.0. - [Commits](https://github.com/golang/net/compare/v0.27.0...v0.33.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6f20913..48535dd 100644 --- a/go.mod +++ b/go.mod @@ -67,7 +67,7 @@ require ( go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect - golang.org/x/net v0.27.0 // indirect + golang.org/x/net v0.33.0 // indirect golang.org/x/sync v0.11.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index b191e36..e826cd6 100644 --- a/go.sum +++ b/go.sum @@ -161,8 +161,8 @@ go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuhGX/+R1ZpfJ4/ia80JM= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= -golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From 7dc4b9c87f88ecc68fc7395e2ea88068fdb8a37a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 10:36:24 +0000 Subject: [PATCH 840/911] chore(deps): bump github.com/charmbracelet/bubbletea from 1.3.3 to 1.3.4 (#711) Bumps [github.com/charmbracelet/bubbletea](https://github.com/charmbracelet/bubbletea) from 1.3.3 to 1.3.4. - [Release notes](https://github.com/charmbracelet/bubbletea/releases) - [Changelog](https://github.com/charmbracelet/bubbletea/blob/main/.goreleaser.yml) - [Commits](https://github.com/charmbracelet/bubbletea/compare/v1.3.3...v1.3.4) --- updated-dependencies: - dependency-name: github.com/charmbracelet/bubbletea dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 48535dd..9a3663f 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/atotto/clipboard v0.1.4 github.com/caarlos0/env/v11 v11.3.1 github.com/charmbracelet/bubbles v0.20.0 - github.com/charmbracelet/bubbletea v1.3.3 + github.com/charmbracelet/bubbletea v1.3.4 github.com/charmbracelet/glamour v0.8.0 github.com/charmbracelet/lipgloss v1.0.0 github.com/charmbracelet/log v0.4.0 diff --git a/go.sum b/go.sum index e826cd6..0fd1e72 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5m github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U= github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE= github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= -github.com/charmbracelet/bubbletea v1.3.3 h1:WpU6fCY0J2vDWM3zfS3vIDi/ULq3SYphZhkAGGvmEUY= -github.com/charmbracelet/bubbletea v1.3.3/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= +github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI= +github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= github.com/charmbracelet/glamour v0.8.0 h1:tPrjL3aRcQbn++7t18wOpgLyl8wrOHUEDS7IZ68QtZs= github.com/charmbracelet/glamour v0.8.0/go.mod h1:ViRgmKkf3u5S7uakt2czJ272WSg2ZenlYEZXT2x7Bjw= github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg= From f88a901caacbac5a83f5e4d6baf5fde0bc36d9dc Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Fri, 7 Mar 2025 15:10:54 -0300 Subject: [PATCH 841/911] ci: fix goreleaser config --- .goreleaser.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 22bd6e5..0c539b7 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -8,7 +8,7 @@ includes: variables: description: "Render markdown on the CLI, with pizzazz!" - github_url: "https://github.com/charmbracelet/soft-serve" + github_url: "https://github.com/charmbracelet/glow" maintainer: "Christian Muehlhaeuser " brew_commit_author_name: "Christian Muehlhaeuser" brew_commit_author_email: "muesli@charm.sh" From eeb0fdd06fefe97adce70926570b7a0763f28e41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:10:35 +0000 Subject: [PATCH 842/911] chore(deps): bump golang.org/x/term from 0.29.0 to 0.30.0 (#714) Bumps [golang.org/x/term](https://github.com/golang/term) from 0.29.0 to 0.30.0. - [Commits](https://github.com/golang/term/compare/v0.29.0...v0.30.0) --- updated-dependencies: - dependency-name: golang.org/x/term dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 9a3663f..75a3ef5 100644 --- a/go.mod +++ b/go.mod @@ -24,8 +24,8 @@ require ( github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.19.0 - golang.org/x/sys v0.30.0 - golang.org/x/term v0.29.0 + golang.org/x/sys v0.31.0 + golang.org/x/term v0.30.0 golang.org/x/text v0.22.0 ) diff --git a/go.sum b/go.sum index 0fd1e72..ea26c1f 100644 --- a/go.sum +++ b/go.sum @@ -167,10 +167,10 @@ golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= -golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= +golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 652010599b3010cb3e462e3b06ae27fb4a7512ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:14:22 +0000 Subject: [PATCH 843/911] chore(deps): bump golang.org/x/text from 0.22.0 to 0.23.0 (#715) Bumps [golang.org/x/text](https://github.com/golang/text) from 0.22.0 to 0.23.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.22.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 75a3ef5..712bc96 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/spf13/viper v1.19.0 golang.org/x/sys v0.31.0 golang.org/x/term v0.30.0 - golang.org/x/text v0.22.0 + golang.org/x/text v0.23.0 ) require ( @@ -68,7 +68,7 @@ require ( go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect golang.org/x/net v0.33.0 // indirect - golang.org/x/sync v0.11.0 // indirect + golang.org/x/sync v0.12.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index ea26c1f..81c4c97 100644 --- a/go.sum +++ b/go.sum @@ -163,16 +163,16 @@ golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuh golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 6cd480d68d1312d4dcf3e5638745a8ef1080b99d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 09:31:38 +0000 Subject: [PATCH 844/911] chore(deps): bump golangci/golangci-lint-action from 6.5.0 to 6.5.1 (#720) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 6.5.0 to 6.5.1. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v6.5.0...v6.5.1) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 6a2418e..ff42afb 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: golangci-lint - uses: golangci/golangci-lint-action@v6.5.0 + uses: golangci/golangci-lint-action@v6.5.1 with: # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 From 411cdb142f8554ea72002cd4bfe93de55962a206 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 10:08:02 +0000 Subject: [PATCH 845/911] chore(deps): bump github.com/charmbracelet/glamour from 0.8.0 to 0.9.0 (#721) Bumps [github.com/charmbracelet/glamour](https://github.com/charmbracelet/glamour) from 0.8.0 to 0.9.0. - [Release notes](https://github.com/charmbracelet/glamour/releases) - [Changelog](https://github.com/charmbracelet/glamour/blob/master/.goreleaser.yml) - [Commits](https://github.com/charmbracelet/glamour/compare/v0.8.0...v0.9.0) --- updated-dependencies: - dependency-name: github.com/charmbracelet/glamour dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 12 ++++++++---- go.sum | 22 ++++++++++++++-------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 712bc96..bf97031 100644 --- a/go.mod +++ b/go.mod @@ -1,14 +1,15 @@ module github.com/charmbracelet/glow/v2 go 1.23.6 +toolchain go1.24.1 require ( github.com/atotto/clipboard v0.1.4 github.com/caarlos0/env/v11 v11.3.1 github.com/charmbracelet/bubbles v0.20.0 github.com/charmbracelet/bubbletea v1.3.4 - github.com/charmbracelet/glamour v0.8.0 - github.com/charmbracelet/lipgloss v1.0.0 + github.com/charmbracelet/glamour v0.9.0 + github.com/charmbracelet/lipgloss v1.1.0 github.com/charmbracelet/log v0.4.0 github.com/charmbracelet/x/editor v0.1.0 github.com/dustin/go-humanize v1.0.1 @@ -33,7 +34,9 @@ require ( github.com/alecthomas/chroma/v2 v2.14.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect + github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect github.com/charmbracelet/x/ansi v0.8.0 // indirect + github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect github.com/charmbracelet/x/term v0.2.1 // indirect github.com/dlclark/regexp2 v1.11.0 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect @@ -62,8 +65,9 @@ require ( github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.6 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/yuin/goldmark v1.7.4 // indirect - github.com/yuin/goldmark-emoji v1.0.3 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + github.com/yuin/goldmark v1.7.8 // indirect + github.com/yuin/goldmark-emoji v1.0.5 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect diff --git a/go.sum b/go.sum index 81c4c97..082b31e 100644 --- a/go.sum +++ b/go.sum @@ -18,14 +18,18 @@ github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQW github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI= github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= -github.com/charmbracelet/glamour v0.8.0 h1:tPrjL3aRcQbn++7t18wOpgLyl8wrOHUEDS7IZ68QtZs= -github.com/charmbracelet/glamour v0.8.0/go.mod h1:ViRgmKkf3u5S7uakt2czJ272WSg2ZenlYEZXT2x7Bjw= -github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg= -github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo= +github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= +github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= +github.com/charmbracelet/glamour v0.9.0 h1:1Hm3wxww7qXvGI+Fb3zDmIZo5oDOvVOWJ4OrIB+ef7c= +github.com/charmbracelet/glamour v0.9.0/go.mod h1:+SHvIS8qnwhgTpVMiXwn7OfGomSqff1cHBCI8jLOetk= +github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= +github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM= github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM= github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= +github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= +github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= github.com/charmbracelet/x/editor v0.1.0 h1:p69/dpvlwRTs9uYiPeAWruwsHqTFzHhTvQOd/WVSX98= github.com/charmbracelet/x/editor v0.1.0/go.mod h1:oivrEbcP/AYt/Hpvk5pwDXXrQ933gQS6UzL6fxqAGSA= github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b h1:MnAMdlwSltxJyULnrYbkZpp4k58Co7Tah3ciKhSNo0Q= @@ -150,11 +154,13 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= -github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -github.com/yuin/goldmark-emoji v1.0.3 h1:aLRkLHOuBR2czCY4R8olwMjID+tENfhyFDMCRhbIQY4= -github.com/yuin/goldmark-emoji v1.0.3/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= +github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= +github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark-emoji v1.0.5 h1:EMVWyCGPlXJfUXBXpuMu+ii3TIaxbVBnEX9uaDC4cIk= +github.com/yuin/goldmark-emoji v1.0.5/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= From 85668a6a216b57e6a77b7c2e365b0c595e015e77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 10:08:56 +0000 Subject: [PATCH 846/911] chore(deps): bump github.com/spf13/viper from 1.19.0 to 1.20.0 (#722) Bumps [github.com/spf13/viper](https://github.com/spf13/viper) from 1.19.0 to 1.20.0. - [Release notes](https://github.com/spf13/viper/releases) - [Commits](https://github.com/spf13/viper/compare/v1.19.0...v1.20.0) --- updated-dependencies: - dependency-name: github.com/spf13/viper dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++---------- go.sum | 48 ++++++++++++++++-------------------------------- 2 files changed, 22 insertions(+), 42 deletions(-) diff --git a/go.mod b/go.mod index bf97031..0a807ab 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/muesli/termenv v0.16.0 github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.9.1 - github.com/spf13/viper v1.19.0 + github.com/spf13/viper v1.20.0 golang.org/x/sys v0.31.0 golang.org/x/term v0.30.0 golang.org/x/text v0.23.0 @@ -41,28 +41,25 @@ require ( github.com/dlclark/regexp2 v1.11.0 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/gorilla/css v1.0.1 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect github.com/microcosm-cc/bluemonday v1.0.27 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/mango v0.1.0 // indirect github.com/muesli/mango-pflag v0.1.0 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sagikazarmark/locafero v0.7.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/afero v1.12.0 // indirect + github.com/spf13/cast v1.7.1 // indirect github.com/spf13/pflag v1.0.6 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect @@ -74,6 +71,5 @@ require ( golang.org/x/net v0.33.0 // indirect golang.org/x/sync v0.12.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 082b31e..2d739e5 100644 --- a/go.sum +++ b/go.sum @@ -38,9 +38,8 @@ github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQ github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -53,12 +52,12 @@ github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/ github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -74,8 +73,6 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= @@ -87,8 +84,6 @@ github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwX github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= @@ -109,11 +104,10 @@ github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8= github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig= github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= -github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= @@ -123,35 +117,27 @@ github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= -github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= +github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= github.com/sahilm/fuzzy v0.1.1 h1:ceu5RHF8DGgoi+/dR5PsECjCDH1BE3Fnmpo7aVXOdRA= github.com/sahilm/fuzzy v0.1.1/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= -github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/spf13/viper v1.20.0 h1:zrxIyR3RQIOsarIrgL8+sAvALXul9jeEPa06Y0Ph6vY= +github.com/spf13/viper v1.20.0/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= @@ -182,8 +168,6 @@ golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 6558aaab69ab47c77316efda035fc84bc726f8ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 10:15:16 +0000 Subject: [PATCH 847/911] chore(deps): bump github.com/charmbracelet/log from 0.4.0 to 0.4.1 (#724) Bumps [github.com/charmbracelet/log](https://github.com/charmbracelet/log) from 0.4.0 to 0.4.1. - [Release notes](https://github.com/charmbracelet/log/releases) - [Commits](https://github.com/charmbracelet/log/compare/v0.4.0...v0.4.1) --- updated-dependencies: - dependency-name: github.com/charmbracelet/log dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0a807ab..dba1178 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/charmbracelet/bubbletea v1.3.4 github.com/charmbracelet/glamour v0.9.0 github.com/charmbracelet/lipgloss v1.1.0 - github.com/charmbracelet/log v0.4.0 + github.com/charmbracelet/log v0.4.1 github.com/charmbracelet/x/editor v0.1.0 github.com/dustin/go-humanize v1.0.1 github.com/fsnotify/fsnotify v1.8.0 diff --git a/go.sum b/go.sum index 2d739e5..96db1cc 100644 --- a/go.sum +++ b/go.sum @@ -24,8 +24,8 @@ github.com/charmbracelet/glamour v0.9.0 h1:1Hm3wxww7qXvGI+Fb3zDmIZo5oDOvVOWJ4OrI github.com/charmbracelet/glamour v0.9.0/go.mod h1:+SHvIS8qnwhgTpVMiXwn7OfGomSqff1cHBCI8jLOetk= github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= -github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM= -github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM= +github.com/charmbracelet/log v0.4.1 h1:6AYnoHKADkghm/vt4neaNEXkxcXLSV2g1rdyFDOpTyk= +github.com/charmbracelet/log v0.4.1/go.mod h1:pXgyTsqsVu4N9hGdHmQ0xEA4RsXof402LX9ZgiITn2I= github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= From 0b668e15939324d514e6a27fb6da766b260f74d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 09:44:16 +0000 Subject: [PATCH 848/911] chore(deps): bump golangci/golangci-lint-action from 6.5.1 to 6.5.2 (#726) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 6.5.1 to 6.5.2. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v6.5.1...v6.5.2) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ff42afb..3815370 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: golangci-lint - uses: golangci/golangci-lint-action@v6.5.1 + uses: golangci/golangci-lint-action@v6.5.2 with: # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 From d54666ddf74f51495f4c8ae6f5f89beff64cfe05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 10:14:31 +0000 Subject: [PATCH 849/911] chore(deps): bump github.com/charmbracelet/glamour from 0.9.0 to 0.9.1 (#727) Bumps [github.com/charmbracelet/glamour](https://github.com/charmbracelet/glamour) from 0.9.0 to 0.9.1. - [Release notes](https://github.com/charmbracelet/glamour/releases) - [Changelog](https://github.com/charmbracelet/glamour/blob/master/.goreleaser.yml) - [Commits](https://github.com/charmbracelet/glamour/compare/v0.9.0...v0.9.1) --- updated-dependencies: - dependency-name: github.com/charmbracelet/glamour dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 3 ++- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index dba1178..6ac0d8c 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,7 @@ module github.com/charmbracelet/glow/v2 go 1.23.6 + toolchain go1.24.1 require ( @@ -8,7 +9,7 @@ require ( github.com/caarlos0/env/v11 v11.3.1 github.com/charmbracelet/bubbles v0.20.0 github.com/charmbracelet/bubbletea v1.3.4 - github.com/charmbracelet/glamour v0.9.0 + github.com/charmbracelet/glamour v0.9.1 github.com/charmbracelet/lipgloss v1.1.0 github.com/charmbracelet/log v0.4.1 github.com/charmbracelet/x/editor v0.1.0 diff --git a/go.sum b/go.sum index 96db1cc..079aaf2 100644 --- a/go.sum +++ b/go.sum @@ -20,8 +20,8 @@ github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZ github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= -github.com/charmbracelet/glamour v0.9.0 h1:1Hm3wxww7qXvGI+Fb3zDmIZo5oDOvVOWJ4OrIB+ef7c= -github.com/charmbracelet/glamour v0.9.0/go.mod h1:+SHvIS8qnwhgTpVMiXwn7OfGomSqff1cHBCI8jLOetk= +github.com/charmbracelet/glamour v0.9.1 h1:11dEfiGP8q1BEqvGoIjivuc2rBk+5qEXdPtaQ2WoiCM= +github.com/charmbracelet/glamour v0.9.1/go.mod h1:+SHvIS8qnwhgTpVMiXwn7OfGomSqff1cHBCI8jLOetk= github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= github.com/charmbracelet/log v0.4.1 h1:6AYnoHKADkghm/vt4neaNEXkxcXLSV2g1rdyFDOpTyk= From 4d59a973a71def59e88f473703ee7a1a2188ac12 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 09:21:02 +0000 Subject: [PATCH 850/911] chore(deps): bump golangci/golangci-lint-action from 6.5.2 to 7.0.0 (#730) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 6.5.2 to 7.0.0. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v6.5.2...v7.0.0) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 3815370..3c38993 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: golangci-lint - uses: golangci/golangci-lint-action@v6.5.2 + uses: golangci/golangci-lint-action@v7.0.0 with: # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 From 50a763ef945c08aa2528e7eeb01d6f086958b2f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 09:49:02 +0000 Subject: [PATCH 851/911] chore(deps): bump github.com/spf13/viper from 1.20.0 to 1.20.1 (#731) Bumps [github.com/spf13/viper](https://github.com/spf13/viper) from 1.20.0 to 1.20.1. - [Release notes](https://github.com/spf13/viper/releases) - [Commits](https://github.com/spf13/viper/compare/v1.20.0...v1.20.1) --- updated-dependencies: - dependency-name: github.com/spf13/viper dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 3 +-- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 6ac0d8c..f0192a3 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,6 @@ module github.com/charmbracelet/glow/v2 go 1.23.6 - toolchain go1.24.1 require ( @@ -25,7 +24,7 @@ require ( github.com/muesli/termenv v0.16.0 github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.9.1 - github.com/spf13/viper v1.20.0 + github.com/spf13/viper v1.20.1 golang.org/x/sys v0.31.0 golang.org/x/term v0.30.0 golang.org/x/text v0.23.0 diff --git a/go.sum b/go.sum index 079aaf2..faeaa02 100644 --- a/go.sum +++ b/go.sum @@ -131,8 +131,8 @@ github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.20.0 h1:zrxIyR3RQIOsarIrgL8+sAvALXul9jeEPa06Y0Ph6vY= -github.com/spf13/viper v1.20.0/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= +github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= From 05872a506ace8655fadd62006aa93093d12aa152 Mon Sep 17 00:00:00 2001 From: Ktrod Date: Wed, 2 Apr 2025 08:47:04 -0400 Subject: [PATCH 852/911] fix(watch): watch for dir instead of file to work on all scenarios (#734) Co-authored-by: Andrey Nering --- ui/pager.go | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/ui/pager.go b/ui/pager.go index 6d4209b..207fafc 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -3,7 +3,6 @@ package ui import ( "fmt" "math" - "os" "path/filepath" "strings" "time" @@ -477,44 +476,48 @@ func (m *pagerModel) initWatcher() { } func (m *pagerModel) watchFile() tea.Msg { - path := m.relFilePath() + dir := m.localDir() - if err := m.watcher.Add(path); err != nil { - log.Error("error adding file to fsnotify watcher", "error", err) + if err := m.watcher.Add(dir); err != nil { + log.Error("error adding dir to fsnotify watcher", "error", err) return nil } - log.Info("fsnotify watching file", "file", path) + log.Info("fsnotify watching dir", "dir", dir) for { select { case event, ok := <-m.watcher.Events: - if !ok || !event.Has(fsnotify.Write) { + if !ok || event.Name != m.currentDocument.localPath { continue } - log.Debug("fsnotify event", "file", path, "event", event.Op) + + if !event.Has(fsnotify.Write) && !event.Has(fsnotify.Create) { + continue + } + + log.Debug("fsnotify event", "file", event.Name, "event", event.Op) return reloadMsg{} case err, ok := <-m.watcher.Errors: if !ok { continue } - log.Debug("fsnotify error", "file", path, "error", err) + log.Debug("fsnotify error", "dir", dir, "error", err) } } } func (m *pagerModel) unwatchFile() { - path := m.relFilePath() + dir := m.localDir() - err := m.watcher.Remove(path) + err := m.watcher.Remove(dir) if err == nil { - log.Debug("fsnotify file unwatched", "file", path) + log.Debug("fsnotify dir unwatched", "dir", dir) } else { - log.Error("fsnotify fail to unwatch file", "file", path, "error", err) + log.Error("fsnotify fail to unwatch dir", "dir", dir, "error", err) } } -func (m *pagerModel) relFilePath() string { - wd, _ := os.Getwd() - return stripAbsolutePath(m.currentDocument.localPath, wd) +func (m *pagerModel) localDir() string { + return filepath.Dir(m.currentDocument.localPath) } From 23f9873f6a8b8c01313b4a797f683e60425ba656 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 2 Apr 2025 10:08:57 -0300 Subject: [PATCH 853/911] chore: add `.editorconfig` --- .editorconfig | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..5de2df8 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# https://editorconfig.org/ + +root = true + +[*] +charset = utf-8 +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 + +[*.go] +indent_style = tab +indent_size = 8 + +[*.golden] +insert_final_newline = false +trim_trailing_whitespace = false From c48ee3d98c098975601fa4afdc7636da68ebc936 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 2 Apr 2025 10:10:57 -0300 Subject: [PATCH 854/911] chore: add a taskfile --- Taskfile.yaml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Taskfile.yaml diff --git a/Taskfile.yaml b/Taskfile.yaml new file mode 100644 index 0000000..6d8c844 --- /dev/null +++ b/Taskfile.yaml @@ -0,0 +1,23 @@ +# https://taskfile.dev + +version: '3' + +tasks: + lint: + desc: Run base linters + cmds: + - golangci-lint run + + test: + desc: Run tests + cmds: + - go test ./... {{.CLI_ARGS}} + + log: + desc: Watch for glow logs + aliases: [tail] + cmds: + - cmd: tail -f ~/Library/Caches/glow/glow.log + platforms: [darwin] + - cmd: tail -f ~/.cache/glow/glow.log + platforms: [linux, windows] From 81c64fdd2d15adb2a83c4a4d3851fe4d77676e5f Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 2 Apr 2025 10:53:21 -0300 Subject: [PATCH 855/911] chore: delete makefile --- Makefile | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 Makefile diff --git a/Makefile b/Makefile deleted file mode 100644 index 4985f56..0000000 --- a/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -# This Makefile is just for development purposes - -.PHONY: default clean glow run log - -default: glow - -clean: - rm -f ./glow - -glow: - go build - -run: clean glow - ./glow - -log: - tail -f ~/.cache/glow/glow.log From 230dbc79b2431b15df3150911a2593e5364ff50a Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 2 Apr 2025 10:11:49 -0300 Subject: [PATCH 856/911] ci: add `lint-sync` workflow --- .github/workflows/lint-sync.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/workflows/lint-sync.yml diff --git a/.github/workflows/lint-sync.yml b/.github/workflows/lint-sync.yml new file mode 100644 index 0000000..43f380f --- /dev/null +++ b/.github/workflows/lint-sync.yml @@ -0,0 +1,13 @@ +name: lint-sync +on: + schedule: + - cron: "0 0 * * 0" # every sunday at midnight + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + lint: + uses: charmbracelet/meta/.github/workflows/lint-sync.yml@main From 0a6732f089ec549bd8cad61895b669ecb0cfc163 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 2 Apr 2025 10:12:08 -0300 Subject: [PATCH 857/911] fix: update `.golangci.yml` for v2 --- .golangci.yml | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 911a28b..be61d89 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,33 +1,41 @@ +version: "2" run: tests: false - -issues: - include: - - EXC0001 - - EXC0005 - - EXC0011 - - EXC0012 - - EXC0013 - - max-issues-per-linter: 0 - max-same-issues: 0 - linters: enable: - bodyclose - - dupl + - exhaustive - goconst - godot - godox - - gofumpt - - goimports + - gomoddirectives - goprintffuncname - gosec - misspell + - nakedret + - nestif + - nilerr + - noctx + - nolintlint - prealloc - revive - rowserrcheck - sqlclosecheck + - tparallel - unconvert - unparam - whitespace + - wrapcheck + exclusions: + generated: lax + presets: + - common-false-positives +issues: + max-issues-per-linter: 0 + max-same-issues: 0 +formatters: + enable: + - gofumpt + - goimports + exclusions: + generated: lax From 41d70ee83b88d94fcd8b6d9b4fbb8a4fa0cd8b8c Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 2 Apr 2025 10:52:47 -0300 Subject: [PATCH 858/911] fix(lint): fix all linting issues --- config_cmd.go | 14 ++++++------- github.go | 16 +++++++------- gitlab.go | 18 ++++++++-------- log.go | 11 +++++----- main.go | 55 +++++++++++++++++++++++++++++-------------------- man_cmd.go | 8 ++++--- ui/editor.go | 2 +- ui/markdown.go | 6 +++++- ui/pager.go | 8 +++---- ui/stash.go | 8 +++---- ui/stashitem.go | 4 ++-- ui/ui.go | 21 ++++--------------- url.go | 3 ++- utils/utils.go | 7 ++++--- 14 files changed, 94 insertions(+), 87 deletions(-) diff --git a/config_cmd.go b/config_cmd.go index 7147ab8..390a1db 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -39,13 +39,13 @@ var configCmd = &cobra.Command{ c, err := editor.Cmd("Glow", configFile) if err != nil { - return err + return fmt.Errorf("unable to set config file: %w", err) } c.Stdin = os.Stdin c.Stdout = os.Stdout c.Stderr = os.Stderr if err := c.Run(); err != nil { - return err + return fmt.Errorf("unable to run command: %w", err) } fmt.Println("Wrote config file to:", configFile) @@ -56,7 +56,7 @@ var configCmd = &cobra.Command{ func ensureConfigFile() error { if configFile == "" { configFile = viper.GetViper().ConfigFileUsed() - if err := os.MkdirAll(filepath.Dir(configFile), 0o755); err != nil { + if err := os.MkdirAll(filepath.Dir(configFile), 0o755); err != nil { //nolint:gosec return fmt.Errorf("could not write configuration file: %w", err) } } @@ -69,20 +69,20 @@ func ensureConfigFile() error { // File doesn't exist yet, create all necessary directories and // write the default config file if err := os.MkdirAll(filepath.Dir(configFile), 0o700); err != nil { - return err + return fmt.Errorf("unable create directory: %w", err) } f, err := os.Create(configFile) if err != nil { - return err + return fmt.Errorf("unable to create config file: %w", err) } defer func() { _ = f.Close() }() if _, err := f.WriteString(defaultConfig); err != nil { - return err + return fmt.Errorf("unable to write config file: %w", err) } } else if err != nil { // some other error occurred - return err + return fmt.Errorf("unable to stat config file: %w", err) } return nil } diff --git a/github.go b/github.go index 6b169fa..fe862e3 100644 --- a/github.go +++ b/github.go @@ -23,29 +23,29 @@ func findGitHubREADME(u *url.URL) (*source, error) { apiURL := fmt.Sprintf("https://api.%s/repos/%s/%s/readme", u.Hostname(), owner, repo) - // nolint:bodyclose + //nolint:bodyclose // it is closed on the caller - res, err := http.Get(apiURL) // nolint: gosec + res, err := http.Get(apiURL) //nolint: gosec,noctx if err != nil { - return nil, err + return nil, fmt.Errorf("unable to get url: %w", err) } body, err := io.ReadAll(res.Body) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to read http response body: %w", err) } var result readme if err := json.Unmarshal(body, &result); err != nil { - return nil, err + return nil, fmt.Errorf("unable to parse json: %w", err) } if res.StatusCode == http.StatusOK { - // nolint:bodyclose + //nolint:bodyclose // it is closed on the caller - resp, err := http.Get(result.DownloadURL) + resp, err := http.Get(result.DownloadURL) //nolint: noctx if err != nil { - return nil, err + return nil, fmt.Errorf("unable to get url: %w", err) } if resp.StatusCode == http.StatusOK { diff --git a/gitlab.go b/gitlab.go index 05e1239..68256be 100644 --- a/gitlab.go +++ b/gitlab.go @@ -25,31 +25,31 @@ func findGitLabREADME(u *url.URL) (*source, error) { apiURL := fmt.Sprintf("https://%s/api/v4/projects/%s", u.Hostname(), projectPath) - // nolint:bodyclose + //nolint:bodyclose // it is closed on the caller - res, err := http.Get(apiURL) // nolint: gosec + res, err := http.Get(apiURL) //nolint: gosec,noctx if err != nil { - return nil, err + return nil, fmt.Errorf("unable to get url: %w", err) } body, err := io.ReadAll(res.Body) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to read http response body: %w", err) } var result readme if err := json.Unmarshal(body, &result); err != nil { - return nil, err + return nil, fmt.Errorf("unable to parse json: %w", err) } - readmeRawURL := strings.Replace(result.ReadmeURL, "blob", "raw", -1) + readmeRawURL := strings.ReplaceAll(result.ReadmeURL, "blob", "raw") if res.StatusCode == http.StatusOK { - // nolint:bodyclose + //nolint:bodyclose // it is closed on the caller - resp, err := http.Get(readmeRawURL) // nolint: gosec + resp, err := http.Get(readmeRawURL) //nolint: gosec,noctx if err != nil { - return nil, err + return nil, fmt.Errorf("unable to get url: %w", err) } if resp.StatusCode == http.StatusOK { diff --git a/log.go b/log.go index 531feac..a864a71 100644 --- a/log.go +++ b/log.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "io" "os" "path/filepath" @@ -12,7 +13,7 @@ import ( func getLogFilePath() (string, error) { dir, err := gap.NewScope(gap.User, "glow").CacheDir() if err != nil { - return "", err + return "", fmt.Errorf("unable to get cache dir: %w", err) } return filepath.Join(dir, "glow.log"), nil } @@ -24,14 +25,14 @@ func setupLog() (func() error, error) { if err != nil { return nil, err } - if err := os.MkdirAll(filepath.Dir(logFile), 0o755); err != nil { + if err := os.MkdirAll(filepath.Dir(logFile), 0o755); err != nil { //nolint:gosec // log disabled - return func() error { return nil }, nil + return func() error { return nil }, nil //nolint:nilerr } - f, err := os.OpenFile(logFile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0o644) + f, err := os.OpenFile(logFile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0o644) //nolint:gosec if err != nil { // log disabled - return func() error { return nil }, nil + return func() error { return nil }, nil //nolint:nilerr } log.SetOutput(f) log.SetLevel(log.DebugLevel) diff --git a/main.go b/main.go index 02209fa..c1643b5 100644 --- a/main.go +++ b/main.go @@ -1,3 +1,4 @@ +// Package main provides the entry point for the Glow CLI application. package main import ( @@ -83,15 +84,15 @@ func sourceFromArg(arg string) (*source, error) { } // HTTP(S) URLs: - if u, err := url.ParseRequestURI(arg); err == nil && strings.Contains(arg, "://") { + if u, err := url.ParseRequestURI(arg); err == nil && strings.Contains(arg, "://") { //nolint:nestif if u.Scheme != "" { if u.Scheme != "http" && u.Scheme != "https" { return nil, fmt.Errorf("%s is not a supported protocol", u.Scheme) } // consumer of the source is responsible for closing the ReadCloser. - resp, err := http.Get(u.String()) // nolint:bodyclose + resp, err := http.Get(u.String()) //nolint: noctx,bodyclose if err != nil { - return nil, err + return nil, fmt.Errorf("unable to get url: %w", err) } if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("HTTP status %d", resp.StatusCode) @@ -106,7 +107,7 @@ func sourceFromArg(arg string) (*source, error) { arg = "." } st, err := os.Stat(arg) - if err == nil && st.IsDir() { + if err == nil && st.IsDir() { //nolint:nestif var src *source _ = filepath.Walk(arg, func(path string, _ os.FileInfo, err error) error { if err != nil { @@ -136,10 +137,15 @@ func sourceFromArg(arg string) (*source, error) { return nil, errors.New("missing markdown source") } - // a file: r, err := os.Open(arg) - u, _ := filepath.Abs(arg) - return &source{r, u}, err + if err != nil { + return nil, fmt.Errorf("unable to open file: %w", err) + } + u, err := filepath.Abs(arg) + if err != nil { + return nil, fmt.Errorf("unable to get absolute path: %w", err) + } + return &source{r, u}, nil } // validateStyle checks if the style is a default style, if not, checks that @@ -148,9 +154,9 @@ func validateStyle(style string) error { if style != "auto" && styles.DefaultStyles[style] == nil { style = utils.ExpandPath(style) if _, err := os.Stat(style); errors.Is(err, fs.ErrNotExist) { - return fmt.Errorf("Specified style does not exist: %s", style) + return fmt.Errorf("specified style does not exist: %s", style) } else if err != nil { - return err + return fmt.Errorf("unable to stat file: %w", err) } } return nil @@ -166,7 +172,7 @@ func validateOptions(cmd *cobra.Command) error { preserveNewLines = viper.GetBool("preserveNewLines") if pager && tui { - return errors.New("glow: cannot use both pager and tui") + return errors.New("cannot use both pager and tui") } // validate the glamour style @@ -183,11 +189,11 @@ func validateOptions(cmd *cobra.Command) error { } // Detect terminal width - if !cmd.Flags().Changed("width") { + if !cmd.Flags().Changed("width") { //nolint:nestif if isTerminal && width == 0 { w, _, err := term.GetSize(int(os.Stdout.Fd())) if err == nil { - width = uint(w) + width = uint(w) //nolint:gosec } if width > 120 { @@ -204,7 +210,7 @@ func validateOptions(cmd *cobra.Command) error { func stdinIsPipe() (bool, error) { stat, err := os.Stdin.Stat() if err != nil { - return false, err + return false, fmt.Errorf("unable to open file: %w", err) } if stat.Mode()&os.ModeCharDevice == 0 || stat.Size() > 0 { return true, nil @@ -266,7 +272,7 @@ func executeArg(cmd *cobra.Command, arg string, w io.Writer) error { func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { b, err := io.ReadAll(src.reader) if err != nil { - return err + return fmt.Errorf("unable to read from reader: %w", err) } b = utils.RemoveFrontmatter(b) @@ -285,12 +291,12 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { r, err := glamour.NewTermRenderer( glamour.WithColorProfile(lipgloss.ColorProfile()), utils.GlamourStyle(style, isCode), - glamour.WithWordWrap(int(width)), + glamour.WithWordWrap(int(width)), //nolint:gosec glamour.WithBaseURL(baseURL), glamour.WithPreservedNewLines(), ) if err != nil { - return err + return fmt.Errorf("unable to create renderer: %w", err) } content := string(b) @@ -301,7 +307,7 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { out, err := r.Render(content) if err != nil { - return err + return fmt.Errorf("unable to render markdown: %w", err) } // display @@ -313,15 +319,20 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { } pa := strings.Split(pagerCmd, " ") - c := exec.Command(pa[0], pa[1:]...) // nolint:gosec + c := exec.Command(pa[0], pa[1:]...) //nolint:gosec c.Stdin = strings.NewReader(out) c.Stdout = os.Stdout - return c.Run() + if err := c.Run(); err != nil { + return fmt.Errorf("unable to run command: %w", err) + } + return nil case tui || cmd.Flags().Changed("tui"): return runTUI(src.URL, content) default: - _, err = fmt.Fprint(w, out) - return err + if _, err = fmt.Fprint(w, out); err != nil { + return fmt.Errorf("unable to write to writer: %w", err) + } + return nil } } @@ -346,7 +357,7 @@ func runTUI(path string, content string) error { // Run Bubble Tea program if _, err := ui.NewProgram(cfg, content).Run(); err != nil { - return err + return fmt.Errorf("unable to run tui program: %w", err) } return nil diff --git a/man_cmd.go b/man_cmd.go index 9aa5951..a179ef7 100644 --- a/man_cmd.go +++ b/man_cmd.go @@ -19,9 +19,11 @@ var manCmd = &cobra.Command{ RunE: func(*cobra.Command, []string) error { manPage, err := mcobra.NewManPage(1, rootCmd) if err != nil { - return err + return fmt.Errorf("unable to instantiate man page: %w", err) } - _, err = fmt.Fprint(os.Stdout, manPage.Build(roff.NewDocument())) - return err + if _, err := fmt.Fprint(os.Stdout, manPage.Build(roff.NewDocument())); err != nil { + return fmt.Errorf("unable to build man page: %w", err) + } + return nil }, } diff --git a/ui/editor.go b/ui/editor.go index 5eb2a06..a567c59 100644 --- a/ui/editor.go +++ b/ui/editor.go @@ -11,7 +11,7 @@ func openEditor(path string, lineno int) tea.Cmd { cb := func(err error) tea.Msg { return editorFinishedMsg{err} } - cmd, err := editor.Cmd("Glow", path, editor.OpenAtLine(uint(lineno))) + cmd, err := editor.Cmd("Glow", path, editor.LineNumber(uint(lineno))) //nolint:gosec if err != nil { return func() tea.Msg { return cb(err) } } diff --git a/ui/markdown.go b/ui/markdown.go index 8bafad1..c67b1dc 100644 --- a/ui/markdown.go +++ b/ui/markdown.go @@ -1,6 +1,7 @@ package ui import ( + "fmt" "math" "time" "unicode" @@ -48,7 +49,10 @@ func (m markdown) relativeTime() string { func normalize(in string) (string, error) { t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC) out, _, err := transform.String(t, in) - return out, err + if err != nil { + return "", fmt.Errorf("error normalizing: %w", err) + } + return out, nil } // Return the time in a human-readable format relative to the current time. diff --git a/ui/pager.go b/ui/pager.go index 207fafc..ff067f7 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -317,7 +317,7 @@ func (m pagerModel) statusBarView(b *strings.Builder) { } else { note = m.currentDocument.Note } - note = truncate.StringWithTail(" "+note+" ", uint(max(0, + note = truncate.StringWithTail(" "+note+" ", uint(max(0, //nolint:gosec m.common.width- ansi.PrintableRuneWidth(logo)- ansi.PrintableRuneWidth(scrollPercent)- @@ -415,7 +415,7 @@ func glamourRender(m pagerModel, markdown string) (string, error) { } isCode := !utils.IsMarkdownFile(m.currentDocument.Note) - width := max(0, min(int(m.common.cfg.GlamourMaxWidth), m.viewport.Width)) + width := max(0, min(int(m.common.cfg.GlamourMaxWidth), m.viewport.Width)) //nolint:gosec if isCode { width = 0 } @@ -430,7 +430,7 @@ func glamourRender(m pagerModel, markdown string) (string, error) { } r, err := glamour.NewTermRenderer(options...) if err != nil { - return "", err + return "", fmt.Errorf("error creating glamour renderer: %w", err) } if isCode { @@ -439,7 +439,7 @@ func glamourRender(m pagerModel, markdown string) (string, error) { out, err := r.Render(markdown) if err != nil { - return "", err + return "", fmt.Errorf("error rendering markdown: %w", err) } if isCode { diff --git a/ui/stash.go b/ui/stash.go index 2021966..85b76b5 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -126,7 +126,7 @@ func initSections() { // String returns a styled version of the status message appropriate for the // given context. func (s statusMessage) String() string { - switch s.status { + switch s.status { //nolint:exhaustive case subtleStatusMessage: return dimGreenFg(s.message) case errorStatusMessage: @@ -444,7 +444,7 @@ func (m stashModel) update(msg tea.Msg) (stashModel, tea.Cmd) { } // Updates per the current state - switch m.viewState { + switch m.viewState { //nolint:exhaustive case stashStateReady: cmds = append(cmds, m.handleDocumentBrowsing(msg)) case stashStateShowingError: @@ -596,7 +596,7 @@ func (m *stashModel) handleFiltering(msg tea.Msg) tea.Cmd { var cmds []tea.Cmd // Handle keys - if msg, ok := msg.(tea.KeyMsg); ok { + if msg, ok := msg.(tea.KeyMsg); ok { //nolint:nestif switch msg.String() { case keyEsc: // Cancel filtering @@ -690,7 +690,7 @@ func (m stashModel) view() string { logoOrFilter += " " + m.statusMessage.String() } } - logoOrFilter = truncate.StringWithTail(logoOrFilter, uint(m.common.width-1), ellipsis) + logoOrFilter = truncate.StringWithTail(logoOrFilter, uint(m.common.width-1), ellipsis) //nolint:gosec help, helpHeight := m.helpView() diff --git a/ui/stashitem.go b/ui/stashitem.go index 26e8bb6..0000928 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -17,7 +17,7 @@ const ( func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { var ( - truncateTo = uint(m.common.width - stashViewHorizontalPadding*2) + truncateTo = uint(m.common.width - stashViewHorizontalPadding*2) //nolint:gosec gutter string title = truncate.StringWithTail(md.Note, truncateTo, ellipsis) date = md.relativeTime() @@ -34,7 +34,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { // If there are multiple items being filtered don't highlight a selected // item in the results. If we've filtered down to one item, however, // highlight that first item since pressing return will open it. - if isSelected && !isFiltering || singleFilteredItem { + if isSelected && !isFiltering || singleFilteredItem { //nolint:nestif // Selected item if m.statusMessage == stashingStatusMessage { gutter = greenFg(verticalLine) diff --git a/ui/ui.go b/ui/ui.go index eeda361..3537d3f 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -1,3 +1,4 @@ +// Package ui provides the main UI for the glow application. package ui import ( @@ -120,7 +121,7 @@ func (m *model) unloadDocument() []tea.Cmd { var batch []tea.Cmd if m.pager.viewport.HighPerformanceRendering { - batch = append(batch, tea.ClearScrollArea) + batch = append(batch, tea.ClearScrollArea) //nolint:staticcheck } if !m.stash.shouldSpin() { @@ -234,7 +235,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case "q": var cmd tea.Cmd - switch m.state { + switch m.state { //nolint:exhaustive case stateShowStash: // pass through all keys if we're editing the filter if m.stash.filterState == filtering { @@ -328,7 +329,7 @@ func (m model) View() string { return errorView(m.fatalErr, true) } - switch m.state { + switch m.state { //nolint:exhaustive case stateShowDocument: return m.pager.View() default: @@ -449,17 +450,3 @@ func indent(s string, n int) string { } return b.String() } - -func min(a, b int) int { - if a < b { - return a - } - return b -} - -func max(a, b int) int { - if a > b { - return a - } - return b -} diff --git a/url.go b/url.go index 43ca167..8430d5a 100644 --- a/url.go +++ b/url.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "net/url" "strings" "sync" @@ -44,7 +45,7 @@ func readmeURL(path string) (*source, error) { } u, err := url.Parse(path) if err != nil { - return nil, err + return nil, fmt.Errorf("unable to parse url: %w", err) } switch { diff --git a/utils/utils.go b/utils/utils.go index 8240c36..9f33a1e 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -1,3 +1,4 @@ +// Package utils provides utility functions. package utils import ( @@ -30,7 +31,7 @@ func detectFrontmatter(c []byte) []int { return []int{-1, -1} } -// Expands tilde and all environment variables from the given path. +// ExpandPath expands tilde and all environment variables from the given path. func ExpandPath(path string) string { s, err := homedir.Expand(path) if err == nil { @@ -68,13 +69,13 @@ func IsMarkdownFile(filename string) bool { return false } +// GlamourStyle returns a glamour.TermRendererOption based on the given style. func GlamourStyle(style string, isCode bool) glamour.TermRendererOption { if !isCode { if style == styles.AutoStyle { return glamour.WithAutoStyle() - } else { - return glamour.WithStylePath(style) } + return glamour.WithStylePath(style) } // If we are rendering a pure code block, we need to modify the style to From e8049d79f2c5e38be8a2a5bd0606a0b9e4d18805 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 09:48:19 +0000 Subject: [PATCH 859/911] chore(deps): bump golang.org/x/term from 0.30.0 to 0.31.0 (#739) Bumps [golang.org/x/term](https://github.com/golang/term) from 0.30.0 to 0.31.0. - [Commits](https://github.com/golang/term/compare/v0.30.0...v0.31.0) --- updated-dependencies: - dependency-name: golang.org/x/term dependency-version: 0.31.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 5 +++-- go.sum | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index f0192a3..fb9ff21 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,7 @@ module github.com/charmbracelet/glow/v2 go 1.23.6 + toolchain go1.24.1 require ( @@ -25,8 +26,8 @@ require ( github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.20.1 - golang.org/x/sys v0.31.0 - golang.org/x/term v0.30.0 + golang.org/x/sys v0.32.0 + golang.org/x/term v0.31.0 golang.org/x/text v0.23.0 ) diff --git a/go.sum b/go.sum index faeaa02..efaf0f6 100644 --- a/go.sum +++ b/go.sum @@ -159,10 +159,10 @@ golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From c84a03bbfd88696a76ec206b5f25aeec1621f9e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 09:48:44 +0000 Subject: [PATCH 860/911] chore(deps): bump github.com/fsnotify/fsnotify from 1.8.0 to 1.9.0 (#741) Bumps [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify) from 1.8.0 to 1.9.0. - [Release notes](https://github.com/fsnotify/fsnotify/releases) - [Changelog](https://github.com/fsnotify/fsnotify/blob/main/CHANGELOG.md) - [Commits](https://github.com/fsnotify/fsnotify/compare/v1.8.0...v1.9.0) --- updated-dependencies: - dependency-name: github.com/fsnotify/fsnotify dependency-version: 1.9.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fb9ff21..a2ed85d 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/charmbracelet/log v0.4.1 github.com/charmbracelet/x/editor v0.1.0 github.com/dustin/go-humanize v1.0.1 - github.com/fsnotify/fsnotify v1.8.0 + github.com/fsnotify/fsnotify v1.9.0 github.com/mattn/go-runewidth v0.0.16 github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.3.0 diff --git a/go.sum b/go.sum index efaf0f6..6bac041 100644 --- a/go.sum +++ b/go.sum @@ -48,8 +48,8 @@ github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6 github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= -github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= From d2e04adbfec2977dd582d8b40683b0778c0a7b6e Mon Sep 17 00:00:00 2001 From: Glauber Santana Date: Wed, 9 Apr 2025 10:18:13 -0300 Subject: [PATCH 861/911] fix: tui mode handling of remote urls (#744) --- main.go | 6 +++++- url.go | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index c1643b5..68d7f1c 100644 --- a/main.go +++ b/main.go @@ -327,7 +327,11 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { } return nil case tui || cmd.Flags().Changed("tui"): - return runTUI(src.URL, content) + path := "" + if !isURL(src.URL) { + path = src.URL + } + return runTUI(path, content) default: if _, err = fmt.Fprint(w, out); err != nil { return fmt.Errorf("unable to write to writer: %w", err) diff --git a/url.go b/url.go index 8430d5a..f716681 100644 --- a/url.go +++ b/url.go @@ -79,3 +79,8 @@ func gitlabReadmeURL(path string) *url.URL { u, _ := url.Parse(gitlabURL.String()) return u.JoinPath(path) } + +func isURL(path string) bool { + _, err := url.ParseRequestURI(path) + return err == nil && strings.Contains(path, "://") +} From 2c0e4d878a9f2a0b98452c35020d7e66624d6cde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 09:48:13 +0000 Subject: [PATCH 862/911] chore(deps): bump github.com/charmbracelet/bubbles from 0.20.0 to 0.21.0 (#746) Bumps [github.com/charmbracelet/bubbles](https://github.com/charmbracelet/bubbles) from 0.20.0 to 0.21.0. - [Release notes](https://github.com/charmbracelet/bubbles/releases) - [Changelog](https://github.com/charmbracelet/bubbles/blob/master/.goreleaser.yml) - [Commits](https://github.com/charmbracelet/bubbles/compare/v0.20.0...v0.21.0) --- updated-dependencies: - dependency-name: github.com/charmbracelet/bubbles dependency-version: 0.21.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index a2ed85d..1c584d4 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ toolchain go1.24.1 require ( github.com/atotto/clipboard v0.1.4 github.com/caarlos0/env/v11 v11.3.1 - github.com/charmbracelet/bubbles v0.20.0 + github.com/charmbracelet/bubbles v0.21.0 github.com/charmbracelet/bubbletea v1.3.4 github.com/charmbracelet/glamour v0.9.1 github.com/charmbracelet/lipgloss v1.1.0 diff --git a/go.sum b/go.sum index 6bac041..c0729da 100644 --- a/go.sum +++ b/go.sum @@ -14,8 +14,8 @@ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuP github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5mCA= github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U= -github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE= -github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= +github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs= +github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI= github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= @@ -32,8 +32,8 @@ github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0G github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= github.com/charmbracelet/x/editor v0.1.0 h1:p69/dpvlwRTs9uYiPeAWruwsHqTFzHhTvQOd/WVSX98= github.com/charmbracelet/x/editor v0.1.0/go.mod h1:oivrEbcP/AYt/Hpvk5pwDXXrQ933gQS6UzL6fxqAGSA= -github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b h1:MnAMdlwSltxJyULnrYbkZpp4k58Co7Tah3ciKhSNo0Q= -github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= +github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91 h1:payRxjMjKgx2PaCWLZ4p3ro9y97+TVLZNaRZgJwSVDQ= +github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= From 470fa3d718fd8c968769678e9853c735ff7834d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 09:51:09 +0000 Subject: [PATCH 863/911] chore(deps): bump golang.org/x/text from 0.23.0 to 0.24.0 (#742) Bumps [golang.org/x/text](https://github.com/golang/text) from 0.23.0 to 0.24.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.23.0...v0.24.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-version: 0.24.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 1c584d4..9b2a3cb 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/spf13/viper v1.20.1 golang.org/x/sys v0.32.0 golang.org/x/term v0.31.0 - golang.org/x/text v0.23.0 + golang.org/x/text v0.24.0 ) require ( @@ -70,7 +70,7 @@ require ( go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect golang.org/x/net v0.33.0 // indirect - golang.org/x/sync v0.12.0 // indirect + golang.org/x/sync v0.13.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index c0729da..de31b46 100644 --- a/go.sum +++ b/go.sum @@ -155,16 +155,16 @@ golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuh golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From d6b9ddf34582bc38ceb48463e92bf98af26a0fdd Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 17 Apr 2025 10:08:27 -0300 Subject: [PATCH 864/911] docs: mention snapcraft release on readme (#748) Closes #747 --- README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/README.md b/README.md index 1e2b202..2d630cd 100644 --- a/README.md +++ b/README.md @@ -30,39 +30,64 @@ Git repository. ```bash # macOS or Linux brew install glow +``` +```bash # macOS (with MacPorts) sudo port install glow +``` +```bash # Arch Linux (btw) pacman -S glow +``` +```bash # Void Linux xbps-install -S glow +``` +```bash # Nix shell nix-shell -p glow --command glow +``` +```bash # FreeBSD pkg install glow +``` +```bash # Solus eopkg install glow +``` +```bash # Windows (with Chocolatey, Scoop, or Winget) choco install glow scoop install glow winget install charmbracelet.glow +``` +```bash # Android (with termux) pkg install glow +``` +```bash +# Ubuntu (Snapcraft) +sudo snap install glow +``` + +```bash # Debian/Ubuntu sudo mkdir -p /etc/apt/keyrings curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list sudo apt update && sudo apt install glow +``` +```bash # Fedora/RHEL echo '[charm] name=Charm From 6303d0b7848b9ef42bc9eb0ba0471f94a6ad9632 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 17 Apr 2025 10:38:19 -0300 Subject: [PATCH 865/911] chore(deps): update `golang.org/x/net` with security fixes (#749) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9b2a3cb..22699ae 100644 --- a/go.mod +++ b/go.mod @@ -69,7 +69,7 @@ require ( go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect - golang.org/x/net v0.33.0 // indirect + golang.org/x/net v0.39.0 // indirect golang.org/x/sync v0.13.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index de31b46..a344da2 100644 --- a/go.sum +++ b/go.sum @@ -153,8 +153,8 @@ go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuhGX/+R1ZpfJ4/ia80JM= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= +golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From bb9fcb439beba74127caf2ce7a579b9f483239a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 10:47:08 +0000 Subject: [PATCH 866/911] chore(deps): bump github.com/charmbracelet/glamour from 0.9.1 to 0.10.0 (#753) Bumps [github.com/charmbracelet/glamour](https://github.com/charmbracelet/glamour) from 0.9.1 to 0.10.0. - [Release notes](https://github.com/charmbracelet/glamour/releases) - [Changelog](https://github.com/charmbracelet/glamour/blob/master/.goreleaser.yml) - [Commits](https://github.com/charmbracelet/glamour/compare/v0.9.1...v0.10.0) --- updated-dependencies: - dependency-name: github.com/charmbracelet/glamour dependency-version: 0.10.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 7 ++++--- go.sum | 14 ++++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 22699ae..ade5ca2 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,8 @@ require ( github.com/caarlos0/env/v11 v11.3.1 github.com/charmbracelet/bubbles v0.21.0 github.com/charmbracelet/bubbletea v1.3.4 - github.com/charmbracelet/glamour v0.9.1 - github.com/charmbracelet/lipgloss v1.1.0 + github.com/charmbracelet/glamour v0.10.0 + github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 github.com/charmbracelet/log v0.4.1 github.com/charmbracelet/x/editor v0.1.0 github.com/dustin/go-humanize v1.0.1 @@ -37,7 +37,8 @@ require ( github.com/aymerick/douceur v0.2.0 // indirect github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect github.com/charmbracelet/x/ansi v0.8.0 // indirect - github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect + github.com/charmbracelet/x/cellbuf v0.0.13 // indirect + github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf // indirect github.com/charmbracelet/x/term v0.2.1 // indirect github.com/dlclark/regexp2 v1.11.0 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect diff --git a/go.sum b/go.sum index a344da2..1b7cb5b 100644 --- a/go.sum +++ b/go.sum @@ -20,20 +20,22 @@ github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZ github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= -github.com/charmbracelet/glamour v0.9.1 h1:11dEfiGP8q1BEqvGoIjivuc2rBk+5qEXdPtaQ2WoiCM= -github.com/charmbracelet/glamour v0.9.1/go.mod h1:+SHvIS8qnwhgTpVMiXwn7OfGomSqff1cHBCI8jLOetk= -github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= -github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= +github.com/charmbracelet/glamour v0.10.0 h1:MtZvfwsYCx8jEPFJm3rIBFIMZUfUJ765oX8V6kXldcY= +github.com/charmbracelet/glamour v0.10.0/go.mod h1:f+uf+I/ChNmqo087elLnVdCiVgjSKWuXa/l6NU2ndYk= +github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 h1:ZR7e0ro+SZZiIZD7msJyA+NjkCNNavuiPBLgerbOziE= +github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834/go.mod h1:aKC/t2arECF6rNOnaKaVU6y4t4ZeHQzqfxedE/VkVhA= github.com/charmbracelet/log v0.4.1 h1:6AYnoHKADkghm/vt4neaNEXkxcXLSV2g1rdyFDOpTyk= github.com/charmbracelet/log v0.4.1/go.mod h1:pXgyTsqsVu4N9hGdHmQ0xEA4RsXof402LX9ZgiITn2I= github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= -github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= -github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= +github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= +github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= github.com/charmbracelet/x/editor v0.1.0 h1:p69/dpvlwRTs9uYiPeAWruwsHqTFzHhTvQOd/WVSX98= github.com/charmbracelet/x/editor v0.1.0/go.mod h1:oivrEbcP/AYt/Hpvk5pwDXXrQ933gQS6UzL6fxqAGSA= github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91 h1:payRxjMjKgx2PaCWLZ4p3ro9y97+TVLZNaRZgJwSVDQ= github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= +github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf h1:rLG0Yb6MQSDKdB52aGX55JT1oi0P0Kuaj7wi1bLUpnI= +github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf/go.mod h1:B3UgsnsBZS/eX42BlaNiJkD1pPOUa+oF1IYC6Yd2CEU= github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= From e60e83c6aadb11ba2adb0efa517d5451c7fa846a Mon Sep 17 00:00:00 2001 From: Charm <124303983+charmcli@users.noreply.github.com> Date: Mon, 28 Apr 2025 08:46:31 -0300 Subject: [PATCH 867/911] ci: sync dependabot config (#755) --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index cbc9aa4..63ed01f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -37,5 +37,5 @@ updates: labels: - "dependencies" commit-message: - prefix: "feat" + prefix: "chore" include: "scope" From 76e08e7dce6f4e41424335fd563639ecc8a4845e Mon Sep 17 00:00:00 2001 From: Ktrod Date: Mon, 28 Apr 2025 09:29:49 -0400 Subject: [PATCH 868/911] fix: sync viewport on half page up/down to prevent duplicate strings in render (#756) --- ui/pager.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ui/pager.go b/ui/pager.go index ff067f7..c40c941 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -203,6 +203,18 @@ func (m pagerModel) update(msg tea.Msg) (pagerModel, tea.Cmd) { cmds = append(cmds, viewport.Sync(m.viewport)) } + case "d": + m.viewport.HalfViewDown() + if m.viewport.HighPerformanceRendering { + cmds = append(cmds, viewport.Sync(m.viewport)) + } + + case "u": + m.viewport.HalfViewUp() + if m.viewport.HighPerformanceRendering { + cmds = append(cmds, viewport.Sync(m.viewport)) + } + case "e": lineno := int(math.RoundToEven(float64(m.viewport.TotalLineCount()) * m.viewport.ScrollPercent())) if m.viewport.AtTop() { From 366e9a0d655a820b2b68d02a2fa4558676a93c3b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 09:45:24 +0000 Subject: [PATCH 869/911] chore(deps): bump github.com/charmbracelet/bubbletea from 1.3.4 to 1.3.5 (#758) Bumps [github.com/charmbracelet/bubbletea](https://github.com/charmbracelet/bubbletea) from 1.3.4 to 1.3.5. - [Release notes](https://github.com/charmbracelet/bubbletea/releases) - [Changelog](https://github.com/charmbracelet/bubbletea/blob/main/.goreleaser.yml) - [Commits](https://github.com/charmbracelet/bubbletea/compare/v1.3.4...v1.3.5) --- updated-dependencies: - dependency-name: github.com/charmbracelet/bubbletea dependency-version: 1.3.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ade5ca2..e1353b1 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/atotto/clipboard v0.1.4 github.com/caarlos0/env/v11 v11.3.1 github.com/charmbracelet/bubbles v0.21.0 - github.com/charmbracelet/bubbletea v1.3.4 + github.com/charmbracelet/bubbletea v1.3.5 github.com/charmbracelet/glamour v0.10.0 github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 github.com/charmbracelet/log v0.4.1 diff --git a/go.sum b/go.sum index 1b7cb5b..e683e32 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5m github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U= github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs= github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= -github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI= -github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= +github.com/charmbracelet/bubbletea v1.3.5 h1:JAMNLTbqMOhSwoELIr0qyP4VidFq72/6E9j7HHmRKQc= +github.com/charmbracelet/bubbletea v1.3.5/go.mod h1:TkCnmH+aBd4LrXhXcqrKiYwRs7qyQx5rBgH5fVY3v54= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= github.com/charmbracelet/glamour v0.10.0 h1:MtZvfwsYCx8jEPFJm3rIBFIMZUfUJ765oX8V6kXldcY= From cdeceb9a7f57d335a5c26c44bb2baca7859bcd2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 10:22:45 +0000 Subject: [PATCH 870/911] chore(deps): bump golangci/golangci-lint-action from 7.0.0 to 8.0.0 (#759) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 7.0.0 to 8.0.0. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v7.0.0...v8.0.0) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-version: 8.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 3c38993..7cb4c9c 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: golangci-lint - uses: golangci/golangci-lint-action@v7.0.0 + uses: golangci/golangci-lint-action@v8.0.0 with: # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 From ef85822a000a1a01f9b8f7b84d154b268f75925f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 09:21:02 +0000 Subject: [PATCH 871/911] chore(deps): bump golang.org/x/sys from 0.32.0 to 0.33.0 (#764) Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.32.0 to 0.33.0. - [Commits](https://github.com/golang/sys/compare/v0.32.0...v0.33.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-version: 0.33.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e1353b1..56716b4 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.20.1 - golang.org/x/sys v0.32.0 + golang.org/x/sys v0.33.0 golang.org/x/term v0.31.0 golang.org/x/text v0.24.0 ) diff --git a/go.sum b/go.sum index e683e32..92b0ad5 100644 --- a/go.sum +++ b/go.sum @@ -161,8 +161,8 @@ golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= From 0880dea1be24c0913bf5f69ce3ee87456e7f6edf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 09:21:41 +0000 Subject: [PATCH 872/911] chore(deps): bump golang.org/x/text from 0.24.0 to 0.25.0 (#763) Bumps [golang.org/x/text](https://github.com/golang/text) from 0.24.0 to 0.25.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.24.0...v0.25.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-version: 0.25.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 56716b4..685a122 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/spf13/viper v1.20.1 golang.org/x/sys v0.33.0 golang.org/x/term v0.31.0 - golang.org/x/text v0.24.0 + golang.org/x/text v0.25.0 ) require ( @@ -71,7 +71,7 @@ require ( go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect golang.org/x/net v0.39.0 // indirect - golang.org/x/sync v0.13.0 // indirect + golang.org/x/sync v0.14.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 92b0ad5..d80808f 100644 --- a/go.sum +++ b/go.sum @@ -157,16 +157,16 @@ golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuh golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= -golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= -golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= -golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 5b2dfddcdae884b5892804c15225f00ea63ff965 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 09:25:09 +0000 Subject: [PATCH 873/911] chore(deps): bump golang.org/x/term from 0.31.0 to 0.32.0 (#762) Bumps [golang.org/x/term](https://github.com/golang/term) from 0.31.0 to 0.32.0. - [Commits](https://github.com/golang/term/compare/v0.31.0...v0.32.0) --- updated-dependencies: - dependency-name: golang.org/x/term dependency-version: 0.32.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 685a122..f21ae28 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.20.1 golang.org/x/sys v0.33.0 - golang.org/x/term v0.31.0 + golang.org/x/term v0.32.0 golang.org/x/text v0.25.0 ) diff --git a/go.sum b/go.sum index d80808f..96dc16a 100644 --- a/go.sum +++ b/go.sum @@ -163,8 +163,8 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= -golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= +golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= +golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From ee27edd3b1b3676b3e03b4c87af894eb84b2fa26 Mon Sep 17 00:00:00 2001 From: Markus Billharz <50644328+MarkusBillharz@users.noreply.github.com> Date: Thu, 15 May 2025 00:28:31 +0200 Subject: [PATCH 874/911] fix: handle case when selected md is nil --- ui/stash.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ui/stash.go b/ui/stash.go index 85b76b5..c3739b2 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -518,6 +518,12 @@ func (m *stashModel) handleDocumentBrowsing(msg tea.Msg) tea.Cmd { // Edit document in EDITOR case "e": md := m.selectedMarkdown() + + // In case no file is available + if md == nil { + return nil + } + return openEditor(md.localPath, 0) // Open document From e23f237fb72effb4eb47929d4fa4ace6ba044dfc Mon Sep 17 00:00:00 2001 From: Markus Billharz <50644328+MarkusBillharz@users.noreply.github.com> Date: Thu, 15 May 2025 00:31:23 +0200 Subject: [PATCH 875/911] fix: only show edit if documents are available --- ui/stashhelp.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/stashhelp.go b/ui/stashhelp.go index 01a0458..6c0b474 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -137,7 +137,11 @@ func (m stashModel) helpView() (string, int) { } appHelp = append(appHelp, "r", "refresh") - appHelp = append(appHelp, "e", "edit") + + if numDocs > 0 { + appHelp = append(appHelp, "e", "edit") + } + appHelp = append(appHelp, "q", "quit") // Detailed help From e83c6edf93e8d2e0fdc9585849f478bf6c8ae431 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 09:08:18 +0000 Subject: [PATCH 876/911] chore(deps): bump github.com/charmbracelet/log from 0.4.1 to 0.4.2 (#769) Bumps [github.com/charmbracelet/log](https://github.com/charmbracelet/log) from 0.4.1 to 0.4.2. - [Release notes](https://github.com/charmbracelet/log/releases) - [Commits](https://github.com/charmbracelet/log/compare/v0.4.1...v0.4.2) --- updated-dependencies: - dependency-name: github.com/charmbracelet/log dependency-version: 0.4.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f21ae28..9e07753 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/charmbracelet/bubbletea v1.3.5 github.com/charmbracelet/glamour v0.10.0 github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 - github.com/charmbracelet/log v0.4.1 + github.com/charmbracelet/log v0.4.2 github.com/charmbracelet/x/editor v0.1.0 github.com/dustin/go-humanize v1.0.1 github.com/fsnotify/fsnotify v1.9.0 diff --git a/go.sum b/go.sum index 96dc16a..d9bcf83 100644 --- a/go.sum +++ b/go.sum @@ -24,8 +24,8 @@ github.com/charmbracelet/glamour v0.10.0 h1:MtZvfwsYCx8jEPFJm3rIBFIMZUfUJ765oX8V github.com/charmbracelet/glamour v0.10.0/go.mod h1:f+uf+I/ChNmqo087elLnVdCiVgjSKWuXa/l6NU2ndYk= github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 h1:ZR7e0ro+SZZiIZD7msJyA+NjkCNNavuiPBLgerbOziE= github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834/go.mod h1:aKC/t2arECF6rNOnaKaVU6y4t4ZeHQzqfxedE/VkVhA= -github.com/charmbracelet/log v0.4.1 h1:6AYnoHKADkghm/vt4neaNEXkxcXLSV2g1rdyFDOpTyk= -github.com/charmbracelet/log v0.4.1/go.mod h1:pXgyTsqsVu4N9hGdHmQ0xEA4RsXof402LX9ZgiITn2I= +github.com/charmbracelet/log v0.4.2 h1:hYt8Qj6a8yLnvR+h7MwsJv/XvmBJXiueUcI3cIxsyig= +github.com/charmbracelet/log v0.4.2/go.mod h1:qifHGX/tc7eluv2R6pWIpyHDDrrb/AG71Pf2ysQu5nw= github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= From d37e9887875a2faa4baee6a7d090eb357dd63771 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Fri, 30 May 2025 09:58:41 -0300 Subject: [PATCH 877/911] chore(deps): update x/net Signed-off-by: Carlos Alexandro Becker --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9e07753..21316e3 100644 --- a/go.mod +++ b/go.mod @@ -70,7 +70,7 @@ require ( go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect - golang.org/x/net v0.39.0 // indirect + golang.org/x/net v0.40.0 // indirect golang.org/x/sync v0.14.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index d9bcf83..2038f75 100644 --- a/go.sum +++ b/go.sum @@ -155,8 +155,8 @@ go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuhGX/+R1ZpfJ4/ia80JM= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From e54618ef13963dd58e43fee87a1db7a9ad182993 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 08:52:12 -0300 Subject: [PATCH 878/911] ci: sync golangci-lint config (#777) Co-authored-by: andreynering <7011819+andreynering@users.noreply.github.com> --- .golangci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.golangci.yml b/.golangci.yml index be61d89..4fac29c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -7,7 +7,6 @@ linters: - exhaustive - goconst - godot - - godox - gomoddirectives - goprintffuncname - gosec From bcd1296ce5e14b8a45b2ffd243eb014a19bb0a3c Mon Sep 17 00:00:00 2001 From: Prithvi Jethwa <42164574+prithvijj@users.noreply.github.com> Date: Wed, 4 Jun 2025 13:41:27 -0400 Subject: [PATCH 879/911] fix: allow config file to load `showLineNumbers` (#653) --- README.md | 4 ++++ main.go | 1 + 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 2d630cd..420e01b 100644 --- a/README.md +++ b/README.md @@ -209,6 +209,10 @@ pager: true width: 80 # show all files, including hidden and ignored. all: false +# show line numbers (TUI-mode only) +showLineNumbers: false +# preserve newlines in the output +preserveNewLines: false ``` ## Feedback diff --git a/main.go b/main.go index 68d7f1c..b0d7a77 100644 --- a/main.go +++ b/main.go @@ -170,6 +170,7 @@ func validateOptions(cmd *cobra.Command) error { tui = viper.GetBool("tui") showAllFiles = viper.GetBool("all") preserveNewLines = viper.GetBool("preserveNewLines") + showLineNumbers = viper.GetBool("showLineNumbers") if pager && tui { return errors.New("cannot use both pager and tui") From 3079ce20b9e3b7892853bd0b74196c1038540aca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Jun 2025 09:49:18 +0000 Subject: [PATCH 880/911] chore(deps): bump golang.org/x/text from 0.25.0 to 0.26.0 (#779) Bumps [golang.org/x/text](https://github.com/golang/text) from 0.25.0 to 0.26.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.25.0...v0.26.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-version: 0.26.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 21316e3..97cfc60 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/spf13/viper v1.20.1 golang.org/x/sys v0.33.0 golang.org/x/term v0.32.0 - golang.org/x/text v0.25.0 + golang.org/x/text v0.26.0 ) require ( @@ -71,7 +71,7 @@ require ( go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect golang.org/x/net v0.40.0 // indirect - golang.org/x/sync v0.14.0 // indirect + golang.org/x/sync v0.15.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 2038f75..a45e752 100644 --- a/go.sum +++ b/go.sum @@ -157,16 +157,16 @@ golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuh golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= -golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= -golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= -golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From a6ed0f243017d716568852b99bcb34adc7f91d3e Mon Sep 17 00:00:00 2001 From: bashbunni <15822994+bashbunni@users.noreply.github.com> Date: Wed, 11 Jun 2025 04:16:46 -0700 Subject: [PATCH 881/911] docs: add contribution guidelines (#781) --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 420e01b..d98b0a0 100644 --- a/README.md +++ b/README.md @@ -215,6 +215,12 @@ showLineNumbers: false preserveNewLines: false ``` +## Contributing + +See [contributing][contribute]. + +[contribute]: https://github.com/charmbracelet/glow/contribute + ## Feedback We’d love to hear your thoughts on this project. Feel free to drop us a note! From 9240ab462519ddff846bbae93646e199151a29cc Mon Sep 17 00:00:00 2001 From: one230six <163239332+one230six@users.noreply.github.com> Date: Thu, 12 Jun 2025 14:25:33 +0100 Subject: [PATCH 882/911] docs: remove redundant word in comment (#782) --- ui/pager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pager.go b/ui/pager.go index c40c941..5c522e7 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -150,7 +150,7 @@ type pagerStatusMessage struct { } // Perform stuff that needs to happen after a successful markdown stash. Note -// that the the returned command should be sent back the through the pager +// that the returned command should be sent back the through the pager // update function. func (m *pagerModel) showStatusMessage(msg pagerStatusMessage) tea.Cmd { // Show a success message to the user From 18a739c09127617baa54498bed6385c550de6bee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 11:24:38 +0000 Subject: [PATCH 883/911] chore(deps): bump golang.org/x/text from 0.26.0 to 0.27.0 (#795) Bumps [golang.org/x/text](https://github.com/golang/text) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-version: 0.27.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 97cfc60..97f49b4 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/spf13/viper v1.20.1 golang.org/x/sys v0.33.0 golang.org/x/term v0.32.0 - golang.org/x/text v0.26.0 + golang.org/x/text v0.27.0 ) require ( @@ -71,7 +71,7 @@ require ( go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect golang.org/x/net v0.40.0 // indirect - golang.org/x/sync v0.15.0 // indirect + golang.org/x/sync v0.16.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index a45e752..5ce29e2 100644 --- a/go.sum +++ b/go.sum @@ -157,16 +157,16 @@ golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuh golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 66b389ef17c8621e9b4909ec63f6de5e32d06ce8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 11:50:28 +0000 Subject: [PATCH 884/911] chore(deps): bump golang.org/x/sys from 0.33.0 to 0.34.0 (#796) Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.33.0 to 0.34.0. - [Commits](https://github.com/golang/sys/compare/v0.33.0...v0.34.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-version: 0.34.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 97f49b4..01438f7 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.20.1 - golang.org/x/sys v0.33.0 + golang.org/x/sys v0.34.0 golang.org/x/term v0.32.0 golang.org/x/text v0.27.0 ) diff --git a/go.sum b/go.sum index 5ce29e2..3e185f3 100644 --- a/go.sum +++ b/go.sum @@ -161,8 +161,8 @@ golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= From 0e76788a6a2184948902eae768ad8d890b1bd946 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:20:32 +0000 Subject: [PATCH 885/911] chore(deps): bump github.com/charmbracelet/bubbletea from 1.3.5 to 1.3.6 (#797) Bumps [github.com/charmbracelet/bubbletea](https://github.com/charmbracelet/bubbletea) from 1.3.5 to 1.3.6. - [Release notes](https://github.com/charmbracelet/bubbletea/releases) - [Changelog](https://github.com/charmbracelet/bubbletea/blob/main/.goreleaser.yml) - [Commits](https://github.com/charmbracelet/bubbletea/compare/v1.3.5...v1.3.6) --- updated-dependencies: - dependency-name: github.com/charmbracelet/bubbletea dependency-version: 1.3.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 01438f7..f6a8308 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/atotto/clipboard v0.1.4 github.com/caarlos0/env/v11 v11.3.1 github.com/charmbracelet/bubbles v0.21.0 - github.com/charmbracelet/bubbletea v1.3.5 + github.com/charmbracelet/bubbletea v1.3.6 github.com/charmbracelet/glamour v0.10.0 github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 github.com/charmbracelet/log v0.4.2 @@ -36,7 +36,7 @@ require ( github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect - github.com/charmbracelet/x/ansi v0.8.0 // indirect + github.com/charmbracelet/x/ansi v0.9.3 // indirect github.com/charmbracelet/x/cellbuf v0.0.13 // indirect github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf // indirect github.com/charmbracelet/x/term v0.2.1 // indirect diff --git a/go.sum b/go.sum index 3e185f3..6e504be 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5m github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U= github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs= github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= -github.com/charmbracelet/bubbletea v1.3.5 h1:JAMNLTbqMOhSwoELIr0qyP4VidFq72/6E9j7HHmRKQc= -github.com/charmbracelet/bubbletea v1.3.5/go.mod h1:TkCnmH+aBd4LrXhXcqrKiYwRs7qyQx5rBgH5fVY3v54= +github.com/charmbracelet/bubbletea v1.3.6 h1:VkHIxPJQeDt0aFJIsVxw8BQdh/F/L2KKZGsK6et5taU= +github.com/charmbracelet/bubbletea v1.3.6/go.mod h1:oQD9VCRQFF8KplacJLo28/jofOI2ToOfGYeFgBBxHOc= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= github.com/charmbracelet/glamour v0.10.0 h1:MtZvfwsYCx8jEPFJm3rIBFIMZUfUJ765oX8V6kXldcY= @@ -26,8 +26,8 @@ github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 h1:ZR7e0r github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834/go.mod h1:aKC/t2arECF6rNOnaKaVU6y4t4ZeHQzqfxedE/VkVhA= github.com/charmbracelet/log v0.4.2 h1:hYt8Qj6a8yLnvR+h7MwsJv/XvmBJXiueUcI3cIxsyig= github.com/charmbracelet/log v0.4.2/go.mod h1:qifHGX/tc7eluv2R6pWIpyHDDrrb/AG71Pf2ysQu5nw= -github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= -github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= +github.com/charmbracelet/x/ansi v0.9.3 h1:BXt5DHS/MKF+LjuK4huWrC6NCvHtexww7dMayh6GXd0= +github.com/charmbracelet/x/ansi v0.9.3/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE= github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= github.com/charmbracelet/x/editor v0.1.0 h1:p69/dpvlwRTs9uYiPeAWruwsHqTFzHhTvQOd/WVSX98= From e010ed866e39e0a704bf889dbfeb919008ca563c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:23:28 +0000 Subject: [PATCH 886/911] chore(deps): bump golang.org/x/term from 0.32.0 to 0.33.0 (#798) Bumps [golang.org/x/term](https://github.com/golang/term) from 0.32.0 to 0.33.0. - [Commits](https://github.com/golang/term/compare/v0.32.0...v0.33.0) --- updated-dependencies: - dependency-name: golang.org/x/term dependency-version: 0.33.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f6a8308..619520c 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.20.1 golang.org/x/sys v0.34.0 - golang.org/x/term v0.32.0 + golang.org/x/term v0.33.0 golang.org/x/text v0.27.0 ) diff --git a/go.sum b/go.sum index 6e504be..201d041 100644 --- a/go.sum +++ b/go.sum @@ -163,8 +163,8 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= -golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= +golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From bf0a9b4d3d117db91ceb2feb81f60a8ae8f14f7e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 08:23:51 -0400 Subject: [PATCH 887/911] ci: sync golangci-lint config (#808) Co-authored-by: andreynering <7011819+andreynering@users.noreply.github.com> --- .golangci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.golangci.yml b/.golangci.yml index 4fac29c..929cb0a 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -26,6 +26,10 @@ linters: - whitespace - wrapcheck exclusions: + rules: + - text: '(slog|log)\.\w+' + linters: + - noctx generated: lax presets: - common-false-positives From e61f329428589ec0952c40767df2d68c97fff4b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Aug 2025 10:55:11 -0300 Subject: [PATCH 888/911] chore(deps): bump actions/checkout from 4 to 5 (#813) Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/coverage.yml | 2 +- .github/workflows/lint.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index f82e3d0..031b007 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -8,7 +8,7 @@ jobs: GO111MODULE: "on" steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Go uses: actions/setup-go@v5 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 7cb4c9c..bcfb79c 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,7 +8,7 @@ jobs: name: lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: golangci-lint uses: golangci/golangci-lint-action@v8.0.0 with: From deaa57fe00213fdcff1be6d1b3786d6f23e9b822 Mon Sep 17 00:00:00 2001 From: Charm <124303983+charmcli@users.noreply.github.com> Date: Tue, 26 Aug 2025 13:04:08 -0300 Subject: [PATCH 889/911] ci: sync dependabot config (#817) --- .github/dependabot.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 63ed01f..271179a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -13,6 +13,10 @@ updates: commit-message: prefix: "chore" include: "scope" + groups: + all: + patterns: + - "*" - package-ecosystem: "github-actions" directory: "/" @@ -26,6 +30,10 @@ updates: commit-message: prefix: "chore" include: "scope" + groups: + all: + patterns: + - "*" - package-ecosystem: "docker" directory: "/" @@ -39,3 +47,7 @@ updates: commit-message: prefix: "chore" include: "scope" + groups: + all: + patterns: + - "*" From 9432fd920c7b53d51323254481bc872c285720bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Aug 2025 13:33:59 -0300 Subject: [PATCH 890/911] chore(deps): bump the all group with 3 updates (#818) Bumps the all group with 3 updates: [golang.org/x/sys](https://github.com/golang/sys), [golang.org/x/term](https://github.com/golang/term) and [golang.org/x/text](https://github.com/golang/text). Updates `golang.org/x/sys` from 0.34.0 to 0.35.0 - [Commits](https://github.com/golang/sys/compare/v0.34.0...v0.35.0) Updates `golang.org/x/term` from 0.33.0 to 0.34.0 - [Commits](https://github.com/golang/term/compare/v0.33.0...v0.34.0) Updates `golang.org/x/text` from 0.27.0 to 0.28.0 - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.27.0...v0.28.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-version: 0.35.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: golang.org/x/term dependency-version: 0.34.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: golang.org/x/text dependency-version: 0.28.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 619520c..1a8108e 100644 --- a/go.mod +++ b/go.mod @@ -26,9 +26,9 @@ require ( github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.20.1 - golang.org/x/sys v0.34.0 - golang.org/x/term v0.33.0 - golang.org/x/text v0.27.0 + golang.org/x/sys v0.35.0 + golang.org/x/term v0.34.0 + golang.org/x/text v0.28.0 ) require ( diff --git a/go.sum b/go.sum index 201d041..826da66 100644 --- a/go.sum +++ b/go.sum @@ -161,12 +161,12 @@ golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= -golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= -golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= -golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= -golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 901b99931e1610623baabf62abccbb1a46fc3985 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 09:30:47 -0300 Subject: [PATCH 891/911] chore(deps): bump the all group with 5 updates (#820) Bumps the all group with 5 updates: | Package | From | To | | --- | --- | --- | | [github.com/charmbracelet/bubbletea](https://github.com/charmbracelet/bubbletea) | `1.3.6` | `1.3.7` | | [github.com/spf13/cobra](https://github.com/spf13/cobra) | `1.9.1` | `1.10.1` | | [golang.org/x/sys](https://github.com/golang/sys) | `0.35.0` | `0.36.0` | | [golang.org/x/term](https://github.com/golang/term) | `0.34.0` | `0.35.0` | | [golang.org/x/text](https://github.com/golang/text) | `0.28.0` | `0.29.0` | Updates `github.com/charmbracelet/bubbletea` from 1.3.6 to 1.3.7 - [Release notes](https://github.com/charmbracelet/bubbletea/releases) - [Changelog](https://github.com/charmbracelet/bubbletea/blob/main/.goreleaser.yml) - [Commits](https://github.com/charmbracelet/bubbletea/compare/v1.3.6...v1.3.7) Updates `github.com/spf13/cobra` from 1.9.1 to 1.10.1 - [Release notes](https://github.com/spf13/cobra/releases) - [Commits](https://github.com/spf13/cobra/compare/v1.9.1...v1.10.1) Updates `golang.org/x/sys` from 0.35.0 to 0.36.0 - [Commits](https://github.com/golang/sys/compare/v0.35.0...v0.36.0) Updates `golang.org/x/term` from 0.34.0 to 0.35.0 - [Commits](https://github.com/golang/term/compare/v0.34.0...v0.35.0) Updates `golang.org/x/text` from 0.28.0 to 0.29.0 - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.28.0...v0.29.0) --- updated-dependencies: - dependency-name: github.com/charmbracelet/bubbletea dependency-version: 1.3.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/spf13/cobra dependency-version: 1.10.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: golang.org/x/sys dependency-version: 0.36.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: golang.org/x/term dependency-version: 0.35.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: golang.org/x/text dependency-version: 0.29.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 17 ++++++++--------- go.sum | 30 ++++++++++++++---------------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/go.mod b/go.mod index 1a8108e..c19e837 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/charmbracelet/glow/v2 -go 1.23.6 +go 1.24.0 toolchain go1.24.1 @@ -8,7 +8,7 @@ require ( github.com/atotto/clipboard v0.1.4 github.com/caarlos0/env/v11 v11.3.1 github.com/charmbracelet/bubbles v0.21.0 - github.com/charmbracelet/bubbletea v1.3.6 + github.com/charmbracelet/bubbletea v1.3.7 github.com/charmbracelet/glamour v0.10.0 github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 github.com/charmbracelet/log v0.4.2 @@ -24,11 +24,11 @@ require ( github.com/muesli/roff v0.1.0 github.com/muesli/termenv v0.16.0 github.com/sahilm/fuzzy v0.1.1 - github.com/spf13/cobra v1.9.1 + github.com/spf13/cobra v1.10.1 github.com/spf13/viper v1.20.1 - golang.org/x/sys v0.35.0 - golang.org/x/term v0.34.0 - golang.org/x/text v0.28.0 + golang.org/x/sys v0.36.0 + golang.org/x/term v0.35.0 + golang.org/x/text v0.29.0 ) require ( @@ -36,7 +36,7 @@ require ( github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect - github.com/charmbracelet/x/ansi v0.9.3 // indirect + github.com/charmbracelet/x/ansi v0.10.1 // indirect github.com/charmbracelet/x/cellbuf v0.0.13 // indirect github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf // indirect github.com/charmbracelet/x/term v0.2.1 // indirect @@ -62,7 +62,7 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/pflag v1.0.9 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/yuin/goldmark v1.7.8 // indirect @@ -71,7 +71,6 @@ require ( go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect golang.org/x/net v0.40.0 // indirect - golang.org/x/sync v0.16.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 826da66..2e06a3a 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5m github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U= github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs= github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= -github.com/charmbracelet/bubbletea v1.3.6 h1:VkHIxPJQeDt0aFJIsVxw8BQdh/F/L2KKZGsK6et5taU= -github.com/charmbracelet/bubbletea v1.3.6/go.mod h1:oQD9VCRQFF8KplacJLo28/jofOI2ToOfGYeFgBBxHOc= +github.com/charmbracelet/bubbletea v1.3.7 h1:FNaEEFEenOEPnZsY9MI64thl2c84MI66+1QaQbxGOl4= +github.com/charmbracelet/bubbletea v1.3.7/go.mod h1:PEOcbQCNzJ2BYUd484kHPO5g3kLO28IffOdFeI2EWus= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= github.com/charmbracelet/glamour v0.10.0 h1:MtZvfwsYCx8jEPFJm3rIBFIMZUfUJ765oX8V6kXldcY= @@ -26,8 +26,8 @@ github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 h1:ZR7e0r github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834/go.mod h1:aKC/t2arECF6rNOnaKaVU6y4t4ZeHQzqfxedE/VkVhA= github.com/charmbracelet/log v0.4.2 h1:hYt8Qj6a8yLnvR+h7MwsJv/XvmBJXiueUcI3cIxsyig= github.com/charmbracelet/log v0.4.2/go.mod h1:qifHGX/tc7eluv2R6pWIpyHDDrrb/AG71Pf2ysQu5nw= -github.com/charmbracelet/x/ansi v0.9.3 h1:BXt5DHS/MKF+LjuK4huWrC6NCvHtexww7dMayh6GXd0= -github.com/charmbracelet/x/ansi v0.9.3/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE= +github.com/charmbracelet/x/ansi v0.10.1 h1:rL3Koar5XvX0pHGfovN03f5cxLbCF2YvLeyz7D2jVDQ= +github.com/charmbracelet/x/ansi v0.10.1/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE= github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= github.com/charmbracelet/x/editor v0.1.0 h1:p69/dpvlwRTs9uYiPeAWruwsHqTFzHhTvQOd/WVSX98= @@ -129,10 +129,10 @@ github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= +github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -157,16 +157,14 @@ golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuh golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= -golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= +golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= +golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 963219b96eb8aea74f9d2b1683856aae111ba497 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Mon, 8 Sep 2025 09:35:05 -0300 Subject: [PATCH 892/911] security: bump `mapstructure` module with security fixes (#822) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c19e837..ca4c526 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( github.com/dlclark/regexp2 v1.11.0 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/gorilla/css v1.0.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect diff --git a/go.sum b/go.sum index 2e06a3a..9627578 100644 --- a/go.sum +++ b/go.sum @@ -54,8 +54,8 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= -github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= From 1c32d1377c08191dbcdf99ebd5f7fad1b49fa261 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 10:14:37 -0400 Subject: [PATCH 893/911] chore(deps): bump actions/setup-go from 5 to 6 in the all group (#821) Bumps the all group with 1 update: [actions/setup-go](https://github.com/actions/setup-go). Updates `actions/setup-go` from 5 to 6 - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/setup-go dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 031b007..1105fa2 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -11,7 +11,7 @@ jobs: uses: actions/checkout@v5 - name: Install Go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version: stable From a440b3319bc466be6d249c564d0c5f43fe14da57 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 09:24:52 +0000 Subject: [PATCH 894/911] chore(deps): bump the all group with 3 updates (#824) Bumps the all group with 3 updates: [github.com/charmbracelet/bubbletea](https://github.com/charmbracelet/bubbletea), [github.com/muesli/mango-cobra](https://github.com/muesli/mango-cobra) and [github.com/spf13/viper](https://github.com/spf13/viper). Updates `github.com/charmbracelet/bubbletea` from 1.3.7 to 1.3.9 - [Release notes](https://github.com/charmbracelet/bubbletea/releases) - [Changelog](https://github.com/charmbracelet/bubbletea/blob/main/.goreleaser.yml) - [Commits](https://github.com/charmbracelet/bubbletea/compare/v1.3.7...v1.3.9) Updates `github.com/muesli/mango-cobra` from 1.2.0 to 1.3.0 - [Release notes](https://github.com/muesli/mango-cobra/releases) - [Commits](https://github.com/muesli/mango-cobra/compare/v1.2.0...v1.3.0) Updates `github.com/spf13/viper` from 1.20.1 to 1.21.0 - [Release notes](https://github.com/spf13/viper/releases) - [Commits](https://github.com/spf13/viper/compare/v1.20.1...v1.21.0) --- updated-dependencies: - dependency-name: github.com/charmbracelet/bubbletea dependency-version: 1.3.9 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: github.com/muesli/mango-cobra dependency-version: 1.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: github.com/spf13/viper dependency-version: 1.21.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 24 +++++++++++------------- go.sum | 50 ++++++++++++++++++++++++-------------------------- 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/go.mod b/go.mod index ca4c526..f756426 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/atotto/clipboard v0.1.4 github.com/caarlos0/env/v11 v11.3.1 github.com/charmbracelet/bubbles v0.21.0 - github.com/charmbracelet/bubbletea v1.3.7 + github.com/charmbracelet/bubbletea v1.3.9 github.com/charmbracelet/glamour v0.10.0 github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 github.com/charmbracelet/log v0.4.2 @@ -19,13 +19,13 @@ require ( github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.3.0 github.com/muesli/go-app-paths v0.2.2 - github.com/muesli/mango-cobra v1.2.0 + github.com/muesli/mango-cobra v1.3.0 github.com/muesli/reflow v0.3.0 github.com/muesli/roff v0.1.0 github.com/muesli/termenv v0.16.0 github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.10.1 - github.com/spf13/viper v1.20.1 + github.com/spf13/viper v1.21.0 golang.org/x/sys v0.36.0 golang.org/x/term v0.35.0 golang.org/x/text v0.29.0 @@ -52,25 +52,23 @@ require ( github.com/microcosm-cc/bluemonday v1.0.27 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect - github.com/muesli/mango v0.1.0 // indirect + github.com/muesli/mango v0.2.0 // indirect github.com/muesli/mango-pflag v0.1.0 // indirect - github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 // indirect - github.com/sagikazarmark/locafero v0.7.0 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.12.0 // indirect - github.com/spf13/cast v1.7.1 // indirect - github.com/spf13/pflag v1.0.9 // indirect + github.com/sagikazarmark/locafero v0.11.0 // indirect + github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect + github.com/spf13/afero v1.15.0 // indirect + github.com/spf13/cast v1.10.0 // indirect + github.com/spf13/pflag v1.0.10 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/yuin/goldmark v1.7.8 // indirect github.com/yuin/goldmark-emoji v1.0.5 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.9.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect golang.org/x/net v0.40.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 9627578..f7ed869 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5m github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U= github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs= github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= -github.com/charmbracelet/bubbletea v1.3.7 h1:FNaEEFEenOEPnZsY9MI64thl2c84MI66+1QaQbxGOl4= -github.com/charmbracelet/bubbletea v1.3.7/go.mod h1:PEOcbQCNzJ2BYUd484kHPO5g3kLO28IffOdFeI2EWus= +github.com/charmbracelet/bubbletea v1.3.9 h1:OBYdfRo6QnlIcXNmcoI2n1NNS65Nk6kI2L2FO1puS/4= +github.com/charmbracelet/bubbletea v1.3.9/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= github.com/charmbracelet/glamour v0.10.0 h1:MtZvfwsYCx8jEPFJm3rIBFIMZUfUJ765oX8V6kXldcY= @@ -94,10 +94,10 @@ github.com/muesli/gitcha v0.3.0 h1:+PJkVKrDXVB0VgRn/yVx2CqSVSDGMSepzvohsCrPYtQ= github.com/muesli/gitcha v0.3.0/go.mod h1:vX3jFL+XcEUq1uY74RCjLSZfAV+ZuvLg70/NGPdXn84= github.com/muesli/go-app-paths v0.2.2 h1:NqG4EEZwNIhBq/pREgfBmgDmt3h1Smr1MjZiXbpZUnI= github.com/muesli/go-app-paths v0.2.2/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= -github.com/muesli/mango v0.1.0 h1:DZQK45d2gGbql1arsYA4vfg4d7I9Hfx5rX/GCmzsAvI= -github.com/muesli/mango v0.1.0/go.mod h1:5XFpbC8jY5UUv89YQciiXNlbi+iJgt29VDC5xbzrLL4= -github.com/muesli/mango-cobra v1.2.0 h1:DQvjzAM0PMZr85Iv9LIMaYISpTOliMEg+uMFtNbYvWg= -github.com/muesli/mango-cobra v1.2.0/go.mod h1:vMJL54QytZAJhCT13LPVDfkvCUJ5/4jNUKF/8NC2UjA= +github.com/muesli/mango v0.2.0 h1:iNNc0c5VLQ6fsMgAqGQofByNUBH2Q2nEbD6TaI+5yyQ= +github.com/muesli/mango v0.2.0/go.mod h1:5XFpbC8jY5UUv89YQciiXNlbi+iJgt29VDC5xbzrLL4= +github.com/muesli/mango-cobra v1.3.0 h1:vQy5GvPg3ndOSpduxutqFoINhWk3vD5K2dXo5E8pqec= +github.com/muesli/mango-cobra v1.3.0/go.mod h1:Cj1ZrBu3806Qw7UjxnAUgE+7tllUBj1NCLQDwwGx19E= github.com/muesli/mango-pflag v0.1.0 h1:UADqbYgpUyRoBja3g6LUL+3LErjpsOwaC9ywvBWe7Sg= github.com/muesli/mango-pflag v0.1.0/go.mod h1:YEQomTxaCUp8PrbhFh10UfbhbQrM/xJ4i2PB8VTLLW0= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= @@ -106,8 +106,8 @@ github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8= github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig= github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= -github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= -github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -119,27 +119,27 @@ github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= -github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= -github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= +github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= +github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/sahilm/fuzzy v0.1.1 h1:ceu5RHF8DGgoi+/dR5PsECjCDH1BE3Fnmpo7aVXOdRA= github.com/sahilm/fuzzy v0.1.1/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= -github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= -github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= -github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= -github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= -github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= @@ -149,10 +149,8 @@ github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark-emoji v1.0.5 h1:EMVWyCGPlXJfUXBXpuMu+ii3TIaxbVBnEX9uaDC4cIk= github.com/yuin/goldmark-emoji v1.0.5/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuhGX/+R1ZpfJ4/ia80JM= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= From 677fcb3eeeed5bad3ba6b18ef1fa742aee732568 Mon Sep 17 00:00:00 2001 From: Nathan Cain <13713501+nathanscain@users.noreply.github.com> Date: Fri, 20 Dec 2024 13:36:27 -0600 Subject: [PATCH 895/911] bump install with go path to v2 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d98b0a0..cf3bb15 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ packages. ARM builds are also available for macOS, Linux, FreeBSD and OpenBSD. Or just install it with `go`: ```bash -go install github.com/charmbracelet/glow@latest +go install github.com/charmbracelet/glow/v2@latest ``` ### Build (requires Go 1.21+) From 1afeed4c5665579943c092e59cda76ed497568c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 09:14:29 +0000 Subject: [PATCH 896/911] chore(deps): bump github.com/charmbracelet/bubbletea in the all group (#827) Bumps the all group with 1 update: [github.com/charmbracelet/bubbletea](https://github.com/charmbracelet/bubbletea). Updates `github.com/charmbracelet/bubbletea` from 1.3.9 to 1.3.10 - [Release notes](https://github.com/charmbracelet/bubbletea/releases) - [Changelog](https://github.com/charmbracelet/bubbletea/blob/main/.goreleaser.yml) - [Commits](https://github.com/charmbracelet/bubbletea/compare/v1.3.9...v1.3.10) --- updated-dependencies: - dependency-name: github.com/charmbracelet/bubbletea dependency-version: 1.3.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f756426..ee17ca8 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/atotto/clipboard v0.1.4 github.com/caarlos0/env/v11 v11.3.1 github.com/charmbracelet/bubbles v0.21.0 - github.com/charmbracelet/bubbletea v1.3.9 + github.com/charmbracelet/bubbletea v1.3.10 github.com/charmbracelet/glamour v0.10.0 github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 github.com/charmbracelet/log v0.4.2 diff --git a/go.sum b/go.sum index f7ed869..e836799 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5m github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U= github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs= github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= -github.com/charmbracelet/bubbletea v1.3.9 h1:OBYdfRo6QnlIcXNmcoI2n1NNS65Nk6kI2L2FO1puS/4= -github.com/charmbracelet/bubbletea v1.3.9/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4= +github.com/charmbracelet/bubbletea v1.3.10 h1:otUDHWMMzQSB0Pkc87rm691KZ3SWa4KUlvF9nRvCICw= +github.com/charmbracelet/bubbletea v1.3.10/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= github.com/charmbracelet/glamour v0.10.0 h1:MtZvfwsYCx8jEPFJm3rIBFIMZUfUJ765oX8V6kXldcY= From f9ec6882c1da20b3f0cd088d56326213a9e2d59d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Sep 2025 10:41:25 +0000 Subject: [PATCH 897/911] chore(deps): bump github.com/mattn/go-runewidth in the all group (#828) Bumps the all group with 1 update: [github.com/mattn/go-runewidth](https://github.com/mattn/go-runewidth). Updates `github.com/mattn/go-runewidth` from 0.0.16 to 0.0.17 - [Commits](https://github.com/mattn/go-runewidth/compare/v0.0.16...v0.0.17) --- updated-dependencies: - dependency-name: github.com/mattn/go-runewidth dependency-version: 0.0.17 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ee17ca8..82392fb 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/charmbracelet/x/editor v0.1.0 github.com/dustin/go-humanize v1.0.1 github.com/fsnotify/fsnotify v1.9.0 - github.com/mattn/go-runewidth v0.0.16 + github.com/mattn/go-runewidth v0.0.17 github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.3.0 github.com/muesli/go-app-paths v0.2.2 diff --git a/go.sum b/go.sum index e836799..6e3b8cd 100644 --- a/go.sum +++ b/go.sum @@ -80,8 +80,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.17 h1:78v8ZlW0bP43XfmAfPsdXcoNCelfMHsDmd/pkENfrjQ= +github.com/mattn/go-runewidth v0.0.17/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= From 36bf1711bf424310716937eb091537509d4b9a40 Mon Sep 17 00:00:00 2001 From: Charm <124303983+charmcli@users.noreply.github.com> Date: Sun, 5 Oct 2025 12:30:25 -0300 Subject: [PATCH 898/911] ci: sync dependabot config (#831) --- .github/dependabot.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 271179a..d944991 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -17,6 +17,10 @@ updates: all: patterns: - "*" + ignore: + - dependency-name: github.com/charmbracelet/bubbletea/v2 + versions: + - v2.0.0-beta1 - package-ecosystem: "github-actions" directory: "/" From 283d20b83c21514cfe35aba0d2d5fdfb1badf4c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Oct 2025 15:39:22 +0000 Subject: [PATCH 899/911] chore(deps): bump github.com/mattn/go-runewidth in the all group (#832) Bumps the all group with 1 update: [github.com/mattn/go-runewidth](https://github.com/mattn/go-runewidth). Updates `github.com/mattn/go-runewidth` from 0.0.17 to 0.0.19 - [Commits](https://github.com/mattn/go-runewidth/compare/v0.0.17...v0.0.19) --- updated-dependencies: - dependency-name: github.com/mattn/go-runewidth dependency-version: 0.0.19 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 3 ++- go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 82392fb..f4336bb 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/charmbracelet/x/editor v0.1.0 github.com/dustin/go-humanize v1.0.1 github.com/fsnotify/fsnotify v1.9.0 - github.com/mattn/go-runewidth v0.0.17 + github.com/mattn/go-runewidth v0.0.19 github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.3.0 github.com/muesli/go-app-paths v0.2.2 @@ -40,6 +40,7 @@ require ( github.com/charmbracelet/x/cellbuf v0.0.13 // indirect github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf // indirect github.com/charmbracelet/x/term v0.2.1 // indirect + github.com/clipperhouse/uax29/v2 v2.2.0 // indirect github.com/dlclark/regexp2 v1.11.0 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect diff --git a/go.sum b/go.sum index 6e3b8cd..a5252d8 100644 --- a/go.sum +++ b/go.sum @@ -38,6 +38,8 @@ github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf h1:rLG0Y github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf/go.mod h1:B3UgsnsBZS/eX42BlaNiJkD1pPOUa+oF1IYC6Yd2CEU= github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= +github.com/clipperhouse/uax29/v2 v2.2.0 h1:ChwIKnQN3kcZteTXMgb1wztSgaU+ZemkgWdohwgs8tY= +github.com/clipperhouse/uax29/v2 v2.2.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -80,8 +82,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.17 h1:78v8ZlW0bP43XfmAfPsdXcoNCelfMHsDmd/pkENfrjQ= -github.com/mattn/go-runewidth v0.0.17/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= From e9840f0735f121ecf3432fabcbed7435a7bd2ae0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 09:24:50 +0000 Subject: [PATCH 900/911] chore(deps): bump the all group with 3 updates (#833) Bumps the all group with 3 updates: [golang.org/x/sys](https://github.com/golang/sys), [golang.org/x/term](https://github.com/golang/term) and [golang.org/x/text](https://github.com/golang/text). Updates `golang.org/x/sys` from 0.36.0 to 0.37.0 - [Commits](https://github.com/golang/sys/compare/v0.36.0...v0.37.0) Updates `golang.org/x/term` from 0.35.0 to 0.36.0 - [Commits](https://github.com/golang/term/compare/v0.35.0...v0.36.0) Updates `golang.org/x/text` from 0.29.0 to 0.30.0 - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.29.0...v0.30.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-version: 0.37.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: golang.org/x/term dependency-version: 0.36.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: golang.org/x/text dependency-version: 0.30.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index f4336bb..4212231 100644 --- a/go.mod +++ b/go.mod @@ -26,9 +26,9 @@ require ( github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.10.1 github.com/spf13/viper v1.21.0 - golang.org/x/sys v0.36.0 - golang.org/x/term v0.35.0 - golang.org/x/text v0.29.0 + golang.org/x/sys v0.37.0 + golang.org/x/term v0.36.0 + golang.org/x/text v0.30.0 ) require ( diff --git a/go.sum b/go.sum index a5252d8..782d0de 100644 --- a/go.sum +++ b/go.sum @@ -159,12 +159,12 @@ golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= -golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 07d4e1de3fe693946d997835a4dfb9c33bec3be6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 11:33:09 +0000 Subject: [PATCH 901/911] chore(deps): bump golangci/golangci-lint-action in the all group (#843) Bumps the all group with 1 update: [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action). Updates `golangci/golangci-lint-action` from 8.0.0 to 9.0.0 - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v8.0.0...v9.0.0) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-version: 9.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index bcfb79c..b89cf68 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: golangci-lint - uses: golangci/golangci-lint-action@v8.0.0 + uses: golangci/golangci-lint-action@v9.0.0 with: # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 From dbf59aafa9762c9df28c3f5f1569a35cfa1b5e62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 11:35:26 +0000 Subject: [PATCH 902/911] chore(deps): bump golang.org/x/sys in the all group (#844) Bumps the all group with 1 update: [golang.org/x/sys](https://github.com/golang/sys). Updates `golang.org/x/sys` from 0.37.0 to 0.38.0 - [Commits](https://github.com/golang/sys/compare/v0.37.0...v0.38.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-version: 0.38.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4212231..61528a0 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.10.1 github.com/spf13/viper v1.21.0 - golang.org/x/sys v0.37.0 + golang.org/x/sys v0.38.0 golang.org/x/term v0.36.0 golang.org/x/text v0.30.0 ) diff --git a/go.sum b/go.sum index 782d0de..0004fd0 100644 --- a/go.sum +++ b/go.sum @@ -159,8 +159,8 @@ golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= -golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= From ba37804fd57d82fdea1e2a4275884a76f27c1d8f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Nov 2025 10:43:05 +0000 Subject: [PATCH 903/911] chore(deps): bump the all group with 2 updates (#847) Bumps the all group with 2 updates: [golang.org/x/term](https://github.com/golang/term) and [golang.org/x/text](https://github.com/golang/text). Updates `golang.org/x/term` from 0.36.0 to 0.37.0 - [Commits](https://github.com/golang/term/compare/v0.36.0...v0.37.0) Updates `golang.org/x/text` from 0.30.0 to 0.31.0 - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.30.0...v0.31.0) --- updated-dependencies: - dependency-name: golang.org/x/term dependency-version: 0.37.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: golang.org/x/text dependency-version: 0.31.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 61528a0..70f7087 100644 --- a/go.mod +++ b/go.mod @@ -27,8 +27,8 @@ require ( github.com/spf13/cobra v1.10.1 github.com/spf13/viper v1.21.0 golang.org/x/sys v0.38.0 - golang.org/x/term v0.36.0 - golang.org/x/text v0.30.0 + golang.org/x/term v0.37.0 + golang.org/x/text v0.31.0 ) require ( diff --git a/go.sum b/go.sum index 0004fd0..c93d4b5 100644 --- a/go.sum +++ b/go.sum @@ -161,10 +161,10 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= -golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= -golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= -golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From a861530349279f2bf7d8bdbc41e22615c2f6ff79 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 11:33:59 +0000 Subject: [PATCH 904/911] chore(deps): bump the all group with 2 updates (#848) Bumps the all group with 2 updates: [actions/checkout](https://github.com/actions/checkout) and [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action). Updates `actions/checkout` from 5 to 6 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) Updates `golangci/golangci-lint-action` from 9.0.0 to 9.1.0 - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v9.0.0...v9.1.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: all - dependency-name: golangci/golangci-lint-action dependency-version: 9.1.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/coverage.yml | 2 +- .github/workflows/lint.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 1105fa2..7fbd40b 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -8,7 +8,7 @@ jobs: GO111MODULE: "on" steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install Go uses: actions/setup-go@v6 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b89cf68..568f683 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,9 +8,9 @@ jobs: name: lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: golangci-lint - uses: golangci/golangci-lint-action@v9.0.0 + uses: golangci/golangci-lint-action@v9.1.0 with: # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 From 7903cdbc5fd2b7449b853e4d4e88e9df38586e72 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 10:05:33 +0000 Subject: [PATCH 905/911] chore(deps): bump golangci/golangci-lint-action in the all group (#854) Bumps the all group with 1 update: [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action). Updates `golangci/golangci-lint-action` from 9.1.0 to 9.2.0 - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v9.1.0...v9.2.0) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-version: 9.2.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 568f683..1e21125 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@v6 - name: golangci-lint - uses: golangci/golangci-lint-action@v9.1.0 + uses: golangci/golangci-lint-action@v9.2.0 with: # Optional: golangci-lint command line arguments. args: --issues-exit-code=0 From 752de97c5a331af0eed0c7b417462621bffa533e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 10:08:33 +0000 Subject: [PATCH 906/911] chore(deps): bump the all group across 1 directory with 4 updates (#857) Bumps the all group with 4 updates in the / directory: [github.com/spf13/cobra](https://github.com/spf13/cobra), [golang.org/x/sys](https://github.com/golang/sys), [golang.org/x/term](https://github.com/golang/term) and [golang.org/x/text](https://github.com/golang/text). Updates `github.com/spf13/cobra` from 1.10.1 to 1.10.2 - [Release notes](https://github.com/spf13/cobra/releases) - [Commits](https://github.com/spf13/cobra/compare/v1.10.1...v1.10.2) Updates `golang.org/x/sys` from 0.38.0 to 0.39.0 - [Commits](https://github.com/golang/sys/compare/v0.38.0...v0.39.0) Updates `golang.org/x/term` from 0.37.0 to 0.38.0 - [Commits](https://github.com/golang/term/compare/v0.37.0...v0.38.0) Updates `golang.org/x/text` from 0.31.0 to 0.32.0 - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.31.0...v0.32.0) --- updated-dependencies: - dependency-name: github.com/spf13/cobra dependency-version: 1.10.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all - dependency-name: golang.org/x/sys dependency-version: 0.39.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: golang.org/x/term dependency-version: 0.38.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all - dependency-name: golang.org/x/text dependency-version: 0.32.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: all ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 70f7087..55995bf 100644 --- a/go.mod +++ b/go.mod @@ -24,11 +24,11 @@ require ( github.com/muesli/roff v0.1.0 github.com/muesli/termenv v0.16.0 github.com/sahilm/fuzzy v0.1.1 - github.com/spf13/cobra v1.10.1 + github.com/spf13/cobra v1.10.2 github.com/spf13/viper v1.21.0 - golang.org/x/sys v0.38.0 - golang.org/x/term v0.37.0 - golang.org/x/text v0.31.0 + golang.org/x/sys v0.39.0 + golang.org/x/term v0.38.0 + golang.org/x/text v0.32.0 ) require ( diff --git a/go.sum b/go.sum index c93d4b5..f2609d4 100644 --- a/go.sum +++ b/go.sum @@ -131,8 +131,8 @@ github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= -github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= -github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -159,12 +159,12 @@ golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= +golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From fac0fb456d9ff873121fab10595a46a72f3a01ba Mon Sep 17 00:00:00 2001 From: Matt Van Horn Date: Thu, 9 Apr 2026 12:12:10 -0700 Subject: [PATCH 907/911] fix: use `shell.Fields` to parse `$PAGER` command (#922) Replace cmd/sh shell invocation with shell.Fields from mvdan.cc/sh. This properly handles paths with spaces on all platforms without shelling out. Fixes #385 --- go.mod | 10 ++++------ go.sum | 20 ++++++++++++-------- main.go | 9 +++++++-- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index 55995bf..ad021fa 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,6 @@ module github.com/charmbracelet/glow/v2 -go 1.24.0 - -toolchain go1.24.1 +go 1.25.0 require ( github.com/atotto/clipboard v0.1.4 @@ -26,9 +24,10 @@ require ( github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.10.2 github.com/spf13/viper v1.21.0 - golang.org/x/sys v0.39.0 - golang.org/x/term v0.38.0 + golang.org/x/sys v0.42.0 + golang.org/x/term v0.41.0 golang.org/x/text v0.32.0 + mvdan.cc/sh/v3 v3.13.1 ) require ( @@ -57,7 +56,6 @@ require ( github.com/muesli/mango-pflag v0.1.0 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect diff --git a/go.sum b/go.sum index f2609d4..9880660 100644 --- a/go.sum +++ b/go.sum @@ -56,10 +56,12 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= +github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= @@ -116,8 +118,8 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= @@ -159,10 +161,10 @@ golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= -golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= -golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -171,3 +173,5 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +mvdan.cc/sh/v3 v3.13.1 h1:DP3TfgZhDkT7lerUdnp6PTGKyxxzz6T+cOlY/xEvfWk= +mvdan.cc/sh/v3 v3.13.1/go.mod h1:lXJ8SexMvEVcHCoDvAGLZgFJ9Wsm2sulmoNEXGhYZD0= diff --git a/main.go b/main.go index b0d7a77..b31ca15 100644 --- a/main.go +++ b/main.go @@ -13,6 +13,8 @@ import ( "path/filepath" "strings" + "mvdan.cc/sh/v3/shell" + "github.com/caarlos0/env/v11" "github.com/charmbracelet/glamour" "github.com/charmbracelet/glamour/styles" @@ -319,8 +321,11 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { pagerCmd = "less -r" } - pa := strings.Split(pagerCmd, " ") - c := exec.Command(pa[0], pa[1:]...) //nolint:gosec + fields, err := shell.Fields(pagerCmd, os.Getenv) + if err != nil || len(fields) == 0 { + return fmt.Errorf("unable to parse PAGER command: %s", pagerCmd) + } + c := exec.Command(fields[0], fields[1:]...) //nolint:gosec c.Stdin = strings.NewReader(out) c.Stdout = os.Stdout if err := c.Run(); err != nil { From 1130f2d89f0ecb9b34412719a1bbd4218cc37d6f Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 9 Apr 2026 16:18:13 -0300 Subject: [PATCH 908/911] ci: fix govulncheck (#927) --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index ad021fa..26b474d 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/charmbracelet/glow/v2 -go 1.25.0 +go 1.25.9 require ( github.com/atotto/clipboard v0.1.4 From f57087499b407d420cdad1d76d0e1ed33c77a3d8 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 9 Apr 2026 17:25:27 -0300 Subject: [PATCH 909/911] v2.1.2 From 53788271b387c23b20b0db69fea2fd552593623b Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Wed, 22 Apr 2026 11:14:50 -0300 Subject: [PATCH 910/911] chore: remove CODEOWNERS --- .github/CODEOWNERS | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 3c190d7..0000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @charmbracelet/everyone From e5cb757278216f84400466a47c987f56ea2de5c4 Mon Sep 17 00:00:00 2001 From: Drew Smirnoff Date: Tue, 4 Aug 2026 18:41:27 +0400 Subject: [PATCH 911/911] chore: govulncheck bumps (#1004) Signed-off-by: drew --- go.mod | 14 ++++++++------ go.sum | 20 ++++++++++---------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index 26b474d..6e05b0d 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/charmbracelet/glow/v2 -go 1.25.9 +go 1.25.12 + +toolchain go1.26.5 require ( github.com/atotto/clipboard v0.1.4 @@ -24,9 +26,9 @@ require ( github.com/sahilm/fuzzy v0.1.1 github.com/spf13/cobra v1.10.2 github.com/spf13/viper v1.21.0 - golang.org/x/sys v0.42.0 - golang.org/x/term v0.41.0 - golang.org/x/text v0.32.0 + golang.org/x/sys v0.43.0 + golang.org/x/term v0.42.0 + golang.org/x/text v0.39.0 mvdan.cc/sh/v3 v3.13.1 ) @@ -64,10 +66,10 @@ require ( github.com/spf13/pflag v1.0.10 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - github.com/yuin/goldmark v1.7.8 // indirect + github.com/yuin/goldmark v1.7.17 // indirect github.com/yuin/goldmark-emoji v1.0.5 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect - golang.org/x/net v0.40.0 // indirect + golang.org/x/net v0.53.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect ) diff --git a/go.sum b/go.sum index 9880660..0ccd7cd 100644 --- a/go.sum +++ b/go.sum @@ -149,24 +149,24 @@ github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSW github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= -github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark v1.7.17 h1:p36OVWwRb246iHxA/U4p8OPEpOTESm4n+g+8t0EE5uA= +github.com/yuin/goldmark v1.7.17/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= github.com/yuin/goldmark-emoji v1.0.5 h1:EMVWyCGPlXJfUXBXpuMu+ii3TIaxbVBnEX9uaDC4cIk= github.com/yuin/goldmark-emoji v1.0.5/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuhGX/+R1ZpfJ4/ia80JM= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= -golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= -golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= -golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= -golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= -golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= -golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= +golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= +golang.org/x/text v0.39.0 h1:UbZz4pLOvn600D6Oh6GGEI6VAmndrEBLv8/6BEXzyus= +golang.org/x/text v0.39.0/go.mod h1:3UwRclnC2g0TU9x8PZiyfOajCd1zaUNHF9cvqcQZ+ZM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=

l!@Puuc_nI`kv7tI4#ysQ5N_x3 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¨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

Hu3MS$8Ql7|)l7^O)rx*NJ)0eO9!bJ< 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℘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 >kNT=3!fYgOkp1u^Y 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%0DwRO!V14Dud1yb5^93zQbTxr8@%(wE%`p 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 QUVx{irgymtb1nS;03%C_fB*mh diff --git a/styles/gold_light.png b/styles/gold_light.png deleted file mode 100644 index ec83a7dcb62df3a0478b2015a7bd54c516a792f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69024 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 From 915cd7ae9dc444f98eef71c20bf7e5595d38db5e Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 28 Nov 2019 08:35:24 +0100 Subject: [PATCH 083/911] Add light style and style gallery --- README.md | 2 ++ gallery.sh | 8 +++++++- statik/statik.go | 2 +- styles/README.md | 11 +++++++++++ styles/gold_dark.png | Bin 69072 -> 69072 bytes styles/gold_light.png | Bin 0 -> 69024 bytes styles/light.json | 40 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 styles/README.md create mode 100644 styles/gold_light.png create mode 100644 styles/light.json diff --git a/README.md b/README.md index b6286b4..c30a83f 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,8 @@ You can supply a JSON stylesheet with the `-s` flag: ![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/gold_dark.png) +Check out the [Gold Style Gallery](https://github.com/charmbracelet/gold/blob/master/cmd/gold/styles/README.md)! + ## Colors Currently `gold` uses the [Aurora ANSI colors](https://godoc.org/github.com/logrusorgru/aurora#Index). diff --git a/gallery.sh b/gallery.sh index a57d3cb..0fe0a8d 100755 --- a/gallery.sh +++ b/gallery.sh @@ -3,6 +3,12 @@ for style in ./styles/*.json; do echo "Generating screenshot for ${style}" filename="gold_`basename -s .json ${style}`.png" - termshot -o ./styles/ -f "$filename" ./gold -s ${style} + + light="" + if [[ $style == *"light"* ]]; then + light="-l" + fi + + ./termshot ${light} -o ./styles/ -f "$filename" ./gold -s ${style} pngcrush -ow "./styles/$filename" done diff --git a/statik/statik.go b/statik/statik.go index f4a877d..b3cfbb0 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -7,6 +7,6 @@ import ( ) func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xa3\x0b|O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\xe3\"\xdf]|\x90[JC1\x10\x86\xdf\xb3\x8aa\x9e\x14\x8eP\xdb\x17\xc9\x0e\\\x83HI\x93i\xcf\xd0\\JN\x0e\x14\xa5\xe0Z\\\x9a+\x91h\xea\xd8\xdby\x0b\xc3\xf7_\xf2\xbf+\x00\xf4\x1c\xb7\xa8\xa1\xbe\x01\xd0&\x9f2j\xc0\xc7\xf9\x02\xbb\xdf\xdb\x18\x1de\xcf\x91PC\xc9#\xb5\xf3.\xd3\x9a\xf7\x95\xbd;\x92\xc3\xb8n\xa7{T\x00\x87\xee\x18\xb0,\xb4/\xd3)\xab\xe4]\x0b\xf8\x93r0\x1b\x9a\x96I\x8b\x97\xe7Jk\xb8,\xf3\x8a\xa7\x8e\xb7\xda< \xd7\x93q\x1c7\x02\xfd\xab\xd7\x9d\xc9\x16\"\xb3\xc9]\xeb;\x9f\xcdN\x99\xe5\xca'{m\xf6J6\xff\xd2S\xa8f8$o2\xbf\x91{p&o\xc5\x88\xc2\xae\x17\x0b.\xc6\xb3=_p(9\xdd\xf8\x86lR(\x08!\x83~}|\xc2O\x9a:\xa8\xef\x00\x00\x00\xff\xffPK\x07\x08[\xf7\xa4\xb8\xd8\x00\x00\x00+\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xa3\x0b|O[\xf7\xa4\xb8\xd8\x00\x00\x00+\x02\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\xe3\"\xdf]PK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00@\x00\x00\x00\x18\x01\x00\x00\x00\x00" + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xfa\x0b|O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00 \x00dark.jsonUT\x05\x00\x01\x89#\xdf]|\x90[JC1\x10\x86\xdf\xb3\x8aa\x9e\x14\x8eP\xdb\x17\xc9\x0e\\\x83HI\x93i\xcf\xd0\\JN\x0e\x14\xa5\xe0Z\\\x9a+\x91h\xea\xd8\xdby\x0b\xc3\xf7_\xf2\xbf+\x00\xf4\x1c\xb7\xa8\xa1\xbe\x01\xd0&\x9f2j\xc0\xc7\xf9\x02\xbb\xdf\xdb\x18\x1de\xcf\x91PC\xc9#\xb5\xf3.\xd3\x9a\xf7\x95\xbd;\x92\xc3\xb8n\xa7{T\x00\x87\xee\x18\xb0,\xb4/\xd3)\xab\xe4]\x0b\xf8\x93r0\x1b\x9a\x96I\x8b\x97\xe7Jk\xb8,\xf3\x8a\xa7\x8e\xb7\xda< \xd7\x93q\x1c7\x02\xfd\xab\xd7\x9d\xc9\x16\"\xb3\xc9]\xeb;\x9f\xcdN\x99\xe5\xca'{m\xf6J6\xff\xd2S\xa8f8$o2\xbf\x91{p&o\xc5\x88\xc2\xae\x17\x0b.\xc6\xb3=_p(9\xdd\xf8\x86lR(\x08!\x83~}|\xc2O\x9a:\xa8\xef\x00\x00\x00\xff\xffPK\x07\x08[\xf7\xa4\xb8\xd8\x00\x00\x00+\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xee;|O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00light.jsonUT\x05\x00\x01\xd0w\xdf]\x84\x91MN\xc40\x0c\x85\xf7s\n\xcb+\x90\xca\x82\xbfMo\xc0\x19\x10\x1au\x1aOc\xe1$\xa3\xd4\x95F $\xce\xc2\xd18 \n\x14\x920-,\xba\xa8\xf3\xfc\xbeg\xfby\x03\x00\x80\xc2\xfe\x11[\xf8\xfa\x03\xc0>H\x88\xd8\x02^\xdd\xdcb\xf3]\x9d\xbc\xa1(\xec [\xd08\xd1\xcf\xc3!\xd2\x9e\x8fI\x7f\x96\xd5\xe3\xb4\x9f\x8b\xe7\xf8Y{i2l\xabt\xd4e\xe2uA\xdc\x0513\xac\xb2`\xd7\x0d\xf4\x7f\xe0\x9c\xeb\xfe.u\xb4\xb0\x14\xef\x01O\xbd\xff\xceW\xe9-u\x86\xfdP\x8a\x8b\xd8\xcd\x89\xc1e\xdd\xde\x07\xb32\xc9oPRnw\x12\xfa\x95S\x95\x8bSK.\xd9\xe2\x18\xa4\x8b\xfcD\xe6Bx\xb0Z;\x92;\xd8\xd2\x8b\xb5\x13\xee\x97\x16>j\x0c\xab3\xd6\xebSr\xa5.\xdf\xe0\xfd\xf5\x0df\xfe&}\x1f\x01\x00\x00\xff\xffPK\x07\x08\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xfa\x0b|O[\xf7\xa4\xb8\xd8\x00\x00\x00+\x02\x00\x00 \x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00dark.jsonUT\x05\x00\x01\x89#\xdf]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xee;|O\xac\xc6\xad\xf0\xdf\x00\x00\x00|\x02\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x18\x01\x00\x00light.jsonUT\x05\x00\x01\xd0w\xdf]PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x81\x00\x00\x008\x02\x00\x00\x00\x00" fs.Register(data) } diff --git a/styles/README.md b/styles/README.md new file mode 100644 index 0000000..835adb6 --- /dev/null +++ b/styles/README.md @@ -0,0 +1,11 @@ +# Gold Styles + +## Gallery + +#### Dark + +![Gold Dark Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/gold_dark.png) + +#### Light + +![Gold Light Style](https://github.com/charmbracelet/gold/raw/master/cmd/gold/styles/gold_light.png) diff --git a/styles/gold_dark.png b/styles/gold_dark.png index 237fd254d1c4bc757505ee2ba31a97fc95575c5a..86cd4e29c29f1c0738466a0b14ca39280ba02385 100644 GIT binary patch delta 102 zcmcaGo8`i6mI-Uv+2uIio!fn>ar4&AjOTg$%&m+KtPCu)4S=M9*s=EI3=9maC9V-A uDTyViR=N2pnQ4^_Mh1qKx`u|jMiwCkC>qjd+e-sAFnGH9xvXDOmR$scTIw1a>Ka*u7@%li|6`B})WG2B>gTe~DWM4fDUu)3 diff --git a/styles/gold_light.png b/styles/gold_light.png new file mode 100644 index 0000000000000000000000000000000000000000..ec83a7dcb62df3a0478b2015a7bd54c516a792f6 GIT binary patch literal 69024 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