initial commit
This commit is contained in:
commit
e1cd29d96b
5
LICENSE
Normal file
5
LICENSE
Normal 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
103
cmd/getVersions.go
Normal 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
99
cmd/root.go
Normal 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
BIN
flatpak-downgrade
Executable file
Binary file not shown.
9
go.mod
Normal file
9
go.mod
Normal 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
10
go.sum
Normal 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=
|
Loading…
x
Reference in New Issue
Block a user