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