func DetectVersion()

in pkg/ruby/ruby.go [37:111]


func DetectVersion(ctx *gcp.Context) (string, error) {
	versionFromEnv := os.Getenv(env.RuntimeVersion)
	// The two lock files have the same format for Ruby version
	lockFiles := []string{"Gemfile.lock", "gems.locked"}

	// If environment is GAE or GCF, skip lock file validation.
	// App Engine specific validation is done in a different buildpack.
	if env.IsGAE() || env.IsGCF() {
		if versionFromEnv != "" {
			ctx.Logf(
				"Using runtime version from environment variable %s: %s", env.RuntimeVersion, versionFromEnv)
			return versionFromEnv, nil
		}
	}

	versionFromRubyVersion, err := getVersionFromRubyVersion(ctx)
	if err != nil {
		return "", err
	}
	if versionFromEnv != "" && versionFromRubyVersion != "" && versionFromRubyVersion != versionFromEnv {
		return "", gcp.UserErrorf(
			"There is a conflict between Ruby versions specified in .ruby-version file and the %s environment variable. "+
				"Please resolve the conflict by choosing only one way to specify the ruby version.",
			env.RuntimeVersion)
	}

	for _, lockFileName := range lockFiles {

		path := filepath.Join(ctx.ApplicationRoot(), lockFileName)
		pathExists, err := ctx.FileExists(path)
		if err != nil {
			return "", err
		}
		if pathExists {
			lockedVersion, err := ParseRubyVersion(path)

			if err != nil {
				return "", gcp.UserErrorf("Error %q in: %s", err, lockFileName)
			}

			// Lockfile doesn't contain a ruby version, so we can move on
			if lockedVersion == "" {
				break
			}

			// Bundler doesn't allow us to override a version of ruby if it's locked in the lock file
			// The env will still be useful if a project doesn't lock ruby version or doesn't use bundler
			if versionFromEnv != "" && lockedVersion != versionFromEnv {
				return "", gcp.UserErrorf(
					"Ruby version %q in %s can't be overriden to %q using %s environment variable",
					lockedVersion, lockFileName, versionFromEnv, env.RuntimeVersion)
			}
			if versionFromRubyVersion != "" && lockedVersion != versionFromRubyVersion {
				return "", gcp.UserErrorf(
					"There is a conflict between the Ruby version %q in %s and %q in .ruby-version file."+
						"Please resolve the conflict by choosing only one way to specify the ruby version.",
					lockedVersion, lockFileName, versionFromRubyVersion)
			}
			return lockedVersion, err
		}
	}

	if versionFromEnv != "" {
		ctx.Logf(
			"Using runtime version from environment variable %s: %s", env.RuntimeVersion, versionFromEnv)
		return versionFromEnv, nil
	}
	if versionFromRubyVersion != "" {
		ctx.Logf(
			"Using runtime version from .ruby-version file: %s", versionFromRubyVersion)
		return versionFromRubyVersion, nil
	}

	return defaultVersion, nil
}