Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
f80b094
new tui
moqsien Jun 10, 2025
0a06578
new tui
moqsien Jun 10, 2025
8f51b6c
update
moqsien Jun 10, 2025
053f57a
update
moqsien Jun 10, 2025
47f3796
update
moqsien Jun 10, 2025
87a9a9a
update
moqsien Jun 10, 2025
a9bc515
update
moqsien Jun 10, 2025
bdd133a
update
moqsien Jun 10, 2025
ed463c8
update
moqsien Jun 10, 2025
53b7324
update
moqsien Jun 10, 2025
9b800ed
update
moqsien Jun 10, 2025
415ac85
update
moqsien Jun 10, 2025
577010e
update
moqsien Jun 10, 2025
5ba3279
update
moqsien Jun 10, 2025
1341241
update
moqsien Jun 11, 2025
b2f558c
update
moqsien Jun 11, 2025
b2fbdc9
update
moqsien Jun 11, 2025
4ead6b6
update
moqsien Jun 11, 2025
04897b2
update
moqsien Jun 11, 2025
a543e7c
update
moqsien Jun 11, 2025
4dd34a1
update
moqsien Jun 11, 2025
fdac83d
update
moqsien Jun 11, 2025
a84b4a9
update
moqsien Jun 12, 2025
16b0e50
update
moqsien Jun 12, 2025
786508f
update
moqsien Jun 13, 2025
7d6939c
update
moqsien Jun 16, 2025
5e2d76c
update
moqsien Jun 17, 2025
fb6207a
update
moqsien Jun 17, 2025
25d068b
update
moqsien Jun 20, 2025
960c53f
update
moqsien Jun 20, 2025
2bdc85a
update
moqsien Jun 20, 2025
16a30a2
update
moqsien Jun 20, 2025
f415cf6
update
moqsien Jun 23, 2025
5dd245e
update
moqsien Jun 24, 2025
3a93f38
update
moqsien Jun 25, 2025
a1317a3
update
moqsien Jun 25, 2025
e40b3c8
update
moqsien Jun 25, 2025
1e2865e
shell & terminal
moqsien Jul 4, 2025
9114e4f
envs
moqsien Jul 4, 2025
49dbb23
envs
moqsien Jul 4, 2025
89c25d7
update
moqsien Sep 17, 2025
7be66b7
update
moqsien Sep 17, 2025
98bc12e
update
moqsien Sep 17, 2025
685a819
update
moqsien Sep 18, 2025
8f6525d
update
moqsien Sep 18, 2025
b1bdfaa
update
moqsien Sep 18, 2025
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/vmr/cli/use.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ var useCmd = &cobra.Command{
vItem = lua_global.Item{
Arch: runtime.GOARCH,
Os: runtime.GOOS,
Installer: lua_global.Conda,
Installer: lua_global.InstallerConda,
}
}

Expand Down
2 changes: 1 addition & 1 deletion docs/readmeCN.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<p style="" align="center">
<!-- <img src="https://github.com/moqsien/img_repo/raw/main/vm_header_photo_2.png" alt="logo" width="720" height="240"> -->
<img src="https://cdn.jsdelivr.net/gh/moqsien/img_repo@main/vmr_logo_trans.png" alt="logo" width="360" height="120">
<img src="https://cdn.jsdelivr.net/gh/moqsien/img_repo@main/vmr-logo.png" alt="logo" width="360" height="120">
</p>

[![go report card](https://img.shields.io/badge/go%20report-a+-brightgreen.svg?style=for-the-badge)](https://goreportcard.com/report/github.com/gvcgo/version-manager)
Expand Down
Binary file added docs/vmr.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
28 changes: 21 additions & 7 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ require (
github.com/erikgeiser/promptkit v0.9.0
github.com/gogf/gf/v2 v2.6.1
github.com/gvcgo/goutils v1.0.8
github.com/imroc/req/v3 v3.52.2
github.com/lithammer/fuzzysearch v1.1.8
github.com/mattn/go-runewidth v0.0.16
github.com/mholt/archives v0.1.1
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6
Expand All @@ -20,8 +22,8 @@ require (
github.com/spf13/cobra v1.8.0
github.com/stretchr/testify v1.10.0
github.com/yuin/gopher-lua v1.1.1
golang.org/x/sys v0.31.0
golang.org/x/term v0.30.0
golang.org/x/sys v0.32.0
golang.org/x/term v0.31.0
)

require (
Expand All @@ -37,20 +39,24 @@ require (
github.com/bodgit/windows v1.0.1 // indirect
github.com/charmbracelet/harmonica v0.2.0 // indirect
github.com/clbanning/mxj/v2 v2.7.0 // indirect
github.com/cloudflare/circl v1.6.1 // indirect
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-resty/resty/v2 v2.7.0 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/pprof v0.0.0-20250423184734-337e5dd93bb4 // indirect
github.com/gvcgo/xtractr v0.0.3 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/icholy/digest v1.1.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/kdomanski/iso9660 v0.3.5 // indirect
github.com/klauspost/compress v1.17.11 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/pgzip v1.2.6 // indirect
github.com/kr/pty v1.1.8 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
Expand All @@ -64,8 +70,12 @@ require (
github.com/muesli/termenv v0.15.2 // indirect
github.com/nwaples/rardecode v1.1.3 // indirect
github.com/nwaples/rardecode/v2 v2.1.0 // indirect
github.com/onsi/ginkgo/v2 v2.23.4 // indirect
github.com/pierrec/lz4/v4 v4.1.21 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/quic-go/quic-go v0.51.0 // indirect
github.com/refraction-networking/utls v1.6.7 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/sorairolake/lzip-go v0.3.5 // indirect
github.com/spf13/pflag v1.0.5 // indirect
Expand All @@ -77,10 +87,14 @@ require (
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.opentelemetry.io/otel v1.15.1 // indirect
go.opentelemetry.io/otel/trace v1.15.1 // indirect
go.uber.org/automaxprocs v1.6.0 // indirect
go.uber.org/mock v0.5.1 // indirect
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
golang.org/x/crypto v0.36.0 // indirect
golang.org/x/net v0.38.0 // indirect
golang.org/x/sync v0.12.0 // indirect
golang.org/x/text v0.23.0 // indirect
golang.org/x/crypto v0.37.0 // indirect
golang.org/x/mod v0.24.0 // indirect
golang.org/x/net v0.39.0 // indirect
golang.org/x/sync v0.13.0 // indirect
golang.org/x/text v0.24.0 // indirect
golang.org/x/tools v0.32.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
74 changes: 56 additions & 18 deletions go.sum

Large diffs are not rendered by default.

196 changes: 196 additions & 0 deletions internal/cinstaller/installer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
package cinstaller

import (
"path/filepath"
"strings"

"github.com/gvcgo/version-manager/internal/cnf"
"github.com/gvcgo/version-manager/internal/luapi/lua_global"
"github.com/gvcgo/version-manager/internal/luapi/plugin"
)

type VersionItem struct {
Version string
lua_global.Item
}

/*
Installs an SDK.
*/
type Installer struct {
plugin *plugin.Plugin
vl lua_global.VersionList
}

func New(p *plugin.Plugin) *Installer {
return &Installer{
plugin: p,
}
}

func (i *Installer) GetVersionList() (lua_global.VersionList, error) {
if i.vl != nil {
return i.vl, nil
}
var err error
i.vl, err = i.plugin.GetSDKVersions()
return i.vl, err
}

func (i *Installer) SearchVersion(version string) *VersionItem {
vl, _ := i.GetVersionList()
if vl == nil {
return nil
}

// return the latest version by default
if version == "" || version == "latest" {
sortedVl := vl.SortDesc()
if len(sortedVl) == 0 {
return nil
}
return &VersionItem{
Version: sortedVl[0],
Item: vl[sortedVl[0]],
}
}

sortedVl := vl.SortDesc()
for _, v := range sortedVl {
if v == version {
return &VersionItem{
Version: v,
Item: vl[v],
}
} else if strings.HasPrefix(v, version) {
return &VersionItem{
Version: v,
Item: vl[v],
}
}
}
return nil
}

func (i *Installer) GetInstallationFilePath(version string) string {
cacheDir := cnf.GetCacheDir()
customedFileNameHandler := i.plugin.GetCustomedFileNameHandler(version)
if customedFileNameHandler != nil {
filename, err := customedFileNameHandler()
if err != nil || filename == "" {
return ""
}
return filepath.Join(cacheDir, i.plugin.SDKName, i.plugin.PluginName, version, filename)
}

item := i.SearchVersion(version)
idx := strings.LastIndex(item.Url, "/")
if idx == -1 {
return ""
}
filename := item.Url[idx+1:]
return filepath.Join(cacheDir, i.plugin.SDKName, i.plugin.PluginName, version, filename)
}

func (i *Installer) GetInstallationDestDir(version string) string {
item := i.SearchVersion(version)
return lua_global.GetInstallDir(i.plugin.SDKName, i.plugin.PluginName, item.Version)
}

func (i *Installer) PreInstall(version string) error {
if i.plugin == nil {
return nil
}
preInstallHandler := i.plugin.GetPreInstallHandler(version)
if preInstallHandler != nil {
_, err := preInstallHandler()
if err != nil {
return err
}
}
return nil
}

func (i *Installer) Install(version string) error {
if i.plugin == nil {
return nil
}
customedInstaller := i.plugin.GetCustomedInstallHandler(version)
if customedInstaller != nil {
_, err := customedInstaller()
if err != nil {
return err
}
}
// TODO: default install handler.
return nil
}

func (i *Installer) CreateSymbolicLink(version string) error {
return nil
}

func (i *Installer) SetEnv(version string) error {
return nil
}

func (i *Installer) PostInstall(version string) error {
if i.plugin == nil {
return nil
}
postInstallHandler := i.plugin.GetPostInstallHandler(version)
if postInstallHandler != nil {
_, err := postInstallHandler()
if err != nil {
return err
}
}
return nil
}

func (i *Installer) InstallVersion(version string) error {
if i.plugin == nil {
return nil
}

if err := i.PreInstall(version); err != nil {
return err
}
if err := i.Install(version); err != nil {
return err
}
if err := i.PostInstall(version); err != nil {
return err
}
return nil
}

func (i *Installer) Uninstall(version string) error {
if i.plugin == nil {
return nil
}

uninstall := i.plugin.GetCustomedUninstallHandler(version)
if uninstall != nil {
_, err := uninstall()
if err != nil {
return err
}
}
//TODO: default uninstall handler
return nil
}

// Uninstalls all installed versions for an SDK.
func (i *Installer) Clear() error {
return nil
}

func (i *Installer) UnsetEnv(version string) error {
return nil
}

// Get all installed versions for an SDK.
func (i *Installer) List() error {
return nil
}
28 changes: 28 additions & 0 deletions internal/cinstaller/installer_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package cinstaller

import (
"fmt"
"path/filepath"
"testing"

"github.com/gvcgo/version-manager/internal/cnf"
"github.com/gvcgo/version-manager/internal/luapi/plugin"
"github.com/gvcgo/version-manager/internal/utils"
)

func TestInstallerVersionList(t *testing.T) {
pluginPath := filepath.Join(cnf.GetPluginDir(), "go.lua")
if !utils.PathIsExist(pluginPath) {
return
}
plugins := plugin.NewPlugins()
p := plugins.GetPlugin("go")
i := New(&p)
vl, err := i.GetVersionList()
if err != nil {
t.Errorf("Error getting version list: %v", err)
} else {
sortedList := vl.SortDesc()
fmt.Println(sortedList)
}
}
32 changes: 32 additions & 0 deletions internal/cinstaller/prequisite.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package cinstaller

import (
"github.com/gvcgo/version-manager/internal/luapi/lua_global"
"github.com/gvcgo/version-manager/internal/luapi/plugin"
)

/*
Check and install Miniconda, Coursior, Rustup, etc.
*/
func (i *Installer) CheckPrequisite() *Installer {
latest := i.SearchVersion("latest")
if latest == nil {
return nil
}

plugins := plugin.NewPlugins()
switch latest.Installer {
case lua_global.InstallerConda:
p := plugins.GetPlugin("miniconda")
return New(&p)
case lua_global.InstallerCoursier:
p := plugins.GetPlugin("coursier")
return New(&p)
case lua_global.InstallerRustup:
p := plugins.GetPlugin("rustup")
return New(&p)
default:
}

return nil
}
43 changes: 43 additions & 0 deletions internal/cinstaller/shell/bash.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package shell

import (
"fmt"
"os"
"path/filepath"

"github.com/gvcgo/version-manager/internal/cnf"
)

type Bash struct{}

func NewBash() *Bash {
return &Bash{}
}

func (b *Bash) ConfPath() string {
homeDir, _ := os.UserHomeDir()
return filepath.Join(homeDir, ".bashrc")
}

func (b *Bash) VMREnvConfPath() string {
workDir := cnf.GetVMRWorkDir()
return filepath.Join(
workDir,
fmt.Sprintf("%s.sh", VMREnvFileName),
)
}

func (b *Bash) Init() {
// TODO: add cd hook, etc.
}

func (b *Bash) PackPath(pathS string) string {
return fmt.Sprintf("export PATH=%s:$PATH", pathS)
}

func (b *Bash) PackEnv(key, value string) string {
if value == "" {
return fmt.Sprintf("export %s=", key)
}
return fmt.Sprintf("export %s=%s", key, value)
}
Loading
Loading