mirror of
https://github.com/wahyd4/jabba.git
synced 2026-08-09 04:46:17 +10:00
124 lines
3.1 KiB
Go
124 lines
3.1 KiB
Go
package command
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/shyiko/jabba/cfg"
|
|
"github.com/shyiko/jabba/semver"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
log "github.com/Sirupsen/logrus"
|
|
)
|
|
|
|
func Link(selector string, dir string) error {
|
|
if !strings.HasPrefix(selector, "system@") {
|
|
return errors.New("Name must begin with 'system@' (e.g. 'system@1.8.73')")
|
|
}
|
|
// <version> has to be valid per semver
|
|
if _, err := semver.ParseVersion(selector); err != nil {
|
|
return err
|
|
}
|
|
if dir == "" {
|
|
ver, err := LsBestMatch(selector)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return os.Remove(filepath.Join(cfg.Dir(), "jdk", ver))
|
|
} else {
|
|
if err := assertJavaDistribution(dir); err != nil {
|
|
return err
|
|
}
|
|
if err := os.MkdirAll(filepath.Join(cfg.Dir(), "jdk"), 0755); err != nil {
|
|
return err
|
|
}
|
|
return os.Symlink(dir, filepath.Join(cfg.Dir(), "jdk", selector))
|
|
}
|
|
}
|
|
|
|
func LinkLatest() error {
|
|
files, _ := readDir(filepath.Join(cfg.Dir(), "jdk"))
|
|
var vs, err = Ls()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cache := make(map[string]string)
|
|
for _, f := range files {
|
|
if f.IsDir() || f.Mode()&os.ModeSymlink == os.ModeSymlink {
|
|
sourceVersion := f.Name()
|
|
if strings.Count(sourceVersion, ".") == 1 && !strings.HasPrefix(sourceVersion, "system@") {
|
|
target := GetLink(sourceVersion)
|
|
_, err := LsBestMatchWithVersionSlice(vs, sourceVersion)
|
|
if err != nil {
|
|
err := os.Remove(filepath.Join(cfg.Dir(), "jdk", sourceVersion))
|
|
if err == nil {
|
|
log.Info(sourceVersion + " -/> " + target)
|
|
}
|
|
if !os.IsNotExist(err) {
|
|
return err
|
|
}
|
|
} else {
|
|
cache[sourceVersion] = target
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for _, v := range semver.VersionSlice(vs).TrimTo(semver.VPMinor) {
|
|
sourceVersion := v.TrimTo(semver.VPMinor)
|
|
target := filepath.Join(cfg.Dir(), "jdk", v.String())
|
|
if v.Prerelease() == "" && cache[sourceVersion] != target && !strings.HasPrefix(sourceVersion, "system@") {
|
|
source := filepath.Join(cfg.Dir(), "jdk", sourceVersion)
|
|
log.Info(sourceVersion + " -> " + target)
|
|
os.Remove(source)
|
|
if err := os.Symlink(target, source); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return linkAlias("default", vs)
|
|
}
|
|
|
|
func LinkAlias(name string) error {
|
|
var vs, err = Ls()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return linkAlias(name, vs)
|
|
}
|
|
|
|
func linkAlias(name string, vs []*semver.Version) error {
|
|
defaultAlias := GetAlias(name)
|
|
if defaultAlias != "" {
|
|
defaultAlias, _ = LsBestMatchWithVersionSlice(vs, defaultAlias)
|
|
}
|
|
sourceRef := /*"alias@" + */name
|
|
source := filepath.Join(cfg.Dir(), "jdk", sourceRef)
|
|
sourceTarget := GetLink(sourceRef)
|
|
if defaultAlias != "" {
|
|
target := filepath.Join(cfg.Dir(), "jdk", defaultAlias)
|
|
if sourceTarget != target {
|
|
log.Info(sourceRef + " -> " + target)
|
|
os.Remove(source)
|
|
if err := os.Symlink(target, source); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
} else {
|
|
err := os.Remove(source)
|
|
if err == nil {
|
|
log.Info(sourceRef + " -/> " + sourceTarget)
|
|
}
|
|
if !os.IsNotExist(err) {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func GetLink(name string) string {
|
|
res, err := filepath.EvalSymlinks(filepath.Join(cfg.Dir(), "jdk", name))
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
return res
|
|
}
|