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 @@
 [![Build 
Status](https://travis-ci.org/AlecAivazis/survey.svg?branch=feature%2Fpretty)](https://travis-ci.org/AlecAivazis/survey)
 
[![GoDoc](http://img.shields.io/badge/godoc-reference-5272B4.svg)](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

Reply via email to