1515package cmd
1616
1717import (
18+ "errors"
1819 "fmt"
1920 "io"
2021 "os"
@@ -43,12 +44,12 @@ func getFileMetadata(c files.Client, path string) (files.IsMetadata, error) {
4344
4445// Invoked by search.go
4546func printFolderMetadata (w io.Writer , e * files.FolderMetadata , longFormat bool ) {
46- fmt .Fprint (w , formatFolderMetadata (e , longFormat ))
47+ _ , _ = fmt .Fprint (w , formatFolderMetadata (e , longFormat ))
4748}
4849
4950// Invoked by search.go and revs.go
5051func printFileMetadata (w io.Writer , e * files.FileMetadata , longFormat bool ) {
51- fmt .Fprint (w , formatFileMetadata (e , longFormat ))
52+ _ , _ = fmt .Fprint (w , formatFileMetadata (e , longFormat ))
5253}
5354
5455func formatFolderMetadata (e * files.FolderMetadata , longFormat bool ) string {
@@ -80,7 +81,7 @@ func formatDeletedMetadata(e *files.DeletedMetadata, longFormat bool) string {
8081 return text
8182}
8283
83- func SetPathDisplayAsDeleted (metadata files.IsMetadata ) {
84+ func setPathDisplayAsDeleted (metadata files.IsMetadata ) {
8485 switch item := metadata .(type ) {
8586 case * files.FileMetadata :
8687 item .PathDisplay = fmt .Sprintf (deletedItemFormatString , item .PathDisplay )
@@ -127,16 +128,16 @@ func ls(cmd *cobra.Command, args []string) (err error) {
127128 itemCounter := 0
128129 printItem := func (message string ) {
129130 itemCounter = itemCounter + 1
130- fmt .Fprint (w , message )
131+ _ , _ = fmt .Fprint (w , message )
131132 if (itemCounter % 4 == 0 ) || opts .long {
132- fmt .Fprintln (w )
133+ _ , _ = fmt .Fprintln (w )
133134 }
134135 }
135136
136137 dbx := files .New (config )
137138
138139 if opts .long {
139- fmt .Fprint (w , "Revision\t Size\t Last modified\t Path\n " )
140+ _ , _ = fmt .Fprint (w , "Revision\t Size\t Last modified\t Path\n " )
140141 }
141142
142143 if path != "" {
@@ -150,8 +151,7 @@ func ls(cmd *cobra.Command, args []string) (err error) {
150151 case * files.FileMetadata :
151152 if ! onlyDeleted {
152153 printItem (formatFileMetadataWithOpts (f , opts ))
153- err = w .Flush ()
154- return err
154+ return finishListOutput (w , itemCounter , opts )
155155 }
156156 }
157157 }
@@ -160,22 +160,14 @@ func ls(cmd *cobra.Command, args []string) (err error) {
160160
161161 var entries []files.IsMetadata
162162 if err != nil {
163- listRevisionError , ok := err .(files.ListRevisionsAPIError )
164- if ok {
165- // Don't treat a "not_folder" error as fatal; recover by sending a
166- // get_metadata request for the same path and using that response instead.
167- if listRevisionError .EndpointError .Path .Tag == files .LookupErrorNotFolder {
168- var metaRes files.IsMetadata
169- metaRes , _ = getFileMetadata (dbx , path )
170- entries = []files.IsMetadata {metaRes }
171- } else {
172- // Return if there's an error other than "not_folder" or if the follow-up
173- // metadata request fails.
174- return err
175- }
176- } else {
163+ if ! isListFolderNotFolderError (err ) {
177164 return err
178165 }
166+ // Don't treat a "not_folder" error as fatal; recover by sending a
167+ // get_metadata request for the same path and using that response instead.
168+ var metaRes files.IsMetadata
169+ metaRes , _ = getFileMetadata (dbx , path )
170+ entries = []files.IsMetadata {metaRes }
179171 } else {
180172 entries = res .Entries
181173
@@ -199,26 +191,22 @@ func ls(cmd *cobra.Command, args []string) (err error) {
199191 revisionArg := files .NewListRevisionsArg (deletedItem .PathLower )
200192 res , err := dbx .ListRevisions (revisionArg )
201193 if err != nil {
202- listRevisionError , ok := err .(files.ListRevisionsAPIError )
203- if ok {
204- // We have a ListRevisionsAPIERror
205- if listRevisionError .EndpointError .Path .Tag == files .LookupErrorNotFile {
206- // Don't treat a "not_file" error as fatal; recover by sending a
207- // get_metadata request for the same path and using that response instead.
208- revision , err := getFileMetadata (dbx , deletedItem .PathLower )
209- if err != nil {
210- return err
211- }
212- entry = revision
194+ if isListRevisionsNotFileError (err ) {
195+ // Don't treat a "not_file" error as fatal; recover by sending a
196+ // get_metadata request for the same path and using that response instead.
197+ revision , err := getFileMetadata (dbx , deletedItem .PathLower )
198+ if err != nil {
199+ return err
213200 }
201+ entry = revision
214202 }
215203 } else if len (res .Entries ) == 0 {
216204 // Occasionally revisions will be returned with an empty Revision entry list.
217205 // So we just use the original entry.
218206 } else {
219207 entry = res .Entries [0 ]
220208 }
221- SetPathDisplayAsDeleted (entry )
209+ setPathDisplayAsDeleted (entry )
222210 }
223211 switch f := entry .(type ) {
224212 case * files.FileMetadata :
@@ -234,8 +222,30 @@ func ls(cmd *cobra.Command, args []string) (err error) {
234222 }
235223 }
236224
237- err = w .Flush ()
238- return err
225+ return finishListOutput (w , itemCounter , opts )
226+ }
227+
228+ func isListFolderNotFolderError (err error ) bool {
229+ var apiErr files.ListFolderAPIError
230+ return errors .As (err , & apiErr ) &&
231+ apiErr .EndpointError != nil &&
232+ apiErr .EndpointError .Path != nil &&
233+ apiErr .EndpointError .Path .Tag == files .LookupErrorNotFolder
234+ }
235+
236+ func isListRevisionsNotFileError (err error ) bool {
237+ var apiErr files.ListRevisionsAPIError
238+ return errors .As (err , & apiErr ) &&
239+ apiErr .EndpointError != nil &&
240+ apiErr .EndpointError .Path != nil &&
241+ apiErr .EndpointError .Path .Tag == files .LookupErrorNotFile
242+ }
243+
244+ func finishListOutput (w * tabwriter.Writer , itemCounter int , opts listOptions ) error {
245+ if itemCounter > 0 && ! opts .long && itemCounter % 4 != 0 {
246+ _ , _ = fmt .Fprintln (w )
247+ }
248+ return w .Flush ()
239249}
240250
241251// lsCmd represents the ls command
0 commit comments