flatpak-downgrade/cmd/getVersions.go
2024-09-14 15:29:26 -04:00

114 lines
2.3 KiB
Go

// Package cmd
package cmd
import (
"bytes"
"fmt"
"log"
"os/exec"
"regexp"
"sort"
"time"
"github.com/spf13/cobra"
)
type kv struct {
Key string
Value time.Time
}
var getVersionsCmd = &cobra.Command{
Use: "get-versions",
Short: "Get the versions of a flatpak by package name as commit hashes.",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
versions := GetVersions(args[0])
sortedVersions := sortByKeys(versions)
for i, k := range sortedVersions {
dateOutput := "| Date: " + k.Value.Format(time.DateTime) + " | "
versionOutput := "Version: " + k.Key + " |"
dateLen := len(dateOutput)
versionLen := len(versionOutput)
headfoot := "|"
for i := 0; i < dateLen-3; i++ {
headfoot += "-"
}
headfoot += "+"
for i := 0; i < versionLen; i++ {
headfoot += "-"
}
headfoot += "|"
if i == 0 {
fmt.Println(headfoot)
}
fmt.Println(dateOutput + versionOutput)
fmt.Println(headfoot)
}
},
}
func GetVersions(pkgName string) map[string]time.Time {
cmd := exec.Command("flatpak", "remote-info", "--log", "flathub", pkgName)
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
output := out.String()
commitRegex := regexp.MustCompile(`(?m)Commit: (.*)`)
dateRegex := regexp.MustCompile(`(?m)Date: (.*)`)
_ = dateRegex
versions := make(map[string]time.Time)
commitMatches := commitRegex.FindAllStringSubmatch(output, -1)
dateMatches := dateRegex.FindAllStringSubmatch(output, -1)
for i, match := range commitMatches {
t, err := time.Parse("2006-01-02 15:04:05 -0700", dateMatches[i][1])
if err != nil {
continue
}
versions[match[1]] = t
}
return versions
}
func GetPreviousVersion(pkgName string) string {
versions := GetVersions(pkgName)
sortedVersions := sortByKeys(versions)
var previousVersion string
for i, k := range sortedVersions {
if i == 1 {
previousVersion = k.Key
}
}
return previousVersion
}
func sortByKeys(m map[string]time.Time) []kv {
var ss []kv
for k, v := range m {
ss = append(ss, kv{k, v})
}
sort.Slice(ss, func(i, j int) bool {
return ss[i].Value.After(ss[j].Value)
})
return ss
}
func init() {
rootCmd.AddCommand(getVersionsCmd)
}
/*
Copyright © 2024 Mark Bailey <gitea.com/cerbervs>
This file is part of a CLI application developed by Mark Bailey
*/