github.com/sqlitebrowser/dio@v0.0.0-20240125125356-b587368e5c6b/cmd/releaseList.go (about)

     1  package cmd
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"sort"
     7  	"time"
     8  
     9  	"github.com/spf13/cobra"
    10  )
    11  
    12  // Displays the list of releases for a remote database
    13  var releaseListCmd = &cobra.Command{
    14  	Use:   "releases [database name]",
    15  	Short: "Displays a list of releases for a database",
    16  	RunE: func(cmd *cobra.Command, args []string) error {
    17  		return releaseList(args)
    18  	},
    19  }
    20  
    21  func init() {
    22  	RootCmd.AddCommand(releaseListCmd)
    23  }
    24  
    25  func releaseList(args []string) error {
    26  	// Ensure a database file was given
    27  	var db string
    28  	var err error
    29  	var meta metaData
    30  	if len(args) == 0 {
    31  		db, err = getDefaultDatabase()
    32  		if err != nil {
    33  			return err
    34  		}
    35  		if db == "" {
    36  			// No database name was given on the command line, and we don't have a default database selected
    37  			return errors.New("No database file specified")
    38  		}
    39  	} else {
    40  		db = args[0]
    41  	}
    42  	if len(args) > 1 {
    43  		return errors.New("Only one database can be worked with at a time (for now)")
    44  	}
    45  
    46  	// If there is a local metadata cache for the requested database, use that.  Otherwise, retrieve it from the
    47  	// server first (without storing it)
    48  	meta, err = localFetchMetadata(db, true)
    49  	if err != nil {
    50  		return err
    51  	}
    52  
    53  	if len(meta.Releases) == 0 {
    54  		_, err = fmt.Fprintf(fOut, "Database %s has no releases\n", db)
    55  		return err
    56  	}
    57  
    58  	// Sort the list alphabetically
    59  	var sortedKeys []string
    60  	for k := range meta.Releases {
    61  		sortedKeys = append(sortedKeys, k)
    62  	}
    63  	sort.Strings(sortedKeys)
    64  
    65  	// Display the list of releases
    66  	_, err = fmt.Fprintf(fOut, "Releases for %s:\n\n", db)
    67  	if err != nil {
    68  		return err
    69  	}
    70  	for _, i := range sortedKeys {
    71  		_, err = fmt.Fprintf(fOut, "  * '%s' : commit %s\n\n", i, meta.Releases[i].Commit)
    72  		if err != nil {
    73  			return err
    74  		}
    75  		_, err = fmt.Fprintf(fOut, "      Author: %s <%s>\n", meta.Releases[i].ReleaserName, meta.Releases[i].ReleaserEmail)
    76  		if err != nil {
    77  			return err
    78  		}
    79  		_, err = fmt.Fprintf(fOut, "      Date: %s\n", meta.Releases[i].Date.Format(time.UnixDate))
    80  		if err != nil {
    81  			return err
    82  		}
    83  		_, err = fmt.Fprintln(fOut, numFormat.Sprintf("      Size: %d", meta.Releases[i].Size))
    84  		if err != nil {
    85  			return err
    86  		}
    87  		if meta.Releases[i].Description != "" {
    88  			_, err = fmt.Fprintf(fOut, "      Message: %s\n\n", meta.Releases[i].Description)
    89  			if err != nil {
    90  				return err
    91  			}
    92  		} else {
    93  			_, err = fmt.Fprintln(fOut)
    94  			if err != nil {
    95  				return err
    96  			}
    97  		}
    98  	}
    99  	return nil
   100  }