Option Explicit Dim objws Dim objfs Set objws = WScript.CreateObject("WScript.Shell") Set objfs = CreateObject("Scripting.FileSystemObject") Dim strCurrent Dim strRbenvHome Dim strDirCache Dim strDirVers Dim strDirLibs Dim strVerFile strCurrent = objfs.GetAbsolutePathName(".") strRbenvHome = objfs.getParentFolderName(objfs.getParentFolderName(WScript.ScriptFullName)) strDirCache = strRbenvHome & "\install_cache" strDirVers = strRbenvHome & "\versions" strDirLibs = strRbenvHome & "\libexec" strVerFile = "\.ruby_version" Function IsVersion(version) Dim re Set re = new regexp re.Pattern = "^[a-zA-Z_0-9-.]+$" IsVersion = re.Test(version) End Function Function GetCurrentVersionGlobal() GetCurrentVersionGlobal = Null Dim fname Dim objFile fname = strRbenvHome & "\version" If objfs.FileExists( fname ) Then Set objFile = objfs.OpenTextFile(fname) If objFile.AtEndOfStream <> True Then GetCurrentVersionGlobal = Array(objFile.ReadLine,fname) End If objFile.Close End If End Function Function GetCurrentVersionLocal(path) GetCurrentVersionLocal = Null Dim fname Dim objFile Do While path <> "" fname = path & strVerFile If objfs.FileExists( fname ) Then Set objFile = objfs.OpenTextFile(fname) If objFile.AtEndOfStream <> True Then GetCurrentVersionLocal = Array(objFile.ReadLine,fname) End If objFile.Close Exit Function End If path = objfs.getParentFolderName(path) Loop End Function Function GetCurrentVersionShell() GetCurrentVersionShell = Null Dim str str=objws.ExpandEnvironmentStrings("%RBENV_VERSION%") If str <> "%RBENV_VERSION%" Then GetCurrentVersionShell = Array(str,"%RBENV_VERSION%") End If End Function Function GetCurrentVersion() Dim str str=GetCurrentVersionShell If IsNull(str) Then str = GetCurrentVersionLocal(strCurrent) If IsNull(str) Then str = GetCurrentVersionGlobal If IsNull(str) Then Err.Raise vbError + 1, "version not found", "please set 'rbenv global '" GetCurrentVersion = str End Function Function GetCurrentVersionNoError() Dim str str=GetCurrentVersionShell If IsNull(str) Then str = GetCurrentVersionLocal(strCurrent) If IsNull(str) Then str = GetCurrentVersionGlobal GetCurrentVersionNoError = str End Function Function GetBinDir(ver) Dim str str=strDirVers & "\" & ver & "\bin" If Not(IsVersion(ver) And objfs.FolderExists(str)) Then Err.Raise vbError + 2, "rbenv", "version `"&ver&"' not installed" GetBinDir = str End Function Function GetCommandList() Dim cmdList Set cmdList = CreateObject("Scripting.Dictionary")'"System.Collections.SortedList" Dim re Set re = new regexp re.Pattern = "\\rbenv-([a-zA-Z_0-9-]+)\.(bat|vbs)$" Dim file Dim mts For Each file In objfs.GetFolder(strDirLibs).Files Set mts=re.Execute(file) If mts.Count > 0 Then cmdList.Add mts(0).submatches(0), file End If Next Set GetCommandList = cmdList End Function Sub ExecCommand(str) Dim ofile Set ofile = objfs.CreateTextFile(strRbenvHome & "\exec.bat" , True ) ofile.WriteLine(str) ofile.Close() End Sub Sub ShowHelp() Wscript.echo "Usage: rbenv []" Wscript.echo "" Wscript.echo "Some useful rbenv commands are:" Wscript.echo " commands List all available rbenv commands" Wscript.echo " local Set or show the local application-specific Ruby version" Wscript.echo " global Set or show the global Ruby version" Wscript.echo " shell Set or show the shell-specific Ruby version" Wscript.echo " install Install a Ruby version using ruby-build" Wscript.echo " uninstall Uninstall a specific Ruby version" Wscript.echo " rehash Rehash rbenv shims (run this after installing executables)" Wscript.echo " version Show the current Ruby version and its origin" Wscript.echo " versions List all Ruby versions available to rbenv" Wscript.echo " exec Runs an executable by first preparing PATH so that the selected Ruby" Wscript.echo "" Wscript.echo "See `rbenv help ' for information on a specific command." Wscript.echo "For full documentation, see: https://github.com/rbenv/rbenv#readme" Exit Sub Wscript.echo " which Display the full path to an executable" Wscript.echo " whence List all Ruby versions that contain the given executable" End Sub Sub CommandHelp(arg) If arg.Count > 1 Then Dim list Set list=GetCommandList If list.Exists(arg(1)) Then ExecCommand(list(arg(1)) & " --help") Else Wscript.echo "unknown rbenv command '"&arg(1)&"'" End If Else ShowHelp End If End Sub Sub CommandRehash(arg) Dim strDirShims strDirShims= strRbenvHome & "\shims" If Not objfs.FolderExists( strDirShims ) Then objfs.CreateFolder(strDirShims) Dim ofile Dim file For Each file In objfs.GetFolder(strDirShims).Files objfs.DeleteFile file, True Next For Each file In objfs.GetFolder(GetBinDir(GetCurrentVersion()(0))).Files If objfs.GetExtensionName(file) = "exe" or objfs.GetExtensionName(file) = "bat" or objfs.GetExtensionName(file) = "cmd" Then Set ofile = objfs.CreateTextFile(strDirShims & "\" & objfs.GetBaseName( file ) & ".bat" ) ofile.WriteLine("@echo off") ofile.WriteLine("rbenv exec %~n0 %*") ofile.Close() Set ofile = objfs.CreateTextFile(strDirShims & "\" & objfs.GetBaseName( file ) ) ofile.WriteLine("#!/bin/sh") ofile.WriteLine("rbenv exec $(basename ""$0"") $*") ofile.Close() End If Next If arg.Count < 2 Then Exit Sub End If If arg(1) <> "bundle" Then Exit Sub End If Dim oExec,str,re,mts set oExec = objws.Exec("bundle.bat config") Do While oExec.Status = 0 WScript.Sleep 100 Loop str = oExec.StdOut.ReadAll set re=new regexp re.multiline=true re.pattern="^path\r\n.*\((.+?)\)\: ""(.+?)""" set mts=re.execute(str) if mts.count > 0 then str= mts(0).submatches(0) & "/../../" & mts(0).submatches(1) set oExec = objws.Exec("where -R """ & Replace(str,"/","\") &""" *.bat") Do While oExec.Status = 0 WScript.Sleep 100 Loop Do While Not oExec.StdOut.AtEndOfStream str = oExec.StdOut.ReadLine Set ofile = objfs.CreateTextFile(strDirShims & "\" & objfs.GetBaseName( str ) & ".bat" ) ofile.WriteLine("@echo off") ofile.WriteLine("call bundle show > NUL") ofile.WriteLine("if ERRORLEVEL 1 (") ofile.WriteLine("rbenv exec %~n0 %*") ofile.WriteLine(") else (") ofile.WriteLine("bundle exec %~n0 %*") ofile.WriteLine(")") ofile.Close() Set ofile = objfs.CreateTextFile(strDirShims & "\" & objfs.GetBaseName( str ) ) ofile.WriteLine("#!/bin/sh") ofile.WriteLine("if bundle show >/dev/null; then") ofile.WriteLine("bundle exec $(basename ""$0"") $*") ofile.WriteLine("else") ofile.WriteLine("rbenv exec $(basename ""$0"") $*") ofile.WriteLine("fi") ofile.Close() Loop end if End Sub Sub CommandExecute(arg) Dim str Dim dstr dstr=GetBinDir(GetCurrentVersion()(0)) str="set PATH=" & dstr & ";%PATH:&=^&%" & vbCrLf If arg.Count > 1 Then str=str & """" & dstr & "\" & arg(1) & """" Dim idx If arg.Count > 2 Then For idx = 2 To arg.Count - 1 str=str & " """& arg(idx) &"""" Next End If End If ExecCommand(str) End Sub Sub CommandGlobal(arg) If arg.Count < 2 Then Dim ver ver=GetCurrentVersionGlobal() If IsNull(ver) Then Wscript.echo "no global version configured" Else Wscript.echo ver(0) End If Else GetBinDir(arg(1)) Dim ofile Set ofile = objfs.CreateTextFile( strRbenvHome & "\version" , True ) ofile.WriteLine(arg(1)) ofile.Close() End If End Sub Sub CommandLocal(arg) Dim ver If arg.Count < 2 Then ver=GetCurrentVersionLocal(strCurrent) If IsNull(ver) Then Wscript.echo "no local version configured for this directory" Else Wscript.echo ver(0) End If Else ver=arg(1) If ver = "--unset" Then ver = "" objfs.DeleteFile strCurrent & strVerFile, True Exit Sub Else GetBinDir(ver) End If Dim ofile Set ofile = objfs.CreateTextFile( strCurrent & strVerFile , True ) ofile.WriteLine(ver) ofile.Close() End If End Sub Sub CommandShell(arg) Dim ver If arg.Count < 2 Then ver=GetCurrentVersionShell If IsNull(ver) Then Wscript.echo "no shell-specific version configured" Else Wscript.echo ver(0) End If Else ver=arg(1) If ver = "--unset" Then ver = "" Else GetBinDir(ver) End If ExecCommand("endlocal"&vbCrLf&"set RBENV_VERSION=" & ver) End If End Sub Sub CommandVersion(arg) If Not objfs.FolderExists( strDirVers ) Then objfs.CreateFolder(strDirVers) Dim curVer curVer=GetCurrentVersion Wscript.echo curVer(0) & " (set by " &curVer(1)&")" End Sub Sub CommandVersions(arg) Dim isBare isBare=False If arg.Count > 2 Then If arg(1) = "--bare" Then isBare=True End If If Not objfs.FolderExists( strDirVers ) Then objfs.CreateFolder(strDirVers) Dim curVer curVer=GetCurrentVersionNoError If IsNull(curVer) Then curVer=Array("","") End If Dim dir Dim ver For Each dir In objfs.GetFolder(strDirVers).subfolders ver=objfs.GetFileName( dir ) If isBare Then Wscript.echo ver ElseIf ver = curVer(0) Then Wscript.echo "* " & ver & " (set by " &curVer(1)&")" Else Wscript.echo " " & ver End If Next End Sub Sub PlugIn(arg) Dim fname Dim idx Dim str fname = strDirLibs & "\rbenv-" & arg(0) If objfs.FileExists( fname & ".bat" ) Then str="""" & fname & ".bat""" ElseIf objfs.FileExists( fname & ".vbs" ) Then str="cscript //nologo """ & fname & ".vbs""" Else Wscript.echo "rbenv: no such command `"&arg(0)&"'" Wscript.Quit End If For idx = 1 To arg.Count - 1 str=str & " """& arg(idx) &"""" Next ExecCommand(str) End Sub Sub CommandCommands(arg) Dim cname For Each cname In GetCommandList() Wscript.echo cname Next End Sub Sub Dummy() Wscript.echo "command not implement" End Sub Sub main(arg) If arg.Count = 0 Then ShowHelp Else Select Case arg(0) Case "exec" CommandExecute(arg) Case "rehash" CommandRehash(arg) Case "global" CommandGlobal(arg) Case "local" CommandLocal(arg) Case "shell" CommandShell(arg) Case "version" CommandVersion(arg) Case "versions" CommandVersions(arg) Case "commands" CommandCommands(arg) Case "help" CommandHelp(arg) Case Else PlugIn(arg) End Select End If End Sub main(WScript.Arguments)