Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gh for openSUSE:Factory checked in at 2021-09-02 23:20:30 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gh (Old) and /work/SRC/openSUSE:Factory/.gh.new.1899 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gh" Thu Sep 2 23:20:30 2021 rev:13 rq:916051 version:2.0.0 Changes: -------- --- /work/SRC/openSUSE:Factory/gh/gh.changes 2021-08-25 20:59:54.237027618 +0200 +++ /work/SRC/openSUSE:Factory/.gh.new.1899/gh.changes 2021-09-02 23:20:57.672601835 +0200 @@ -1,0 +2,24 @@ +Thu Sep 2 07:12:02 UTC 2021 - Emily Roberts <nopeinomi...@posteo.net> + +- Update to version 2.0.0 + * Support for command extensions + * Display label colors in issue list output #4106 + * Add tablerow/tablerender template functions for rendering data as tables #3519 + * Add GH_FORCE_TTY to enable terminal-style output even when redirected #4146 + * Add repo sync command to sync a branch with its upstream state #3813 + * Add pr checkout --branch flag to control the branch name #4005 + * Add release create --discussion-category flag #4003 + * Add config set browser option and GH_BROWSER environment variable #3992 + * Add repo list --topic filter #4136 + * Add PowerShell instructions to completion help #4114 + * Improve accessibility of interactive select menus #4172 + * Improve detection of truecolor terminal capabilities #4106 + * Avoid wrapping issues in powershell.exe #4106 + * Detect missing git and abort early during auth login flow #4109 + * Fix HTTP 502 error printing from GraphQL responses #4154 + * Require Go 1.16+ #4175 + * Remove backwards compatibility with homedir library for config files #4145 + + + +------------------------------------------------------------------- Old: ---- gh-1.14.0.tar.gz New: ---- gh-2.0.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gh.spec ++++++ --- /var/tmp/diff_new_pack.BrwycZ/_old 2021-09-02 23:20:58.308602628 +0200 +++ /var/tmp/diff_new_pack.BrwycZ/_new 2021-09-02 23:20:58.312602632 +0200 @@ -18,7 +18,7 @@ %define goflags "-buildmode=pie -trimpath -mod=vendor -modcacherw" Name: gh -Version: 1.14.0 +Version: 2.0.0 Release: 0 Summary: The official CLI for GitHub License: MIT @@ -30,7 +30,7 @@ # Test requirement BuildRequires: git-core BuildRequires: zsh -BuildRequires: golang(API) >= 1.13 +BuildRequires: golang(API) >= 1.16 Requires: git %description ++++++ gh-1.14.0.tar.gz -> gh-2.0.0.tar.gz ++++++ ++++ 6677 lines of diff (skipped) ++++++ vendor.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/AlecAivazis/survey/v2/README.md new/vendor/github.com/AlecAivazis/survey/v2/README.md --- old/vendor/github.com/AlecAivazis/survey/v2/README.md 2021-08-07 07:27:28.937208700 +0200 +++ new/vendor/github.com/AlecAivazis/survey/v2/README.md 2021-09-02 08:52:01.381470700 +0200 @@ -3,7 +3,7 @@ [](https://travis-ci.org/AlecAivazis/survey) [](https://pkg.go.dev/github.com/AlecAivazis/survey/v2) -A library for building interactive prompts on terminals supporting ANSI escape sequences. +A library for building interactive and accessible prompts on terminals supporting ANSI escape sequences. <img width="550" src="https://thumbs.gfycat.com/VillainousGraciousKouprey-size_restricted.gif"/> @@ -295,7 +295,7 @@ ## Keeping the filter active -By default the filter will disappear if the user selects one of the filtered elements. Once the user selects one element the filter setting is gone. +By default the filter will disappear if the user selects one of the filtered elements. Once the user selects one element the filter setting is gone. However the user can prevent this from happening and keep the filter active for multiple selections in a e.g. MultiSelect: @@ -342,11 +342,13 @@ `survey` comes prepackaged with a few validators to fit common situations. Currently these validators include: -| name | valid types | description | notes | -| ------------ | ----------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------- | -| Required | any | Rejects zero values of the response type | Boolean values pass straight through since the zero value (false) is a valid response | -| MinLength(n) | string | Enforces that a response is at least the given length | | -| MaxLength(n) | string | Enforces that a response is no longer than the given length | | +| name | valid types | description | notes | +| ------------ | -------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| Required | any | Rejects zero values of the response type | Boolean values pass straight through since the zero value (false) is a valid response | +| MinLength(n) | string | Enforces that a response is at least the given length | | +| MaxLength(n) | string | Enforces that a response is no longer than the given length | | +| MaxItems(n) | []OptionAnswer | Enforces that a response has no more selections of the indicated | | +| MinItems(n) | []OptionAnswer | Enforces that a response has no less selections of the indicated | | ## Help Text @@ -457,6 +459,7 @@ ## FAQ ### What kinds of IO are supported by `survey`? + survey aims to support most terminal emulators; it expects support for ANSI escape sequences. This means that reading from piped stdin or writing to piped stdout is **not supported**, and likely to break your application in these situations. See [#337](https://github.com/AlecAivazis/survey/pull/337#issue-581351617) @@ -475,4 +478,3 @@ panic(err) } ``` - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/AlecAivazis/survey/v2/core/template.go new/vendor/github.com/AlecAivazis/survey/v2/core/template.go --- old/vendor/github.com/AlecAivazis/survey/v2/core/template.go 2021-08-07 07:27:28.941208600 +0200 +++ new/vendor/github.com/AlecAivazis/survey/v2/core/template.go 2021-09-02 08:52:01.424094700 +0200 @@ -29,7 +29,7 @@ //for colored output. The second string does not contain escape codes //and can be used by the renderer for layout purposes. func RunTemplate(tmpl string, data interface{}) (string, string, error) { - tPair, err := getTemplatePair(tmpl) + tPair, err := GetTemplatePair(tmpl) if err != nil { return "", "", err } @@ -52,12 +52,12 @@ memoMutex = &sync.RWMutex{} ) -//getTemplatePair returns a pair of compiled templates where the +//GetTemplatePair returns a pair of compiled templates where the //first template is generated for user-facing output and the //second is generated for use by the renderer. The second //template does not contain any color escape codes, whereas //the first template may or may not depending on DisableColor. -func getTemplatePair(tmpl string) ([2]*template.Template, error) { +func GetTemplatePair(tmpl string) ([2]*template.Template, error) { memoMutex.RLock() if t, ok := memoizedGetTemplate[tmpl]; ok { memoMutex.RUnlock() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/AlecAivazis/survey/v2/core/write.go new/vendor/github.com/AlecAivazis/survey/v2/core/write.go --- old/vendor/github.com/AlecAivazis/survey/v2/core/write.go 2021-08-07 07:27:28.941208600 +0200 +++ new/vendor/github.com/AlecAivazis/survey/v2/core/write.go 2021-09-02 08:52:01.426876800 +0200 @@ -24,6 +24,11 @@ Index int } +type reflectField struct { + value reflect.Value + fieldType reflect.StructField +} + func OptionAnswerList(incoming []string) []OptionAnswer { list := []OptionAnswer{} for i, opt := range incoming { @@ -63,13 +68,12 @@ } // get the name of the field that matches the string we were given - fieldIndex, err := findFieldIndex(elem, name) + field, _, err := findField(elem, name) // if something went wrong if err != nil { // bubble up return err } - field := elem.Field(fieldIndex) // handle references to the Settable interface aswell if s, ok := field.Interface().(Settable); ok { // use the interface method @@ -156,37 +160,51 @@ // BUG(AlecAivazis): the current implementation might cause weird conflicts if there are // two fields with same name that only differ by casing. -func findFieldIndex(s reflect.Value, name string) (int, error) { - // the type of the value - sType := s.Type() +func findField(s reflect.Value, name string) (reflect.Value, reflect.StructField, error) { - // first look for matching tags so we can overwrite matching field names - for i := 0; i < sType.NumField(); i++ { - // the field we are current scanning - field := sType.Field(i) + fields := flattenFields(s) + // first look for matching tags so we can overwrite matching field names + for _, f := range fields { // the value of the survey tag - tag := field.Tag.Get(tagName) + tag := f.fieldType.Tag.Get(tagName) // if the tag matches the name we are looking for if tag != "" && tag == name { // then we found our index - return i, nil + return f.value, f.fieldType, nil } } // then look for matching names - for i := 0; i < sType.NumField(); i++ { - // the field we are current scanning - field := sType.Field(i) - + for _, f := range fields { // if the name of the field matches what we're looking for - if strings.ToLower(field.Name) == strings.ToLower(name) { - return i, nil + if strings.ToLower(f.fieldType.Name) == strings.ToLower(name) { + return f.value, f.fieldType, nil } } // we didn't find the field - return -1, errFieldNotMatch{name} + return reflect.Value{}, reflect.StructField{}, errFieldNotMatch{name} +} + +func flattenFields(s reflect.Value) []reflectField { + sType := s.Type() + numField := sType.NumField() + fields := make([]reflectField, 0, numField) + for i := 0; i < numField; i++ { + fieldType := sType.Field(i) + field := s.Field(i) + + if field.Kind() == reflect.Struct && fieldType.Anonymous { + // field is a promoted structure + for _, f := range flattenFields(field) { + fields = append(fields, f) + } + continue + } + fields = append(fields, reflectField{field, fieldType}) + } + return fields } // isList returns true if the element is something we can Len() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/AlecAivazis/survey/v2/multiselect.go new/vendor/github.com/AlecAivazis/survey/v2/multiselect.go --- old/vendor/github.com/AlecAivazis/survey/v2/multiselect.go 2021-08-07 07:27:28.937208700 +0200 +++ new/vendor/github.com/AlecAivazis/survey/v2/multiselect.go 2021-09-02 08:52:01.403090500 +0200 @@ -45,9 +45,27 @@ ShowHelp bool PageEntries []core.OptionAnswer Config *PromptConfig + + // These fields are used when rendering an individual option + CurrentOpt core.OptionAnswer + CurrentIndex int +} + +// IterateOption sets CurrentOpt and CurrentIndex appropriately so a multiselect option can be rendered individually +func (m MultiSelectTemplateData) IterateOption(ix int, opt core.OptionAnswer) interface{} { + copy := m + copy.CurrentIndex = ix + copy.CurrentOpt = opt + return copy } var MultiSelectQuestionTemplate = ` +{{- define "option"}} + {{- if eq .SelectedIndex .CurrentIndex }}{{color .Config.Icons.SelectFocus.Format }}{{ .Config.Icons.SelectFocus.Text }}{{color "reset"}}{{else}} {{end}} + {{- if index .Checked .CurrentOpt.Index }}{{color .Config.Icons.MarkedOption.Format }} {{ .Config.Icons.MarkedOption.Text }} {{else}}{{color .Config.Icons.UnmarkedOption.Format }} {{ .Config.Icons.UnmarkedOption.Text }} {{end}} + {{- color "reset"}} + {{- " "}}{{- .CurrentOpt.Value}} +{{end}} {{- if .ShowHelp }}{{- color .Config.Icons.Help.Format }}{{ .Config.Icons.Help.Text }} {{ .Help }}{{color "reset"}}{{"\n"}}{{end}} {{- color .Config.Icons.Question.Format }}{{ .Config.Icons.Question.Text }} {{color "reset"}} {{- color "default+hb"}}{{ .Message }}{{ .FilterMessage }}{{color "reset"}} @@ -56,10 +74,7 @@ {{- " "}}{{- color "cyan"}}[Use arrows to move, space to select, <right> to all, <left> to none, type to filter{{- if and .Help (not .ShowHelp)}}, {{ .Config.HelpInput }} for more help{{end}}]{{color "reset"}} {{- "\n"}} {{- range $ix, $option := .PageEntries}} - {{- if eq $ix $.SelectedIndex }}{{color $.Config.Icons.SelectFocus.Format }}{{ $.Config.Icons.SelectFocus.Text }}{{color "reset"}}{{else}} {{end}} - {{- if index $.Checked $option.Index }}{{color $.Config.Icons.MarkedOption.Format }} {{ $.Config.Icons.MarkedOption.Text }} {{else}}{{color $.Config.Icons.UnmarkedOption.Format }} {{ $.Config.Icons.UnmarkedOption.Text }} {{end}} - {{- color "reset"}} - {{- " "}}{{$option.Value}}{{"\n"}} + {{- template "option" $.IterateOption $ix $option}} {{- end}} {{- end}}` @@ -159,18 +174,17 @@ // and we have modified the filter then we should move the page back! opts, idx := paginate(pageSize, options, m.selectedIndex) + tmplData := MultiSelectTemplateData{ + MultiSelect: *m, + SelectedIndex: idx, + Checked: m.checked, + ShowHelp: m.showingHelp, + PageEntries: opts, + Config: config, + } + // render the options - m.Render( - MultiSelectQuestionTemplate, - MultiSelectTemplateData{ - MultiSelect: *m, - SelectedIndex: idx, - Checked: m.checked, - ShowHelp: m.showingHelp, - PageEntries: opts, - Config: config, - }, - ) + m.RenderWithCursorOffset(MultiSelectQuestionTemplate, tmplData, opts, idx) } func (m *MultiSelect) filterOptions(config *PromptConfig) []core.OptionAnswer { @@ -250,20 +264,21 @@ opts, idx := paginate(pageSize, core.OptionAnswerList(m.Options), m.selectedIndex) cursor := m.NewCursor() - cursor.Hide() // hide the cursor - defer cursor.Show() // show the cursor when we're done + cursor.Save() // for proper cursor placement during selection + cursor.Hide() // hide the cursor + defer cursor.Show() // show the cursor when we're done + defer cursor.Restore() // clear any accessibility offsetting on exit + + tmplData := MultiSelectTemplateData{ + MultiSelect: *m, + SelectedIndex: idx, + Checked: m.checked, + PageEntries: opts, + Config: config, + } // ask the question - err := m.Render( - MultiSelectQuestionTemplate, - MultiSelectTemplateData{ - MultiSelect: *m, - SelectedIndex: idx, - Checked: m.checked, - PageEntries: opts, - Config: config, - }, - ) + err := m.RenderWithCursorOffset(MultiSelectQuestionTemplate, tmplData, opts, idx) if err != nil { return "", err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/AlecAivazis/survey/v2/renderer.go new/vendor/github.com/AlecAivazis/survey/v2/renderer.go --- old/vendor/github.com/AlecAivazis/survey/v2/renderer.go 2021-08-07 07:27:28.937208700 +0200 +++ new/vendor/github.com/AlecAivazis/survey/v2/renderer.go 2021-09-02 08:52:01.407750800 +0200 @@ -69,6 +69,14 @@ return nil } +func (r *Renderer) OffsetCursor(offset int) { + cursor := r.NewCursor() + for offset > 0 { + cursor.PreviousLine(1) + offset-- + } +} + func (r *Renderer) Render(tmpl string, data interface{}) error { // cleanup the currently rendered text lineCount := r.countLines(r.renderedText) @@ -91,6 +99,21 @@ return nil } +func (r *Renderer) RenderWithCursorOffset(tmpl string, data IterableOpts, opts []core.OptionAnswer, idx int) error { + cursor := r.NewCursor() + cursor.Restore() // clear any accessibility offsetting + + if err := r.Render(tmpl, data); err != nil { + return err + } + cursor.Save() + + offset := computeCursorOffset(MultiSelectQuestionTemplate, data, opts, idx, r.termWidthSafe()) + r.OffsetCursor(offset) + + return nil +} + // appendRenderedError appends text to the renderer's error buffer // which is used to track what has been printed. It is not exported // as errors should only be displayed via Error(config, error). @@ -123,15 +146,20 @@ return termWidth, err } -// countLines will return the count of `\n` with the addition of any -// lines that have wrapped due to narrow terminal width -func (r *Renderer) countLines(buf bytes.Buffer) int { +func (r *Renderer) termWidthSafe() int { w, err := r.termWidth() if err != nil || w == 0 { // if we got an error due to terminal.GetSize not being supported // on current platform then just assume a very wide terminal w = 10000 } + return w +} + +// countLines will return the count of `\n` with the addition of any +// lines that have wrapped due to narrow terminal width +func (r *Renderer) countLines(buf bytes.Buffer) int { + w := r.termWidthSafe() bufBytes := buf.Bytes() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/AlecAivazis/survey/v2/select.go new/vendor/github.com/AlecAivazis/survey/v2/select.go --- old/vendor/github.com/AlecAivazis/survey/v2/select.go 2021-08-07 07:27:28.937208700 +0200 +++ new/vendor/github.com/AlecAivazis/survey/v2/select.go 2021-09-02 08:52:01.410235600 +0200 @@ -43,9 +43,26 @@ ShowAnswer bool ShowHelp bool Config *PromptConfig + + // These fields are used when rendering an individual option + CurrentOpt core.OptionAnswer + CurrentIndex int +} + +// IterateOption sets CurrentOpt and CurrentIndex appropriately so a select option can be rendered individually +func (s SelectTemplateData) IterateOption(ix int, opt core.OptionAnswer) interface{} { + copy := s + copy.CurrentIndex = ix + copy.CurrentOpt = opt + return copy } var SelectQuestionTemplate = ` +{{- define "option"}} + {{- if eq .SelectedIndex .CurrentIndex }}{{color .Config.Icons.SelectFocus.Format }}{{ .Config.Icons.SelectFocus.Text }} {{else}}{{color "default"}} {{end}} + {{- .CurrentOpt.Value}} + {{- color "reset"}} +{{end}} {{- if .ShowHelp }}{{- color .Config.Icons.Help.Format }}{{ .Config.Icons.Help.Text }} {{ .Help }}{{color "reset"}}{{"\n"}}{{end}} {{- color .Config.Icons.Question.Format }}{{ .Config.Icons.Question.Text }} {{color "reset"}} {{- color "default+hb"}}{{ .Message }}{{ .FilterMessage }}{{color "reset"}} @@ -53,10 +70,8 @@ {{- else}} {{- " "}}{{- color "cyan"}}[Use arrows to move, type to filter{{- if and .Help (not .ShowHelp)}}, {{ .Config.HelpInput }} for more help{{end}}]{{color "reset"}} {{- "\n"}} - {{- range $ix, $choice := .PageEntries}} - {{- if eq $ix $.SelectedIndex }}{{color $.Config.Icons.SelectFocus.Format }}{{ $.Config.Icons.SelectFocus.Text }} {{else}}{{color "default"}} {{end}} - {{- $choice.Value}} - {{- color "reset"}}{{"\n"}} + {{- range $ix, $option := .PageEntries}} + {{- template "option" $.IterateOption $ix $option}} {{- end}} {{- end}}` @@ -152,17 +167,16 @@ // and we have modified the filter then we should move the page back! opts, idx := paginate(pageSize, options, s.selectedIndex) + tmplData := SelectTemplateData{ + Select: *s, + SelectedIndex: idx, + ShowHelp: s.showingHelp, + PageEntries: opts, + Config: config, + } + // render the options - s.Render( - SelectQuestionTemplate, - SelectTemplateData{ - Select: *s, - SelectedIndex: idx, - ShowHelp: s.showingHelp, - PageEntries: opts, - Config: config, - }, - ) + s.RenderWithCursorOffset(SelectQuestionTemplate, tmplData, opts, idx) // keep prompting return false @@ -234,16 +248,22 @@ // figure out the options and index to render opts, idx := paginate(pageSize, core.OptionAnswerList(s.Options), sel) + cursor := s.NewCursor() + cursor.Save() // for proper cursor placement during selection + cursor.Hide() // hide the cursor + defer cursor.Show() // show the cursor when we're done + defer cursor.Restore() // clear any accessibility offsetting on exit + + tmplData := SelectTemplateData{ + Select: *s, + SelectedIndex: idx, + ShowHelp: s.showingHelp, + PageEntries: opts, + Config: config, + } + // ask the question - err := s.Render( - SelectQuestionTemplate, - SelectTemplateData{ - Select: *s, - PageEntries: opts, - SelectedIndex: idx, - Config: config, - }, - ) + err := s.RenderWithCursorOffset(SelectQuestionTemplate, tmplData, opts, idx) if err != nil { return "", err } @@ -255,10 +275,6 @@ rr.SetTermMode() defer rr.RestoreTermMode() - cursor := s.NewCursor() - cursor.Hide() // hide the cursor - defer cursor.Show() // show the cursor when we're done - // start waiting for input for { r, _, err := rr.ReadRune() @@ -317,6 +333,8 @@ } func (s *Select) Cleanup(config *PromptConfig, val interface{}) error { + cursor := s.NewCursor() + cursor.Restore() return s.Render( SelectQuestionTemplate, SelectTemplateData{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/AlecAivazis/survey/v2/survey.go new/vendor/github.com/AlecAivazis/survey/v2/survey.go --- old/vendor/github.com/AlecAivazis/survey/v2/survey.go 2021-08-07 07:27:28.937208700 +0200 +++ new/vendor/github.com/AlecAivazis/survey/v2/survey.go 2021-09-02 08:52:01.412885400 +0200 @@ -1,10 +1,12 @@ package survey import ( + "bytes" "errors" "io" "os" "strings" + "unicode/utf8" "github.com/AlecAivazis/survey/v2/core" "github.com/AlecAivazis/survey/v2/terminal" @@ -411,3 +413,42 @@ // return the subset we care about and the index return choices[start:end], cursor } + +type IterableOpts interface { + IterateOption(int, core.OptionAnswer) interface{} +} + +func computeCursorOffset(tmpl string, data IterableOpts, opts []core.OptionAnswer, idx, tWidth int) int { + tmpls, err := core.GetTemplatePair(tmpl) + + if err != nil { + return 0 + } + + t := tmpls[0] + + renderOpt := func(ix int, opt core.OptionAnswer) string { + buf := bytes.NewBufferString("") + t.ExecuteTemplate(buf, "option", data.IterateOption(ix, opt)) + return buf.String() + } + + offset := len(opts) - idx + + for i, o := range opts { + if i < idx { + continue + } + renderedOpt := renderOpt(i, o) + valWidth := utf8.RuneCount([]byte(renderedOpt)) + if valWidth > tWidth { + splitCount := valWidth / tWidth + if valWidth%tWidth == 0 { + splitCount -= 1 + } + offset += splitCount + } + } + + return offset +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/AlecAivazis/survey/v2/validate.go new/vendor/github.com/AlecAivazis/survey/v2/validate.go --- old/vendor/github.com/AlecAivazis/survey/v2/validate.go 2021-08-07 07:27:28.941208600 +0200 +++ new/vendor/github.com/AlecAivazis/survey/v2/validate.go 2021-09-02 08:52:01.417806400 +0200 @@ -4,6 +4,8 @@ "errors" "fmt" "reflect" + + "github.com/AlecAivazis/survey/v2/core" ) // Required does not allow an empty value @@ -56,6 +58,44 @@ // the input is fine return nil } +} + +// MaxItems requires that the list is no longer than the specified value +func MaxItems(numberItems int) Validator { + // return a validator that checks the length of the list + return func(val interface{}) error { + if list, ok := val.([]core.OptionAnswer); ok { + // if the list is longer than the given value + if len(list) > numberItems { + // yell loudly + return fmt.Errorf("value is too long. Max items is %v", numberItems) + } + } else { + // otherwise we cannot convert the value into a list of answer and cannot enforce length + return fmt.Errorf("cannot impose the length on something other than a list of answers") + } + // the input is fine + return nil + } +} + +// MinItems requires that the list is longer or equal in length to the specified value +func MinItems(numberItems int) Validator { + // return a validator that checks the length of the list + return func(val interface{}) error { + if list, ok := val.([]core.OptionAnswer); ok { + // if the list is shorter than the given value + if len(list) < numberItems { + // yell loudly + return fmt.Errorf("value is too long. Min items is %v", numberItems) + } + } else { + // otherwise we cannot convert the value into a list of answer and cannot enforce length + return fmt.Errorf("cannot impose the length on something other than a list of answers") + } + // the input is fine + return nil + } } // ComposeValidators is a variadic function used to create one validator from many. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/mitchellh/go-homedir/LICENSE new/vendor/github.com/mitchellh/go-homedir/LICENSE --- old/vendor/github.com/mitchellh/go-homedir/LICENSE 2021-08-07 07:27:29.001209000 +0200 +++ new/vendor/github.com/mitchellh/go-homedir/LICENSE 1970-01-01 01:00:00.000000000 +0100 @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Mitchell Hashimoto - -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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/mitchellh/go-homedir/README.md new/vendor/github.com/mitchellh/go-homedir/README.md --- old/vendor/github.com/mitchellh/go-homedir/README.md 2021-08-07 07:27:29.001209000 +0200 +++ new/vendor/github.com/mitchellh/go-homedir/README.md 1970-01-01 01:00:00.000000000 +0100 @@ -1,14 +0,0 @@ -# go-homedir - -This is a Go library for detecting the user's home directory without -the use of cgo, so the library can be used in cross-compilation environments. - -Usage is incredibly simple, just call `homedir.Dir()` to get the home directory -for a user, and `homedir.Expand()` to expand the `~` in a path to the home -directory. - -**Why not just use `os/user`?** The built-in `os/user` package requires -cgo on Darwin systems. This means that any Go code that uses that package -cannot cross compile. But 99% of the time the use for `os/user` is just to -retrieve the home directory, which we can do for the current user without -cgo. This library does that, enabling cross-compilation. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/mitchellh/go-homedir/go.mod new/vendor/github.com/mitchellh/go-homedir/go.mod --- old/vendor/github.com/mitchellh/go-homedir/go.mod 2021-08-07 07:27:29.001209000 +0200 +++ new/vendor/github.com/mitchellh/go-homedir/go.mod 1970-01-01 01:00:00.000000000 +0100 @@ -1 +0,0 @@ -module github.com/mitchellh/go-homedir diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/mitchellh/go-homedir/homedir.go new/vendor/github.com/mitchellh/go-homedir/homedir.go --- old/vendor/github.com/mitchellh/go-homedir/homedir.go 2021-08-07 07:27:29.001209000 +0200 +++ new/vendor/github.com/mitchellh/go-homedir/homedir.go 1970-01-01 01:00:00.000000000 +0100 @@ -1,167 +0,0 @@ -package homedir - -import ( - "bytes" - "errors" - "os" - "os/exec" - "path/filepath" - "runtime" - "strconv" - "strings" - "sync" -) - -// DisableCache will disable caching of the home directory. Caching is enabled -// by default. -var DisableCache bool - -var homedirCache string -var cacheLock sync.RWMutex - -// Dir returns the home directory for the executing user. -// -// This uses an OS-specific method for discovering the home directory. -// An error is returned if a home directory cannot be detected. -func Dir() (string, error) { - if !DisableCache { - cacheLock.RLock() - cached := homedirCache - cacheLock.RUnlock() - if cached != "" { - return cached, nil - } - } - - cacheLock.Lock() - defer cacheLock.Unlock() - - var result string - var err error - if runtime.GOOS == "windows" { - result, err = dirWindows() - } else { - // Unix-like system, so just assume Unix - result, err = dirUnix() - } - - if err != nil { - return "", err - } - homedirCache = result - return result, nil -} - -// Expand expands the path to include the home directory if the path -// is prefixed with `~`. If it isn't prefixed with `~`, the path is -// returned as-is. -func Expand(path string) (string, error) { - if len(path) == 0 { - return path, nil - } - - if path[0] != '~' { - return path, nil - } - - if len(path) > 1 && path[1] != '/' && path[1] != '\\' { - return "", errors.New("cannot expand user-specific home dir") - } - - dir, err := Dir() - if err != nil { - return "", err - } - - return filepath.Join(dir, path[1:]), nil -} - -// Reset clears the cache, forcing the next call to Dir to re-detect -// the home directory. This generally never has to be called, but can be -// useful in tests if you're modifying the home directory via the HOME -// env var or something. -func Reset() { - cacheLock.Lock() - defer cacheLock.Unlock() - homedirCache = "" -} - -func dirUnix() (string, error) { - homeEnv := "HOME" - if runtime.GOOS == "plan9" { - // On plan9, env vars are lowercase. - homeEnv = "home" - } - - // First prefer the HOME environmental variable - if home := os.Getenv(homeEnv); home != "" { - return home, nil - } - - var stdout bytes.Buffer - - // If that fails, try OS specific commands - if runtime.GOOS == "darwin" { - cmd := exec.Command("sh", "-c", `dscl -q . -read /Users/"$(whoami)" NFSHomeDirectory | sed 's/^[^ ]*: //'`) - cmd.Stdout = &stdout - if err := cmd.Run(); err == nil { - result := strings.TrimSpace(stdout.String()) - if result != "" { - return result, nil - } - } - } else { - cmd := exec.Command("getent", "passwd", strconv.Itoa(os.Getuid())) - cmd.Stdout = &stdout - if err := cmd.Run(); err != nil { - // If the error is ErrNotFound, we ignore it. Otherwise, return it. - if err != exec.ErrNotFound { - return "", err - } - } else { - if passwd := strings.TrimSpace(stdout.String()); passwd != "" { - // username:password:uid:gid:gecos:home:shell - passwdParts := strings.SplitN(passwd, ":", 7) - if len(passwdParts) > 5 { - return passwdParts[5], nil - } - } - } - } - - // If all else fails, try the shell - stdout.Reset() - cmd := exec.Command("sh", "-c", "cd && pwd") - cmd.Stdout = &stdout - if err := cmd.Run(); err != nil { - return "", err - } - - result := strings.TrimSpace(stdout.String()) - if result == "" { - return "", errors.New("blank output when reading home directory") - } - - return result, nil -} - -func dirWindows() (string, error) { - // First prefer the HOME environmental variable - if home := os.Getenv("HOME"); home != "" { - return home, nil - } - - // Prefer standard environment variable USERPROFILE - if home := os.Getenv("USERPROFILE"); home != "" { - return home, nil - } - - drive := os.Getenv("HOMEDRIVE") - path := os.Getenv("HOMEPATH") - home := drive + path - if drive == "" || path == "" { - return "", errors.New("HOMEDRIVE, HOMEPATH, or USERPROFILE are blank") - } - - return home, nil -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/muesli/reflow/ansi/ansi.go new/vendor/github.com/muesli/reflow/ansi/ansi.go --- old/vendor/github.com/muesli/reflow/ansi/ansi.go 1970-01-01 01:00:00.000000000 +0100 +++ new/vendor/github.com/muesli/reflow/ansi/ansi.go 2021-09-02 08:52:03.480889600 +0200 @@ -0,0 +1,7 @@ +package ansi + +const Marker = '\x1B' + +func IsTerminator(c rune) bool { + return (c >= 0x40 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/muesli/reflow/ansi/buffer.go new/vendor/github.com/muesli/reflow/ansi/buffer.go --- old/vendor/github.com/muesli/reflow/ansi/buffer.go 2021-08-07 07:27:29.001209000 +0200 +++ new/vendor/github.com/muesli/reflow/ansi/buffer.go 2021-09-02 08:52:03.483411300 +0200 @@ -11,26 +11,28 @@ bytes.Buffer } -// PrintableRuneWidth returns the width of all printable runes in the buffer. +// PrintableRuneWidth returns the cell width of all printable runes in the +// buffer. func (w Buffer) PrintableRuneWidth() int { return PrintableRuneWidth(w.String()) } +// PrintableRuneWidth returns the cell width of the given string. func PrintableRuneWidth(s string) int { var n int var ansi bool for _, c := range s { - if c == '\x1B' { + if c == Marker { // ANSI escape sequence ansi = true } else if ansi { - if (c >= 0x40 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a) { + if IsTerminator(c) { // ANSI sequence terminated ansi = false } } else { - n += runewidth.StringWidth(string(c)) + n += runewidth.RuneWidth(c) } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/muesli/reflow/ansi/writer.go new/vendor/github.com/muesli/reflow/ansi/writer.go --- old/vendor/github.com/muesli/reflow/ansi/writer.go 2021-08-07 07:27:29.001209000 +0200 +++ new/vendor/github.com/muesli/reflow/ansi/writer.go 2021-09-02 08:52:03.485958300 +0200 @@ -1,45 +1,48 @@ package ansi import ( + "bytes" "io" - "strings" + "unicode/utf8" ) type Writer struct { Forward io.Writer ansi bool - ansiseq string - lastseq string + ansiseq bytes.Buffer + lastseq bytes.Buffer seqchanged bool + runeBuf []byte } // Write is used to write content to the ANSI buffer. func (w *Writer) Write(b []byte) (int, error) { for _, c := range string(b) { - if c == '\x1B' { + if c == Marker { // ANSI escape sequence w.ansi = true w.seqchanged = true - w.ansiseq += string(c) + _, _ = w.ansiseq.WriteRune(c) } else if w.ansi { - w.ansiseq += string(c) - if (c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a) { + _, _ = w.ansiseq.WriteRune(c) + if IsTerminator(c) { // ANSI sequence terminated w.ansi = false - _, _ = w.Forward.Write([]byte(w.ansiseq)) - if strings.HasSuffix(w.ansiseq, "[0m") { + if bytes.HasSuffix(w.ansiseq.Bytes(), []byte("[0m")) { // reset sequence - w.lastseq = "" - } else if strings.HasSuffix(w.ansiseq, "m") { + w.lastseq.Reset() + w.seqchanged = false + } else if c == 'm' { // color code - w.lastseq = w.ansiseq + _, _ = w.lastseq.Write(w.ansiseq.Bytes()) } - w.ansiseq = "" + + _, _ = w.ansiseq.WriteTo(w.Forward) } } else { - _, err := w.Forward.Write([]byte(string(c))) + _, err := w.writeRune(c) if err != nil { return 0, err } @@ -49,8 +52,16 @@ return len(b), nil } +func (w *Writer) writeRune(r rune) (int, error) { + if w.runeBuf == nil { + w.runeBuf = make([]byte, utf8.UTFMax) + } + n := utf8.EncodeRune(w.runeBuf, r) + return w.Forward.Write(w.runeBuf[:n]) +} + func (w *Writer) LastSequence() string { - return w.lastseq + return w.lastseq.String() } func (w *Writer) ResetAnsi() { @@ -61,5 +72,5 @@ } func (w *Writer) RestoreAnsi() { - _, _ = w.Forward.Write([]byte(w.lastseq)) + _, _ = w.Forward.Write(w.lastseq.Bytes()) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/muesli/reflow/padding/padding.go new/vendor/github.com/muesli/reflow/padding/padding.go --- old/vendor/github.com/muesli/reflow/padding/padding.go 2021-08-07 07:27:29.001209000 +0200 +++ new/vendor/github.com/muesli/reflow/padding/padding.go 2021-09-02 08:52:03.499842600 +0200 @@ -6,7 +6,6 @@ "strings" "github.com/mattn/go-runewidth" - "github.com/muesli/reflow/ansi" ) @@ -18,6 +17,7 @@ ansiWriter *ansi.Writer buf bytes.Buffer + cache bytes.Buffer lineLen int ansi bool } @@ -48,7 +48,7 @@ func Bytes(b []byte, width uint) []byte { f := NewWriter(width, nil) _, _ = f.Write(b) - f.Close() + _ = f.Flush() return f.Bytes() } @@ -110,23 +110,34 @@ return nil } -// Close will finish the padding operation. Always call it before trying to -// retrieve the final result. -func (w *Writer) Close() error { - // don't pad empty trailing lines - if w.lineLen == 0 { - return nil - } - - return w.pad() +// Close will finish the padding operation. +func (w *Writer) Close() (err error) { + return w.Flush() } // Bytes returns the padded result as a byte slice. func (w *Writer) Bytes() []byte { - return w.buf.Bytes() + return w.cache.Bytes() } // String returns the padded result as a string. func (w *Writer) String() string { - return w.buf.String() + return w.cache.String() +} + +// Flush will finish the padding operation. Always call it before trying to +// retrieve the final result. +func (w *Writer) Flush() (err error) { + if w.lineLen != 0 { + if err = w.pad(); err != nil { + return + } + } + + w.cache.Reset() + _, err = w.buf.WriteTo(&w.cache) + w.lineLen = 0 + w.ansi = false + + return } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/muesli/reflow/truncate/truncate.go new/vendor/github.com/muesli/reflow/truncate/truncate.go --- old/vendor/github.com/muesli/reflow/truncate/truncate.go 1970-01-01 01:00:00.000000000 +0100 +++ new/vendor/github.com/muesli/reflow/truncate/truncate.go 2021-09-02 08:52:03.505404000 +0200 @@ -0,0 +1,120 @@ +package truncate + +import ( + "bytes" + "io" + + "github.com/mattn/go-runewidth" + + "github.com/muesli/reflow/ansi" +) + +type Writer struct { + width uint + tail string + + ansiWriter *ansi.Writer + buf bytes.Buffer + ansi bool +} + +func NewWriter(width uint, tail string) *Writer { + w := &Writer{ + width: width, + tail: tail, + } + w.ansiWriter = &ansi.Writer{ + Forward: &w.buf, + } + return w +} + +func NewWriterPipe(forward io.Writer, width uint, tail string) *Writer { + return &Writer{ + width: width, + tail: tail, + ansiWriter: &ansi.Writer{ + Forward: forward, + }, + } +} + +// Bytes is shorthand for declaring a new default truncate-writer instance, +// used to immediately truncate a byte slice. +func Bytes(b []byte, width uint) []byte { + return BytesWithTail(b, width, []byte("")) +} + +// Bytes is shorthand for declaring a new default truncate-writer instance, +// used to immediately truncate a byte slice. A tail is then added to the +// end of the byte slice. +func BytesWithTail(b []byte, width uint, tail []byte) []byte { + f := NewWriter(width, string(tail)) + _, _ = f.Write(b) + + return f.Bytes() +} + +// String is shorthand for declaring a new default truncate-writer instance, +// used to immediately truncate a string. +func String(s string, width uint) string { + return StringWithTail(s, width, "") +} + +// StringWithTail is shorthand for declaring a new default truncate-writer instance, +// used to immediately truncate a string. A tail is then added to the end of the +// string. +func StringWithTail(s string, width uint, tail string) string { + return string(BytesWithTail([]byte(s), width, []byte(tail))) +} + +// Write truncates content at the given printable cell width, leaving any +// ansi sequences intact. +func (w *Writer) Write(b []byte) (int, error) { + tw := ansi.PrintableRuneWidth(w.tail) + if w.width < uint(tw) { + return w.buf.WriteString(w.tail) + } + + w.width -= uint(tw) + var curWidth uint + + for _, c := range string(b) { + if c == ansi.Marker { + // ANSI escape sequence + w.ansi = true + } else if w.ansi { + if ansi.IsTerminator(c) { + // ANSI sequence terminated + w.ansi = false + } + } else { + curWidth += uint(runewidth.RuneWidth(c)) + } + + if curWidth > w.width { + n, err := w.buf.WriteString(w.tail) + if w.ansiWriter.LastSequence() != "" { + w.ansiWriter.ResetAnsi() + } + return n, err + } + + _, err := w.ansiWriter.Write([]byte(string(c))) + if err != nil { + return 0, err + } + } + + return len(b), nil +} + +// Bytes returns the truncated result as a byte slice. +func (w *Writer) Bytes() []byte { + return w.buf.Bytes() +} + +// String returns the truncated result as a string. +func (w *Writer) String() string { + return w.buf.String() +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/github.com/muesli/reflow/wordwrap/wordwrap.go new/vendor/github.com/muesli/reflow/wordwrap/wordwrap.go --- old/vendor/github.com/muesli/reflow/wordwrap/wordwrap.go 2021-08-07 07:27:29.001209000 +0200 +++ new/vendor/github.com/muesli/reflow/wordwrap/wordwrap.go 2021-09-02 08:52:03.510775800 +0200 @@ -46,7 +46,7 @@ func Bytes(b []byte, limit int) []byte { f := NewWriter(limit) _, _ = f.Write(b) - f.Close() + _ = f.Close() return f.Bytes() } @@ -59,7 +59,7 @@ func (w *WordWrap) addSpace() { w.lineLen += w.space.Len() - w.buf.Write(w.space.Bytes()) + _, _ = w.buf.Write(w.space.Bytes()) w.space.Reset() } @@ -67,13 +67,13 @@ if w.word.Len() > 0 { w.addSpace() w.lineLen += w.word.PrintableRuneWidth() - w.buf.Write(w.word.Bytes()) + _, _ = w.buf.Write(w.word.Bytes()) w.word.Reset() } } func (w *WordWrap) addNewLine() { - w.buf.WriteRune('\n') + _, _ = w.buf.WriteRune('\n') w.lineLen = 0 w.space.Reset() } @@ -101,10 +101,10 @@ for _, c := range s { if c == '\x1B' { // ANSI escape sequence - w.word.WriteRune(c) + _, _ = w.word.WriteRune(c) w.ansi = true } else if w.ansi { - w.word.WriteRune(c) + _, _ = w.word.WriteRune(c) if (c >= 0x40 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a) { // ANSI sequence terminated w.ansi = false @@ -117,7 +117,7 @@ w.lineLen = 0 } else { // preserve whitespace - w.buf.Write(w.space.Bytes()) + _, _ = w.buf.Write(w.space.Bytes()) } w.space.Reset() } @@ -127,15 +127,15 @@ } else if unicode.IsSpace(c) { // end of current word w.addWord() - w.space.WriteRune(c) + _, _ = w.space.WriteRune(c) } else if inGroup(w.Breakpoints, c) { // valid breakpoint w.addSpace() w.addWord() - w.buf.WriteRune(c) + _, _ = w.buf.WriteRune(c) } else { // any other character - w.word.WriteRune(c) + _, _ = w.word.WriteRune(c) // add a line break if the current word would exceed the line's // character limit diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/vendor/modules.txt new/vendor/modules.txt --- old/vendor/modules.txt 2021-08-07 07:27:29.077209700 +0200 +++ new/vendor/modules.txt 2021-09-02 08:52:05.703007200 +0200 @@ -1,8 +1,10 @@ -# github.com/AlecAivazis/survey/v2 v2.2.14 +# github.com/AlecAivazis/survey/v2 v2.3.1 +## explicit github.com/AlecAivazis/survey/v2 github.com/AlecAivazis/survey/v2/core github.com/AlecAivazis/survey/v2/terminal # github.com/MakeNowJust/heredoc v1.0.0 +## explicit github.com/MakeNowJust/heredoc # github.com/alecthomas/chroma v0.8.2 github.com/alecthomas/chroma @@ -43,22 +45,29 @@ github.com/aymerick/douceur/css github.com/aymerick/douceur/parser # github.com/briandowns/spinner v1.11.1 +## explicit github.com/briandowns/spinner # github.com/charmbracelet/glamour v0.3.0 +## explicit github.com/charmbracelet/glamour github.com/charmbracelet/glamour/ansi # github.com/cli/browser v1.1.0 +## explicit github.com/cli/browser # github.com/cli/oauth v0.8.0 +## explicit github.com/cli/oauth github.com/cli/oauth/api github.com/cli/oauth/device github.com/cli/oauth/webapp # github.com/cli/safeexec v1.0.0 +## explicit github.com/cli/safeexec # github.com/cpuguy83/go-md2man/v2 v2.0.0 +## explicit github.com/cpuguy83/go-md2man/v2/md2man # github.com/creack/pty v1.1.13 +## explicit github.com/creack/pty # github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 github.com/danwakefield/fnmatch @@ -70,53 +79,64 @@ # github.com/fatih/color v1.7.0 github.com/fatih/color # github.com/gabriel-vasile/mimetype v1.1.2 +## explicit github.com/gabriel-vasile/mimetype github.com/gabriel-vasile/mimetype/internal/json github.com/gabriel-vasile/mimetype/internal/matchers # github.com/google/go-cmp v0.5.5 +## explicit github.com/google/go-cmp/cmp github.com/google/go-cmp/cmp/internal/diff github.com/google/go-cmp/cmp/internal/flags github.com/google/go-cmp/cmp/internal/function github.com/google/go-cmp/cmp/internal/value # github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 +## explicit github.com/google/shlex # github.com/gorilla/css v1.0.0 github.com/gorilla/css/scanner # github.com/hashicorp/go-version v1.2.1 +## explicit github.com/hashicorp/go-version # github.com/henvic/httpretty v0.0.6 +## explicit github.com/henvic/httpretty github.com/henvic/httpretty/internal/color github.com/henvic/httpretty/internal/header # github.com/inconshreveable/mousetrap v1.0.0 github.com/inconshreveable/mousetrap # github.com/itchyny/gojq v0.12.4 +## explicit github.com/itchyny/gojq # github.com/itchyny/timefmt-go v0.1.3 github.com/itchyny/timefmt-go # github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 +## explicit github.com/kballard/go-shellquote # github.com/lucasb-eyer/go-colorful v1.2.0 github.com/lucasb-eyer/go-colorful # github.com/mattn/go-colorable v0.1.8 +## explicit github.com/mattn/go-colorable # github.com/mattn/go-isatty v0.0.13 +## explicit github.com/mattn/go-isatty # github.com/mattn/go-runewidth v0.0.10 github.com/mattn/go-runewidth # github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d +## explicit github.com/mgutz/ansi # github.com/microcosm-cc/bluemonday v1.0.6 github.com/microcosm-cc/bluemonday -# github.com/mitchellh/go-homedir v1.1.0 -github.com/mitchellh/go-homedir -# github.com/muesli/reflow v0.2.0 +# github.com/muesli/reflow v0.2.1-0.20210502190812-c80126ec2ad5 +## explicit github.com/muesli/reflow/ansi github.com/muesli/reflow/indent github.com/muesli/reflow/padding +github.com/muesli/reflow/truncate github.com/muesli/reflow/wordwrap # github.com/muesli/termenv v0.8.1 +## explicit github.com/muesli/termenv # github.com/olekukonko/tablewriter v0.0.5 github.com/olekukonko/tablewriter @@ -127,20 +147,26 @@ # github.com/russross/blackfriday/v2 v2.0.1 github.com/russross/blackfriday/v2 # github.com/shurcooL/githubv4 v0.0.0-20200928013246-d292edc3691b +## explicit github.com/shurcooL/githubv4 # github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f => github.com/cli/shurcooL-graphql v0.0.0-20200707151639-0f7232a2bf7e +## explicit github.com/shurcooL/graphql github.com/shurcooL/graphql/ident github.com/shurcooL/graphql/internal/jsonutil # github.com/shurcooL/sanitized_anchor_name v1.0.0 github.com/shurcooL/sanitized_anchor_name # github.com/spf13/cobra v1.2.1 +## explicit github.com/spf13/cobra # github.com/spf13/pflag v1.0.5 +## explicit github.com/spf13/pflag # github.com/stretchr/objx v0.1.1 +## explicit github.com/stretchr/objx # github.com/stretchr/testify v1.7.0 +## explicit github.com/stretchr/testify/assert github.com/stretchr/testify/mock github.com/stretchr/testify/require @@ -159,6 +185,7 @@ github.com/yuin/goldmark-emoji/ast github.com/yuin/goldmark-emoji/definition # golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 +## explicit golang.org/x/crypto/blake2b golang.org/x/crypto/curve25519 golang.org/x/crypto/internal/subtle @@ -171,17 +198,22 @@ golang.org/x/net/html golang.org/x/net/html/atom # golang.org/x/sync v0.0.0-20210220032951-036812b2e83c +## explicit golang.org/x/sync/errgroup # golang.org/x/sys v0.0.0-20210601080250-7ecdf8ef093b +## explicit golang.org/x/sys/cpu golang.org/x/sys/internal/unsafeheader golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows # golang.org/x/term v0.0.0-20210503060354-a79de5458b56 +## explicit golang.org/x/term # golang.org/x/text v0.3.5 golang.org/x/text/transform golang.org/x/text/width # gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b +## explicit gopkg.in/yaml.v3 +# github.com/shurcooL/graphql => github.com/cli/shurcooL-graphql v0.0.0-20200707151639-0f7232a2bf7e