Skip to content

Commit c35ca9b

Browse files
authored
Merge pull request #539 from railgun-0402/feat/no-fallback-detect
feat(detect): add --no-fallback option
2 parents 5af2b17 + 88228d6 commit c35ca9b

File tree

4 files changed

+49
-5
lines changed

4 files changed

+49
-5
lines changed

cmd/tenv/subcmd.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ func newDetectCmd(versionManager versionmanager.VersionManager, params subCmdPar
7878

7979
skipSum, skipSign := false, false
8080
forceInstall, forceNoInstall := false, false
81+
noFallback := false
8182

8283
detectCmd := &cobra.Command{
8384
Use: "detect",
@@ -89,8 +90,13 @@ func newDetectCmd(versionManager versionmanager.VersionManager, params subCmdPar
8990
conf.InitDisplayer(false)
9091
conf.InitInstall(forceInstall, forceNoInstall)
9192

92-
detectedVersion, err := versionManager.Detect(context.Background(), false)
93+
detectedVersion, err := versionManager.Detect(context.Background(), false, noFallback)
9394
if err != nil {
95+
if errors.Is(err, versionmanager.ErrNoVersionFilesFound) {
96+
loghelper.StdDisplay(loghelper.Concat("No version files found for ", versionManager.FolderName))
97+
98+
return err
99+
}
94100
if !errors.Is(err, versionmanager.ErrNoCompatibleLocally) {
95101
return err
96102
}
@@ -106,6 +112,7 @@ func newDetectCmd(versionManager versionmanager.VersionManager, params subCmdPar
106112
addInstallationFlags(flags, conf, params, &skipSum, &skipSign)
107113
addOptionalInstallationFlags(flags, conf, params, &forceInstall, &forceNoInstall)
108114
addRemoteFlags(flags, conf, params)
115+
flags.BoolVar(&noFallback, "no-fallback", false, "fail if no version files are found instead of using fallback strategy")
109116

110117
return detectCmd
111118
}

versionmanager/manager.go

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ var (
4848
errEmptyVersion = errors.New("empty version")
4949
errNoCompatible = errors.New("no compatible version found")
5050
ErrNoCompatibleLocally = errors.New("no compatible version found locally")
51+
ErrNoVersionFilesFound = errors.New("no version files found")
5152
)
5253

5354
type ReleaseRetriever interface {
@@ -74,8 +75,15 @@ func Make(conf *config.Config, envPrefix string, folderName string, iacExts []ia
7475
}
7576

7677
// Detect version (resolve and evaluate, can install depending on auto install env var).
77-
func (m VersionManager) Detect(ctx context.Context, proxyCall bool) (string, error) {
78-
configVersion, err := m.Resolve(semantic.LatestAllowedKey)
78+
// When noFallback is true, returns ErrNoVersionFilesFound if no version files are found instead of using fallback strategy.
79+
func (m VersionManager) Detect(ctx context.Context, proxyCall bool, noFallback bool) (string, error) {
80+
var configVersion string
81+
var err error
82+
if noFallback {
83+
configVersion, err = m.ResolveStrict()
84+
} else {
85+
configVersion, err = m.Resolve(semantic.LatestAllowedKey)
86+
}
7987
if err != nil {
8088
m.Conf.Displayer.Flush(proxyCall)
8189

@@ -292,6 +300,35 @@ func (m VersionManager) Resolve(defaultStrategy string) (string, error) {
292300
return defaultStrategy, nil
293301
}
294302

303+
// ResolveStrict Search the requested version in version files (with fallbacks and env var overloading, but no default strategy fallback).
304+
// Returns ErrNoVersionFilesFound if no version is found.
305+
func (m VersionManager) ResolveStrict() (string, error) {
306+
versionEnvName := m.EnvNames.Version()
307+
version := m.Conf.Getenv(versionEnvName)
308+
if version != "" {
309+
return types.DisplayDetectionInfo(m.Conf.Displayer, version, versionEnvName), nil
310+
}
311+
312+
version, err := m.ResolveWithVersionFiles()
313+
if err != nil {
314+
return "", err
315+
}
316+
if version != "" {
317+
return version, nil
318+
}
319+
320+
defaultVersionEnvName := m.EnvNames.defaultVersion()
321+
if version = m.Conf.Getenv(defaultVersionEnvName); version != "" {
322+
return types.DisplayDetectionInfo(m.Conf.Displayer, version, defaultVersionEnvName), nil
323+
}
324+
325+
if version, err = flatparser.RetrieveVersion(m.RootVersionFilePath(), m.Conf); err != nil || version != "" {
326+
return version, err
327+
}
328+
329+
return "", ErrNoVersionFilesFound
330+
}
331+
295332
// Search the requested version in version files.
296333
func (m VersionManager) ResolveWithVersionFiles() (string, error) {
297334
return semantic.RetrieveVersion(m.VersionFiles, m.Conf)

versionmanager/proxy/proxy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func Exec(conf *config.Config, builderFunc builder.Func, hclParser *hclparse.Par
4545
updateWorkPath(conf, cmdArgs)
4646

4747
ctx := context.Background()
48-
detectedVersion, err := versionManager.Detect(ctx, true)
48+
detectedVersion, err := versionManager.Detect(ctx, true, false)
4949
if err != nil {
5050
fmt.Println("Failed to detect a version allowing to call", execName, ":", err) //nolint
5151
os.Exit(cmdconst.EarlyErrorExitCode)

versionmanager/tenvlib/lib.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ func (t Tenv) Detect(ctx context.Context, toolName string) (string, error) {
179179
return "", err
180180
}
181181

182-
return t.managers[toolName].Detect(ctx, false)
182+
return t.managers[toolName].Detect(ctx, false, false)
183183
}
184184

185185
// Use the result of Tenv.Detect to call Tenv.Command.

0 commit comments

Comments
 (0)