2024-09-14 15:35:54 -04:00

108 lines
2.1 KiB
Go

// Package cmd
package cmd
import (
"errors"
"fmt"
"github.com/spf13/cobra"
"log"
"os"
"os/exec"
)
var (
// Flags
Mask bool
Unmask 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)
}
if err := downgrade(); err != nil {
fmt.Println("\n\nFailed to downgrade ", PkgName, " to ", Version)
log.Fatal(err)
} else {
fmt.Println("Successfully downgraded ", PkgName, " to ", Version)
}
},
}
func downgrade() error {
fmt.Println("Downgrading ", PkgName, "to ", Version)
if Mask && Unmask {
return errors.New("please choose either --mask or --unmask, not both")
}
cmd := exec.Command("flatpak", "update", "--commit="+Version, PkgName)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if Unmask {
unmask()
}
err := cmd.Run()
if err != nil {
return err
}
if Mask {
mask()
}
return nil
}
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 unmask() {
mask := exec.Command("flatpak", "mask", "--remove", PkgName)
maskErr := mask.Run()
if maskErr != nil {
log.Fatal("Error: ", maskErr, "\nPlease try running with root privileges.")
} else {
fmt.Println("Marked ", PkgName, " as upgradable.")
}
}
func Execute() {
err := rootCmd.Execute()
if err != nil {
os.Exit(1)
}
}
func init() {
rootCmd.Flags().BoolVarP(&Mask, "mask", "m", false, "Mark flatpak as ignored for upgrade")
rootCmd.Flags().BoolVarP(&Unmask, "unmask", "u", false, "Mark flatpak as upgradable")
rootCmd.Flags().StringVarP(&Version, "version", "v", "", "Commit hash of the specific version")
}
/*
* Copyright © 2024 Mark Bailey <gitea.com/cerbervs>
* This file is part of a CLI application developed by Mark Bailey
*/