rubidium@8060: Option Explicit rubidium@8060: rubidium@8060: Dim FSO rubidium@8060: Set FSO = CreateObject("Scripting.FileSystemObject") rubidium@8060: rubidium@8060: Sub FindReplaceInFile(filename, to_find, replacement) rubidium@8060: Dim file, data rubidium@8060: Set file = FSO.OpenTextFile(filename, 1, 0, 0) rubidium@8060: data = file.ReadAll rubidium@8060: file.Close rubidium@8060: data = Replace(data, to_find, replacement) rubidium@8060: Set file = FSO.CreateTextFile(FileName, -1, 0) rubidium@8060: file.Write data rubidium@8060: file.Close rubidium@8060: End Sub rubidium@8060: rubidium@8276: Sub UpdateFile(revision, version, cur_date, filename) rubidium@8060: FSO.CopyFile filename & ".in", filename rubidium@8276: FindReplaceInFile filename, "@@REVISION@@", revision rubidium@8060: FindReplaceInFile filename, "@@VERSION@@", version rubidium@8060: FindReplaceInFile filename, "@@DATE@@", cur_date rubidium@8060: End Sub rubidium@8060: rubidium@8060: Sub UpdateFiles(version) glx@8280: Dim WshShell, cur_date, revision, oExec glx@8280: Set WshShell = CreateObject("WScript.Shell") rubidium@8060: cur_date = DatePart("D", Date) & "." & DatePart("M", Date) & "." & DatePart("YYYY", Date) glx@8280: revision = 0 glx@8280: Select Case Mid(version, 1, 1) glx@8280: Case "r" ' svn glx@8280: revision = Mid(version, 2) glx@8280: If InStr(revision, "M") Then glx@8280: revision = Mid(revision, 1, InStr(revision, "M") - 1) glx@8280: End If glx@8280: If InStr(revision, "-") Then glx@8280: revision = Mid(revision, 1, InStr(revision, "-") - 1) glx@8280: End If glx@8280: Case "h" ' mercurial (hg) glx@8280: Set oExec = WshShell.Exec("hg log -k " & Chr(34) & "svn" & Chr(34) & " -l 1 --template " & Chr(34) & "{desc}\n" & Chr(34) & " ../src") glx@8280: If Err.Number = 0 Then glx@8280: revision = Mid(OExec.StdOut.ReadLine(), 7) glx@8280: revision = Mid(revision, 1, InStr(revision, ")") - 1) glx@8280: End If glx@8413: Case "g" ' git glx@8413: Set oExec = WshShell.Exec("git log --pretty=format:%s --grep=" & Chr(34) & "^(svn r[0-9]*)" & Chr(34) & " -1 ../src") glx@8413: if Err.Number = 0 Then glx@8413: revision = Mid(oExec.StdOut.ReadLine(), 7) glx@8413: revision = Mid(revision, 1, InStr(revision, ")") - 1) glx@8413: End If glx@8280: End Select rubidium@8276: rubidium@8276: UpdateFile revision, version, cur_date, "../src/rev.cpp" rubidium@8276: UpdateFile revision, version, cur_date, "../src/ottdres.rc" rubidium@8060: End Sub rubidium@8060: glx@9198: Function ReadRegistryKey(shive, subkey, valuename, architecture) glx@9198: Dim hiveKey, objCtx, objLocator, objServices, objReg, Inparams, Outparams glx@9198: glx@9198: ' First, get the Registry Provider for the requested architecture glx@9198: Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet") glx@9198: objCtx.Add "__ProviderArchitecture", architecture ' Must be 64 of 32 glx@9198: Set objLocator = CreateObject("Wbemscripting.SWbemLocator") glx@9198: Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx) glx@9198: Set objReg = objServices.Get("StdRegProv") glx@9198: glx@9198: ' Check the hive and give it the right value glx@9198: Select Case shive glx@9198: Case "HKCR", "HKEY_CLASSES_ROOT" glx@9198: hiveKey = &h80000000 glx@9198: Case "HKCU", "HKEY_CURRENT_USER" glx@9198: hiveKey = &H80000001 glx@9198: Case "HKLM", "HKEY_LOCAL_MACHINE" glx@9198: hiveKey = &h80000002 glx@9198: Case "HKU", "HKEY_USERS" glx@9198: hiveKey = &h80000003 glx@9198: Case "HKCC", "HKEY_CURRENT_CONFIG" glx@9198: hiveKey = &h80000005 glx@9198: Case "HKDD", "HKEY_DYN_DATA" ' Only valid for Windows 95/98 glx@9198: hiveKey = &h80000006 glx@9198: Case Else glx@9198: MsgBox "Hive not valid (ReadRegistryKey)" glx@9198: End Select glx@9198: glx@9198: Set Inparams = objReg.Methods_("GetStringValue").Inparameters glx@9198: Inparams.Hdefkey = hiveKey glx@9198: Inparams.Ssubkeyname = subkey glx@9198: Inparams.Svaluename = valuename glx@9198: Set Outparams = objReg.ExecMethod_("GetStringValue", Inparams,,objCtx) glx@9198: glx@9198: ReadRegistryKey = Outparams.SValue glx@9198: End Function glx@9198: rubidium@8060: Function DetermineSVNVersion() glx@8280: Dim WshShell, version, url, oExec, line rubidium@8060: Set WshShell = CreateObject("WScript.Shell") rubidium@8060: On Error Resume Next rubidium@8060: rubidium@8060: ' Try TortoiseSVN rubidium@8060: ' Get the directory where TortoiseSVN (should) reside(s) rubidium@8060: Dim sTortoise glx@9198: ' First, try with 32-bit architecture glx@9198: sTortoise = ReadRegistryKey("HKLM", "SOFTWARE\TortoiseSVN", "Directory", 32) glx@9198: If sTortoise = Nothing Then glx@9198: ' No 32-bit version of TortoiseSVN installed, try 64-bit version (doesn't hurt on 32-bit machines, it returns nothing or is ignored) glx@9198: sTortoise = ReadRegistryKey("HKLM", "SOFTWARE\TortoiseSVN", "Directory", 64) glx@9198: End If rubidium@8060: glx@9198: ' If TortoiseSVN is installed, try to get the revision number glx@9198: If sTortoise <> Nothing Then glx@9198: Dim file glx@9198: ' Write some "magic" to a temporary file so we can acquire the svn revision/state glx@9198: Set file = FSO.CreateTextFile("tsvn_tmp", -1, 0) glx@9198: file.WriteLine "r$WCREV$$WCMODS?M:$" glx@9198: file.WriteLine "$WCURL$" glx@9198: file.Close glx@9198: Set oExec = WshShell.Exec(sTortoise & "\bin\SubWCRev.exe ../src tsvn_tmp tsvn_tmp") glx@9198: ' Wait till the application is finished ... glx@9198: Do glx@9198: OExec.StdOut.ReadLine() glx@9198: Loop While Not OExec.StdOut.atEndOfStream rubidium@8060: glx@9198: Set file = FSO.OpenTextFile("tsvn_tmp", 1, 0, 0) glx@9198: version = file.ReadLine glx@9198: url = file.ReadLine glx@9198: file.Close rubidium@8060: glx@9198: Set file = FSO.GetFile("tsvn_tmp") glx@9198: file.Delete glx@9198: End If rubidium@8060: rubidium@8060: ' Looks like there is no TortoiseSVN installed either. Then we don't know it. rubidium@8060: If InStr(version, "$") Then rubidium@8060: ' Reset error and version rubidium@8060: Err.Clear rubidium@8060: version = "norev000" rubidium@8060: ' Do we have subversion installed? Check immediatelly whether we've got a modified WC. rubidium@8060: Set oExec = WshShell.Exec("svnversion ../src") rubidium@8060: If Err.Number = 0 Then rubidium@8060: Dim modified rubidium@8060: If InStr(OExec.StdOut.ReadLine(), "M") Then rubidium@8060: modified = "M" rubidium@8060: Else rubidium@8060: modified = "" rubidium@8060: End If rubidium@8060: rubidium@8060: ' Set the environment to english rubidium@8060: WshShell.Environment("PROCESS")("LANG") = "en" rubidium@8060: rubidium@8060: ' And use svn info to get the correct revision and branch information. rubidium@8060: Set oExec = WshShell.Exec("svn info ../src") rubidium@8060: If Err.Number = 0 Then rubidium@8060: Do rubidium@8060: line = OExec.StdOut.ReadLine() rubidium@8060: If InStr(line, "URL") Then rubidium@8060: url = line rubidium@8060: End If rubidium@8060: If InStr(line, "Last Changed Rev") Then glx@8061: version = "r" & Mid(line, 19) & modified rubidium@8060: End If rubidium@8060: Loop While Not OExec.StdOut.atEndOfStream rubidium@8060: End If rubidium@8060: End If rubidium@8060: End If rubidium@8060: rubidium@8060: If version <> "norev000" Then rubidium@8060: If InStr(url, "branches") Then rubidium@8060: url = Mid(url, InStr(url, "branches") + 8) rubidium@8060: url = Mid(url, 1, InStr(2, url, "/") - 1) rubidium@8060: version = version & Replace(url, "/", "-") rubidium@8060: End If glx@8280: Else glx@8413: ' svn detection failed, reset error and try git glx@8280: Err.Clear glx@8413: Set oExec = WshShell.Exec("git rev-parse --verify --short=8 HEAD") rubidium@8471: If Err.Number = 0 Then glx@8413: version = "g" & oExec.StdOut.ReadLine() glx@8413: Set oExec = WshShell.Exec("git diff-index --exit-code --quiet HEAD ../src") glx@8413: Do While oExec.Status = 0 And Err.Number = 0 glx@8413: Loop glx@8413: If Err.Number = 0 And oExec.ExitCode = 1 Then glx@8413: version = version & "M" glx@8413: End If glx@8413: glx@8413: Set oExec = WshShell.Exec("git symbolic-ref HEAD") glx@8280: If Err.Number = 0 Then glx@8413: line = oExec.StdOut.ReadLine() glx@8413: line = Mid(line, InStrRev(line, "/")+1) glx@8413: If line <> "master" Then glx@8413: version = version & "-" & line glx@8413: End If glx@8280: End If glx@8413: Else glx@8413: ' try mercurial (hg) glx@8413: Err.Clear glx@8413: Set oExec = WshShell.Exec("hg tip") glx@8280: If Err.Number = 0 Then glx@8413: version = "h" & Mid(OExec.StdOut.ReadLine(), 19, 8) glx@8413: Set oExec = WshShell.Exec("hg status ../src") glx@8413: If Err.Number = 0 Then glx@8413: Do glx@8413: line = OExec.StdOut.ReadLine() glx@8413: If Mid(line, 1, 1) <> "?" Then glx@8413: version = version & "M" glx@8413: Exit Do glx@8413: End If glx@8413: Loop While Not OExec.StdOut.atEndOfStream glx@8413: End If glx@8413: Set oExec = WshShell.Exec("hg branch") glx@8413: If Err.Number = 0 Then glx@8413: line = OExec.StdOut.ReadLine() glx@8413: If line <> "default" Then glx@8413: version = version & "-" & line glx@8413: End If glx@8413: End If glx@8280: End If glx@8280: End If rubidium@8060: End If rubidium@8060: rubidium@8060: DetermineSVNVersion = version rubidium@8060: End Function rubidium@8060: rubidium@8060: Function IsCachedVersion(version) rubidium@8060: Dim cache_file, cached_version rubidium@8060: cached_version = "" rubidium@8060: Set cache_file = FSO.OpenTextFile("../config.cache.version", 1, True, 0) rubidium@8060: If Not cache_file.atEndOfStream Then rubidium@8060: cached_version = cache_file.ReadLine() rubidium@8060: End If rubidium@8060: cache_file.Close rubidium@8060: rubidium@8060: If version <> cached_version Then rubidium@8060: Set cache_file = fso.CreateTextFile("../config.cache.version", True) rubidium@8060: cache_file.WriteLine(version) rubidium@8060: cache_file.Close rubidium@8060: IsCachedVersion = False rubidium@8060: Else rubidium@8060: IsCachedVersion = True rubidium@8060: End If rubidium@8060: End Function rubidium@8060: rubidium@8060: Dim version rubidium@8060: version = DetermineSVNVersion rubidium@8060: If Not (IsCachedVersion(version) And FSO.FileExists("../src/rev.cpp") And FSO.FileExists("../src/ottdres.rc")) Then rubidium@8060: UpdateFiles version rubidium@8060: End If