Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use go template for powershell, golang and node #1095

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmd/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import (

// MakeGet creates the Get command to download software
func MakeGet() *cobra.Command {
tools := get.MakeTools()
tools := get.MakeToolsWithoutSystemApp()
sort.Sort(tools)
var validToolOptions []string = make([]string, len(tools))
for _, t := range tools {
Expand Down
81 changes: 12 additions & 69 deletions cmd/system/go.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,10 @@ package system

import (
"fmt"
"io"
"net/http"
"os"
"path"
"strings"

"github.com/alexellis/arkade/pkg"
"github.com/alexellis/arkade/pkg/archive"
"github.com/alexellis/arkade/pkg/env"
"github.com/alexellis/arkade/pkg/get"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -53,51 +49,31 @@ func MakeInstallGo() *cobra.Command {
return fmt.Errorf("this app only supports Linux")
}

dlArch := arch
if arch == "x86_64" {
dlArch = "amd64"
} else if arch == "aarch64" {
dlArch = "arm64"
} else if arch == "armv7" || arch == "armv7l" {
dlArch = "armv6l"
}

if len(version) == 0 {
v, err := getGoVersion()
if err != nil {
return err
tools := get.MakeTools()
var tool *get.Tool
for _, t := range tools {
if t.Name == "go" {
tool = &t
break
}

version = v
} else if !strings.HasPrefix(version, "go") {
version = "go" + version
}

fmt.Printf("Installing version: %s for: %s\n", version, dlArch)

dlURL := fmt.Sprintf("https://go.dev/dl/%s.%s-%s.tar.gz", version, strings.ToLower(osVer), dlArch)
fmt.Printf("Downloading from: %s\n", dlURL)
if tool == nil {
return fmt.Errorf("unable to find go definition")
}

progress, _ := cmd.Flags().GetBool("progress")
outPath, err := get.DownloadFileP(dlURL, progress)
tempPath, err := get.DownloadNested(tool, arch, osVer, version, installPath, progress, !progress)
if err != nil {
return err
}
defer os.Remove(outPath)

fmt.Printf("Downloaded to: %s\n", outPath)

f, err := os.OpenFile(outPath, os.O_RDONLY, 0644)
err = get.MoveTo(tempPath, installPath)
if err != nil {
return err
}
defer f.Close()

fmt.Printf("Unpacking Go to: %s\n", path.Join(installPath, "go"))

if err := archive.UntarNested(f, installPath, true, false); err != nil {
return err
}
fmt.Printf("Downloaded to: %sgo\n", installPath)

fmt.Printf("\nexport PATH=$PATH:%s:$HOME/go/bin\n"+
"export GOPATH=$HOME/go/\n", path.Join(installPath, "go", "bin"))
Expand All @@ -107,36 +83,3 @@ func MakeInstallGo() *cobra.Command {

return command
}

func getGoVersion() (string, error) {
req, err := http.NewRequest(http.MethodGet, "https://go.dev/VERSION?m=text", nil)
if err != nil {
return "", err
}

req.Header.Set("User-Agent", pkg.UserAgent())

res, err := http.DefaultClient.Do(req)
if err != nil {
return "", err
}

if res.Body == nil {
return "", fmt.Errorf("unexpected empty body")
}

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

if res.StatusCode != http.StatusOK {
return "", fmt.Errorf("unexpected status code: %d", res.StatusCode)
}

content := strings.TrimSpace(string(body))
version, _, ok := strings.Cut(content, "\n")
if !ok {
return "", fmt.Errorf("format unexpected: %q", content)
}

return version, nil
}
95 changes: 27 additions & 68 deletions cmd/system/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,58 +2,14 @@ package system

import (
"fmt"
"io"
"net/http"
"os"
"regexp"
"strings"

"github.com/alexellis/arkade/pkg"
"github.com/alexellis/arkade/pkg/archive"
"github.com/alexellis/arkade/pkg/env"
"github.com/alexellis/arkade/pkg/get"
cp "github.com/otiai10/copy"
"github.com/spf13/cobra"
)

func getLatestNodeVersion(version, channel string) (*string, error) {
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("https://nodejs.org/download/%s/%s", channel, version), nil)
if err != nil {
return nil, err
}

req.Header.Set("User-Agent", pkg.UserAgent())

res, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}

if res.Body != nil {
defer res.Body.Close()
}

body, err := io.ReadAll(res.Body)
if err != nil {
return nil, err
}

if res.StatusCode != http.StatusOK {
return nil, fmt.Errorf("could not find latest version for %s, (%d), body: %s", version, res.StatusCode, string(body))
}

regex := regexp.MustCompile(`(?m)node-v(\d+.\d+.\d+)-linux-.*`)
result := regex.FindStringSubmatch(string(body))

if len(result) < 2 {
if v, ok := os.LookupEnv("ARK_DEBUG"); ok && v == "1" {
fmt.Printf("Body: %s\n", string(body))
}
return nil, fmt.Errorf("could not find latest version for %s, (%d), %s", version, res.StatusCode, result)
}
return &result[1], nil
}

func MakeInstallNode() *cobra.Command {
command := &cobra.Command{
Use: "node",
Expand Down Expand Up @@ -94,12 +50,18 @@ func MakeInstallNode() *cobra.Command {
dlArch = "arm64"
}

resolver := &get.NodeVersionResolver{
Channel: channel,
Version: version,
}

if (version == "latest" || strings.Contains(version, "latest-")) && channel == "release" {
v, err := getLatestNodeVersion(version, channel)
v, err := resolver.GetVersion()
if err != nil {
return err
}
version = *v
version = v
resolver.Version = v
} else if (version == "latest" || strings.Contains(version, "latest-")) && channel == "nightly" {
return fmt.Errorf("please set a specific version for downloading a nightly builds")
}
Expand All @@ -108,39 +70,36 @@ func MakeInstallNode() *cobra.Command {
version = "v" + version
}

fmt.Printf("Installing version: %s for: %s\n", version, dlArch)
filename := fmt.Sprintf("%s/%s.tar.gz", version, fmt.Sprintf("node-%s-linux-%s", version, dlArch))
dlURL := fmt.Sprintf("https://nodejs.org/download/%s/%s", channel, filename)
tools := get.MakeTools()
var tool *get.Tool
for _, t := range tools {
if t.Name == "node" {
tool = &t
break
}
}

fmt.Printf("Downloading from: %s\n", dlURL)
outPath, err := get.DownloadFileP(dlURL, progress)
if err != nil {
return err
if tool == nil {
return fmt.Errorf("unable to find node definition")
}
defer os.Remove(outPath)
fmt.Printf("Downloaded to: %s\n", outPath)

f, err := os.OpenFile(outPath, os.O_RDONLY, 0644)
if err != nil {
return err
tool.VersionResolver = &get.NodeVersionResolver{
Channel: channel,
Version: version,
}
defer f.Close()

tempUnpackPath, err := os.MkdirTemp(os.TempDir(), fmt.Sprintf("%s*", "node"))
tempPath, err := get.DownloadNested(tool, arch, osVer, version, installPath, progress, !progress)
defer os.RemoveAll(tempPath)
if err != nil {
return err
}
defer os.RemoveAll(tempUnpackPath)
fmt.Printf("Unpacking binaries to: %s\n", tempUnpackPath)
if err = archive.UntarNested(f, tempUnpackPath, true, false); err != nil {
return err
}
fmt.Printf("Temp Path: %s \n", tempPath)

fmt.Printf("Copying binaries to: %s\n", installPath)
nodeDir := fmt.Sprintf("%s/%s", tempUnpackPath, fmt.Sprintf("node-%s-linux-%s", version, dlArch))
if err := cp.Copy(nodeDir, installPath); err != nil {
err = get.MoveFromInternalDir(fmt.Sprintf("node-%s-linux-%s", version, dlArch), tempPath, installPath)
if err != nil {
return err
}

return nil
}
return command
Expand Down
50 changes: 14 additions & 36 deletions cmd/system/powershell.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"strings"

"github.com/Masterminds/semver"
"github.com/alexellis/arkade/pkg/archive"
"github.com/alexellis/arkade/pkg/env"
"github.com/alexellis/arkade/pkg/get"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -48,17 +47,21 @@ func MakeInstallPowershell() *cobra.Command {
arch, _ = cmd.Flags().GetString("arch")
}

dlArch := arch
if arch == "x86_64" {
dlArch = "x64"
} else if arch == "aarch64" {
dlArch = "arm64"
} else if arch == "armv7" || arch == "armv7l" {
dlArch = "arm32"
tools := get.MakeTools()
var tool *get.Tool
for _, t := range tools {
if t.Name == "pwsh" {
tool = &t
break
}
}

if tool == nil {
return fmt.Errorf("unable to find powershell definition")
}

if version == "" {
v, err := get.FindGitHubRelease("PowerShell", "PowerShell")
v, err := get.FindGitHubRelease(tool.Owner, tool.Repo)
if err != nil {
return err
}
Expand All @@ -67,50 +70,25 @@ func MakeInstallPowershell() *cobra.Command {
version = "v" + version
}

fmt.Printf("Installing version: %s for: %s\n", version, dlArch)

semVer := semver.MustParse(version)
majorVersion := semVer.Major()
// semVer := strings.TrimPrefix(version, "v")

// majorVerDemlimiter := strings.Index(semVer, ".")
// majorVersion := semVer[:majorVerDemlimiter]

installPath = fmt.Sprintf("%s/%d", installPath, majorVersion)

fmt.Printf("Installing Powershell to %s\n", installPath)

installPath = strings.ReplaceAll(installPath, "$HOME", os.Getenv("HOME"))

if err := os.MkdirAll(installPath, 0755); err != nil && !os.IsExist(err) {
fmt.Printf("Error creating directory %s, error: %s\n", installPath, err.Error())
}

filename := fmt.Sprintf("powershell-%s-linux-%s.tar.gz", semVer, dlArch)
dlURL := fmt.Sprintf(githubDownloadTemplate, "PowerShell", "PowerShell", version, filename)

fmt.Printf("Downloading from: %s\n", dlURL)

progress, _ := cmd.Flags().GetBool("progress")
outPath, err := get.DownloadFileP(dlURL, progress)
tempPath, err := get.DownloadNested(tool, arch, osVer, version, installPath, progress, !progress)
if err != nil {
return err
}
defer os.Remove(outPath)

fmt.Printf("Downloaded to: %s\n", outPath)

f, err := os.OpenFile(outPath, os.O_RDONLY, 0644)
err = get.MoveTo(tempPath, installPath)
if err != nil {
return err
}
defer f.Close()

fmt.Printf("Unpacking Powershell to: %s\n", installPath)

if err := archive.Untar(f, installPath, true, true); err != nil {
return err
}

lnPath := "/usr/bin/pwsh"
fmt.Printf("Creating Symbolic link to: %s\n", lnPath)
Expand Down
Loading
Loading