-
Notifications
You must be signed in to change notification settings - Fork 1
/
nodejs.go
113 lines (96 loc) · 2.98 KB
/
nodejs.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package cmd
import (
"errors"
"fmt"
"os"
"path"
"github.com/mholt/archiver/v3"
Checksum "github.com/researchgate/nodejs-simple-downloader/nsd/checksum"
Download "github.com/researchgate/nodejs-simple-downloader/nsd/download"
NodeJs "github.com/researchgate/nodejs-simple-downloader/nsd/nodejs"
"github.com/spf13/cobra"
)
var (
nodejsVersion string
nodejsVersionfromFile string
nodejsCommand = &cobra.Command{
Use: "nodejs [path]",
Short: "Download Node.js to specific folder",
Long: "",
Args: func(cmd *cobra.Command, args []string) error {
if len(args) < 1 {
return errors.New("requires a path argument")
}
return nil
},
RunE: func(cmd *cobra.Command, args []string) (err error) {
downloadPath := args[0]
err = prepareNodejsFlags()
if err != nil {
return
}
nodeURL := fmt.Sprintf(string(NodeJs.CurrentURL)+"node-v%s-%s.%s", nodejsVersion, nodejsVersion, NodeJs.CurrentArch, NodeJs.CurrentExtension)
nodeFilePath, err := Download.File(nodeURL)
if err != nil {
return
}
defer os.Remove(nodeFilePath)
checksumURL := fmt.Sprintf(string(NodeJs.CurrentURL)+"SHASUMS256.txt", nodejsVersion)
checkusmFilePath, err := Download.File(checksumURL)
if err != nil {
return
}
defer os.Remove(checkusmFilePath)
checksum, err := Checksum.CalculateSHA256(nodeFilePath)
if err != nil {
return
}
verified, err := Checksum.Verify(checksum, path.Base(nodeFilePath), checkusmFilePath)
if err != nil {
return
}
if !verified {
return errors.New("Checksum mismatch. Aborting")
}
err = os.RemoveAll(downloadPath)
if err != nil {
return
}
switch NodeJs.CurrentExtension {
case NodeJs.Zip:
zip := archiver.NewZip()
zip.StripComponents = 1
err = zip.Unarchive(nodeFilePath, downloadPath)
case NodeJs.TarXz:
tar := archiver.NewTarXz()
tar.StripComponents = 1
err = tar.Unarchive(nodeFilePath, downloadPath)
case NodeJs.TarGz:
tar := archiver.NewTarGz()
tar.StripComponents = 1
err = tar.Unarchive(nodeFilePath, downloadPath)
default:
return errors.New("Invalid archive format. Aborting")
}
if err != nil {
return
}
return
},
}
)
func prepareNodejsFlags() (err error) {
if (nodejsVersion != "" && nodejsVersionfromFile != "") || (nodejsVersion == "" && nodejsVersionfromFile == "") {
return errors.New("cannot figure out which version to install. Please specify one of --version or --from-file")
}
if nodejsVersionfromFile != "" {
nodejsVersion, err = NodeJs.VersionFromFile(nodejsVersionfromFile)
}
return
}
func init() {
nodejsCommand.Flags().StringVarP(&nodejsVersion, "version", "v", "", "Which version to install")
nodejsCommand.Flags().StringVarP(&nodejsVersionfromFile, "version-from-file", "f", "", "Reads the version to be installed from a file. Supported are currently package.json, .nvmrc, .node-version and .n-node-version.")
nodejsCommand.MarkFlagFilename("from-file")
rootCmd.AddCommand(nodejsCommand)
}