commit e1cd29d96b51297625d5eb3dfdb20ac4a249731c Author: Mark Bailey Date: Thu Aug 29 09:30:13 2024 -0400 initial commit diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..268a135 --- /dev/null +++ b/LICENSE @@ -0,0 +1,5 @@ +Copyright © 2024 Mark Bailey + +I am the sole owner of this code, and provide it with no warranty or guarantee of safety. +You are free to use, modify, and redistribute this code, provided you attribute it's use +in your public facing documentation. diff --git a/cmd/getVersions.go b/cmd/getVersions.go new file mode 100644 index 0000000..4c0b566 --- /dev/null +++ b/cmd/getVersions.go @@ -0,0 +1,103 @@ +/* +Copyright © 2024 Mark Bailey +This file is part of a CLI application developed by Mark Bailey +*/ +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 _, k := range sortedVersions { + fmt.Println("Date: "+k.Value.Format(time.DateTime), "Version: "+k.Key) + } + }, +} + +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 splitByNewline(s string) []string { + strNormalized := regexp. + MustCompile("\r\n"). + ReplaceAllString(s, "\n") + return regexp. + MustCompile("^s*\n"). + Split(strNormalized, -1) +} + +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) +} diff --git a/cmd/root.go b/cmd/root.go new file mode 100644 index 0000000..277ea14 --- /dev/null +++ b/cmd/root.go @@ -0,0 +1,99 @@ +/* +Copyright © 2024 Mark Bailey +This file is part of a CLI application developed by Mark Bailey +*/ +package cmd + +import ( + "bufio" + "fmt" + "log" + "os" + "os/exec" + "strings" + + "github.com/spf13/cobra" +) + +var ( + // Flags + IgnoreUpgrade bool + Version string + + // Args + PkgName string +) + +var rootCmd = &cobra.Command{ + Use: "flatpak-downgrade", + Short: "Used to downgrade flatpak applications to a previous version.", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + PkgName = args[0] + + if Version == "" { + Version = GetPreviousVersion(PkgName) + } + + downgrade() + }, +} + +func downgrade() { + fmt.Println("Downgrading ", PkgName, "to ", Version) + + cmd := exec.Command("flatpak", "update", "--commit="+Version, PkgName) + + outpipe, _ := cmd.StdoutPipe() + defer outpipe.Close() + scanner := bufio.NewScanner(outpipe) + + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + err := cmd.Start() + if err != nil { + log.Fatal("Start Error: ", "\nPlease try running with root privileges.") + panic(err) + } + + var text string + for scanner.Scan() { + text = scanner.Text() + text + if strings.Contains(scanner.Text(), "Nothing to do.") { + os.Exit(0) + } + } + + fmt.Println("Text was: " + text) + + if IgnoreUpgrade { + mask() + } + + fmt.Println("Downgrade successful!") + os.Exit(0) +} + +func mask() { + mask := exec.Command("flatpak", "mask", PkgName) + maskErr := mask.Run() + if maskErr != nil { + log.Fatal("Error: ", maskErr, "\nPlease try running with root privileges.") + } else { + fmt.Println("Marked ", PkgName, " as ignored for upgrade.") + } +} + +func Execute() { + err := rootCmd.Execute() + if err != nil { + os.Exit(1) + } +} + +func init() { + rootCmd.Flags().BoolVarP(&IgnoreUpgrade, "ignore-upgrage", "i", false, "Mark flatpak as ignored for upgrade") + rootCmd.Flags().StringVarP(&Version, "version", "v", "", "Commit hash of the specific version") +} diff --git a/flatpak-downgrade b/flatpak-downgrade new file mode 100755 index 0000000..c30933c Binary files /dev/null and b/flatpak-downgrade differ diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..67f29a2 --- /dev/null +++ b/go.mod @@ -0,0 +1,9 @@ +module gitea.com/cerbervs/flatpak-downgrade + +go 1.23.0 + +require ( + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/spf13/cobra v1.8.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..912390a --- /dev/null +++ b/go.sum @@ -0,0 +1,10 @@ +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go new file mode 100644 index 0000000..7b4f72a --- /dev/null +++ b/main.go @@ -0,0 +1,11 @@ +/* +Copyright © 2024 Mark Bailey +This file is part of a CLI application developed by Mark Bailey +*/ +package main + +import "gitea.com/cerbervs/flatpak-downgrade/cmd" + +func main() { + cmd.Execute() +}