Skip to content

Commit

Permalink
Fixed self upgrade and added update
Browse files Browse the repository at this point in the history
  • Loading branch information
nicholasdille committed Jul 25, 2023
1 parent cc596b0 commit fbb19c5
Show file tree
Hide file tree
Showing 4 changed files with 125 additions and 80 deletions.
51 changes: 31 additions & 20 deletions cmd/uniget/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ var plan bool
var reinstall bool

func initInstallCmd() {
rootCmd.AddCommand(installCmd)

installCmd.Flags().BoolVar(&defaultMode, "default", false, "Install default tools")
installCmd.Flags().BoolVar(&tagsMode, "tags", false, "Install tool(s) matching tag")
installCmd.Flags().BoolVarP(&installedMode, "installed", "i", false, "Update installed tool(s)")
Expand All @@ -38,6 +36,8 @@ func initInstallCmd() {
installCmd.Flags().BoolVarP(&reinstall, "reinstall", "r", false, "Reinstall tool(s)")
installCmd.MarkFlagsMutuallyExclusive("default", "tags", "installed", "all", "file")
installCmd.MarkFlagsMutuallyExclusive("check", "plan")

rootCmd.AddCommand(installCmd)
}

var installCmd = &cobra.Command{
Expand Down Expand Up @@ -65,24 +65,10 @@ var installCmd = &cobra.Command{
} else if installedMode {
logging.Debug.Println("Collecting installed tools")
spinnerInstalledTools, _ := pterm.DefaultSpinner.Start("Collecting installed tools...")
for index, tool := range tools.Tools {
logging.Debug.Printfln("Getting status for requested tool %s", tool.Name)
tools.Tools[index].ReplaceVariables(prefix+"/"+target, arch, altArch)

err := tools.Tools[index].GetBinaryStatus()
if err != nil {
return fmt.Errorf("unable to determine binary status of %s: %s", tool.Name, err)
}

err = tools.Tools[index].GetMarkerFileStatus(prefix + "/" + cacheDirectory)
if err != nil {
return fmt.Errorf("unable to determine marker file status of %s: %s", tool.Name, err)
}

if tools.Tools[index].Status.MarkerFilePresent && tools.Tools[index].Status.BinaryPresent {
logging.Debug.Printfln("Adding %s to requested tools", tool.Name)
requestedTools.Tools = append(requestedTools.Tools, tool)
}
var err error
requestedTools, err = findInstalledTools(tools)
if err != nil {
return fmt.Errorf("unable to find installed tools: %s", err)
}
spinnerInstalledTools.Info()

Expand Down Expand Up @@ -122,6 +108,31 @@ var installCmd = &cobra.Command{
},
}

func findInstalledTools(tools tool.Tools) (tool.Tools, error) {
var requestedTools tool.Tools
for index, tool := range tools.Tools {
logging.Debug.Printfln("Getting status for requested tool %s", tool.Name)
tools.Tools[index].ReplaceVariables(prefix+"/"+target, arch, altArch)

err := tools.Tools[index].GetBinaryStatus()
if err != nil {
return requestedTools, fmt.Errorf("unable to determine binary status of %s: %s", tool.Name, err)
}

err = tools.Tools[index].GetMarkerFileStatus(prefix + "/" + cacheDirectory)
if err != nil {
return requestedTools, fmt.Errorf("unable to determine marker file status of %s: %s", tool.Name, err)
}

if tools.Tools[index].Status.MarkerFilePresent && tools.Tools[index].Status.BinaryPresent {
logging.Debug.Printfln("Adding %s to requested tools", tool.Name)
requestedTools.Tools = append(requestedTools.Tools, tool)
}
}

return requestedTools, nil
}

func installToolsByName(toolNames []string, check bool, plan bool, reinstall bool, skipDependencies bool, skipConflicts bool) error {
requestedTools := tools.GetByNames(toolNames)
return installTools(requestedTools, check, plan, reinstall, skipDependencies, skipConflicts)
Expand Down
1 change: 1 addition & 0 deletions cmd/uniget/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ func init() {
initMessageCmd()
initPostinstallCmd()
initSearchCmd()
initSelfUpgradeCmd()
initTagsCmd()
initUninstallCmd()
initUpdateCmd()
Expand Down
86 changes: 86 additions & 0 deletions cmd/uniget/self-upgrade.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package main

import (
"fmt"
"net/http"
"os"
"os/exec"
"path/filepath"
"regexp"
"runtime"

"github.com/pterm/pterm"
"github.com/spf13/cobra"
"github.com/uniget-org/cli/pkg/archive"
"github.com/uniget-org/cli/pkg/logging"
)

func initSelfUpgradeCmd() {
rootCmd.AddCommand(selfUpgradeCmd)
}

var selfUpgradeCmd = &cobra.Command{
Use: "self-upgrade",
Short: "Self upgrade " + projectName,
Long: header + "\nUpgrade " + projectName + " to latest version",
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
versionRegex := regexp.MustCompile(`^\d+\.\d+\.\d+(-\w+)?$`)
if !versionRegex.MatchString(version) {
pterm.Warning.Printf("Version is %s and does not match a.b.c\n", version)
return nil
}

selfExe := filepath.Base(os.Args[0])
if selfExe == "." {
return fmt.Errorf("failed to get base name for %s", os.Args[0])
}
if selfExe != "uniget" {
pterm.Warning.Printf("Binary must be called uniget but is %s\n", selfExe)
return nil
}

path, err := exec.LookPath(selfExe)
if err != nil {
pterm.Error.Printfln("Failed to find %s in PATH", selfExe)
return fmt.Errorf("failed to find %s in PATH: %s", selfExe, err)
}
fmt.Printf("%s is available at %s\n", selfExe, path)
selfDir := filepath.Dir(path)

url := fmt.Sprintf("https://github.com/%s/releases/latest/download/uniget_%s_%s.tar.gz", projectRepository, runtime.GOOS, arch)
logging.Debug.Printfln("Downloading %s", url)
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return fmt.Errorf("failed to create request: %s", err)
}
req.Header.Set("Accept", "application/octet-stream")
req.Header.Set("User-Agent", fmt.Sprintf("%s/%s", projectName, version))
resp, err := client.Do(req)
if err != nil {
return fmt.Errorf("failed to download %s: %s", url, err)
}
defer resp.Body.Close()

if resp.StatusCode != 200 {
return fmt.Errorf("failed to download %s: %s", url, resp.Status)
}

logging.Debug.Printfln("Extracting tar.gz")
err = os.Chdir(selfDir)
if err != nil {
return fmt.Errorf("error changing directory to %s: %s", selfDir, err)
}
err = os.Remove(selfExe)
if err != nil {
return fmt.Errorf("failed to remove %s: %s", selfExe, err)
}
err = archive.ExtractTarGz(resp.Body)
if err != nil {
return fmt.Errorf("failed to extract tar.gz: %s", err)
}

return nil
},
}
67 changes: 7 additions & 60 deletions cmd/uniget/upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,81 +2,28 @@ package main

import (
"fmt"
"net/http"
"os"
"path/filepath"
"regexp"
"runtime"

"github.com/pterm/pterm"
"github.com/spf13/cobra"
"github.com/uniget-org/cli/pkg/archive"
"github.com/uniget-org/cli/pkg/logging"
)

func initUpgradeCmd() {
upgradeCmd.Flags().BoolVar(&plan, "plan", false, "Show tool(s) planned installation")

rootCmd.AddCommand(upgradeCmd)
}

var upgradeCmd = &cobra.Command{
Use: "upgrade",
Short: "Upgrade " + projectName,
Long: header + "\nUpgrade " + projectName + " to latest version",
Short: "Upgrade all tools",
Long: header + "\nUpgrade all tools to latest version",
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
versionRegex := regexp.MustCompile(`^\d+\.\d+\.\d+(-\w+)?$`)
if !versionRegex.MatchString(version) {
pterm.Warning.Printf("Version is %s and does not match a.b.c\n", version)
return nil
}

selfExe := filepath.Base(os.Args[0])
if selfExe == "." {
return fmt.Errorf("failed to get base name for %s", os.Args[0])
}
if selfExe != "uniget" {
pterm.Warning.Printf("Binary must be called uniget but is %s\n", selfExe)
return nil
}

selfDir, err := filepath.Abs(filepath.Dir(os.Args[0]))
requestdTools, err := findInstalledTools(tools)
if err != nil {
return fmt.Errorf("failed to get absolute path: %s", err)
return fmt.Errorf("failed to find installed tools: %s", err)
}
logging.Info.Printfln("Replacing uniget in %s", selfDir)

url := fmt.Sprintf("https://github.com/%s/releases/latest/download/uniget_%s_%s.tar.gz", projectRepository, runtime.GOOS, arch)
logging.Debug.Printfln("Downloading %s", url)
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return fmt.Errorf("failed to create request: %s", err)
}
req.Header.Set("Accept", "application/octet-stream")
req.Header.Set("User-Agent", fmt.Sprintf("%s/%s", projectName, version))
resp, err := client.Do(req)
if err != nil {
return fmt.Errorf("failed to download %s: %s", url, err)
}
defer resp.Body.Close()

if resp.StatusCode != 200 {
return fmt.Errorf("failed to download %s: %s", url, resp.Status)
}

logging.Debug.Printfln("Extracting tar.gz")
err = os.Chdir(selfDir)
if err != nil {
return fmt.Errorf("error changing directory to %s: %s", selfDir, err)
}
err = os.Remove(selfExe)
if err != nil {
return fmt.Errorf("failed to remove %s: %s", selfExe, err)
}
err = archive.ExtractTarGz(resp.Body)
if err != nil {
return fmt.Errorf("failed to extract tar.gz: %s", err)
}
installTools(requestdTools, false, plan, false, false, false)

return nil
},
Expand Down

0 comments on commit fbb19c5

Please sign in to comment.