initial commit

This commit is contained in:
Mark Bailey 2024-08-29 09:30:13 -04:00
commit e1cd29d96b
7 changed files with 237 additions and 0 deletions

5
LICENSE Normal file
View File

@ -0,0 +1,5 @@
Copyright © 2024 Mark Bailey <gitea.com/cerbervs>
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.

103
cmd/getVersions.go Normal file
View File

@ -0,0 +1,103 @@
/*
Copyright © 2024 Mark Bailey <gitea.com/cerbervs>
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)
}

99
cmd/root.go Normal file
View File

@ -0,0 +1,99 @@
/*
Copyright © 2024 Mark Bailey <gitea.com/cerbervs>
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")
}

BIN
flatpak-downgrade Executable file

Binary file not shown.

9
go.mod Normal file
View File

@ -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
)

10
go.sum Normal file
View File

@ -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=

11
main.go Normal file
View File

@ -0,0 +1,11 @@
/*
Copyright © 2024 Mark Bailey <gitea.com/cerbervs>
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()
}