rubidium@7564: Option Explicit rubidium@7564: rubidium@7564: Dim FSO rubidium@7564: Set FSO = CreateObject("Scripting.FileSystemObject") rubidium@7564: rubidium@7564: Sub FindReplaceInFile(filename, to_find, replacement) rubidium@7564: Dim file, data rubidium@7564: Set file = FSO.OpenTextFile(filename, 1, 0, 0) rubidium@7564: data = file.ReadAll rubidium@7564: file.Close rubidium@7564: data = Replace(data, to_find, replacement) rubidium@7564: Set file = FSO.CreateTextFile(FileName, -1, 0) rubidium@7564: file.Write data rubidium@7564: file.Close rubidium@7564: End Sub rubidium@7564: rubidium@7780: Sub UpdateFile(revision, version, cur_date, filename) rubidium@7564: FSO.CopyFile filename & ".in", filename rubidium@7780: FindReplaceInFile filename, "@@REVISION@@", revision rubidium@7564: FindReplaceInFile filename, "@@VERSION@@", version rubidium@7564: FindReplaceInFile filename, "@@DATE@@", cur_date rubidium@7564: End Sub rubidium@7564: rubidium@7564: Sub UpdateFiles(version) glx@7784: Dim WshShell, cur_date, revision, oExec glx@7784: Set WshShell = CreateObject("WScript.Shell") rubidium@7564: cur_date = DatePart("D", Date) & "." & DatePart("M", Date) & "." & DatePart("YYYY", Date) glx@7784: revision = 0 glx@7784: Select Case Mid(version, 1, 1) glx@7784: Case "r" ' svn glx@7784: revision = Mid(version, 2) glx@7784: If InStr(revision, "M") Then glx@7784: revision = Mid(revision, 1, InStr(revision, "M") - 1) glx@7784: End If glx@7784: If InStr(revision, "-") Then glx@7784: revision = Mid(revision, 1, InStr(revision, "-") - 1) glx@7784: End If glx@7784: Case "h" ' mercurial (hg) glx@7784: Set oExec = WshShell.Exec("hg log -k " & Chr(34) & "svn" & Chr(34) & " -l 1 --template " & Chr(34) & "{desc}\n" & Chr(34) & " ../src") glx@7784: If Err.Number = 0 Then glx@7784: revision = Mid(OExec.StdOut.ReadLine(), 7) glx@7784: revision = Mid(revision, 1, InStr(revision, ")") - 1) glx@7784: End If glx@7917: Case "g" ' git glx@7917: Set oExec = WshShell.Exec("git log --pretty=format:%s --grep=" & Chr(34) & "^(svn r[0-9]*)" & Chr(34) & " -1 ../src") glx@7917: if Err.Number = 0 Then glx@7917: revision = Mid(oExec.StdOut.ReadLine(), 7) glx@7917: revision = Mid(revision, 1, InStr(revision, ")") - 1) glx@7917: End If glx@7784: End Select rubidium@7780: rubidium@7780: UpdateFile revision, version, cur_date, "../src/rev.cpp" rubidium@7780: UpdateFile revision, version, cur_date, "../src/ottdres.rc" rubidium@7564: End Sub rubidium@7564: rubidium@7564: Function DetermineSVNVersion() glx@7784: Dim WshShell, version, url, oExec, line rubidium@7564: Set WshShell = CreateObject("WScript.Shell") rubidium@7564: On Error Resume Next rubidium@7564: rubidium@7564: ' Try TortoiseSVN rubidium@7564: ' Get the directory where TortoiseSVN (should) reside(s) rubidium@7564: Dim sTortoise rubidium@7564: sTortoise = WshShell.RegRead("HKLM\SOFTWARE\TortoiseSVN\Directory") rubidium@7564: rubidium@7564: Dim file rubidium@7564: ' Write some "magic" to a temporary file so we can acquire the svn revision/state rubidium@7564: Set file = FSO.CreateTextFile("tsvn_tmp", -1, 0) glx@7565: file.WriteLine "r$WCREV$$WCMODS?M:$" rubidium@7564: file.WriteLine "$WCURL$" rubidium@7564: file.Close rubidium@7564: Set oExec = WshShell.Exec(sTortoise & "\bin\SubWCRev.exe ../src tsvn_tmp tsvn_tmp") rubidium@7564: ' Wait till the application is finished ... rubidium@7564: Do rubidium@7564: OExec.StdOut.ReadLine() rubidium@7564: Loop While Not OExec.StdOut.atEndOfStream rubidium@7564: rubidium@7564: Set file = FSO.OpenTextFile("tsvn_tmp", 1, 0, 0) rubidium@7564: version = file.ReadLine rubidium@7564: url = file.ReadLine rubidium@7564: file.Close rubidium@7564: rubidium@7564: Set file = FSO.GetFile("tsvn_tmp") rubidium@7564: file.Delete rubidium@7564: rubidium@7564: ' Looks like there is no TortoiseSVN installed either. Then we don't know it. rubidium@7564: If InStr(version, "$") Then rubidium@7564: ' Reset error and version rubidium@7564: Err.Clear rubidium@7564: version = "norev000" rubidium@7564: ' Do we have subversion installed? Check immediatelly whether we've got a modified WC. rubidium@7564: Set oExec = WshShell.Exec("svnversion ../src") rubidium@7564: If Err.Number = 0 Then rubidium@7564: Dim modified rubidium@7564: If InStr(OExec.StdOut.ReadLine(), "M") Then rubidium@7564: modified = "M" rubidium@7564: Else rubidium@7564: modified = "" rubidium@7564: End If rubidium@7564: rubidium@7564: ' Set the environment to english rubidium@7564: WshShell.Environment("PROCESS")("LANG") = "en" rubidium@7564: rubidium@7564: ' And use svn info to get the correct revision and branch information. rubidium@7564: Set oExec = WshShell.Exec("svn info ../src") rubidium@7564: If Err.Number = 0 Then rubidium@7564: Do rubidium@7564: line = OExec.StdOut.ReadLine() rubidium@7564: If InStr(line, "URL") Then rubidium@7564: url = line rubidium@7564: End If rubidium@7564: If InStr(line, "Last Changed Rev") Then glx@7565: version = "r" & Mid(line, 19) & modified rubidium@7564: End If rubidium@7564: Loop While Not OExec.StdOut.atEndOfStream rubidium@7564: End If rubidium@7564: End If rubidium@7564: End If rubidium@7564: rubidium@7564: If version <> "norev000" Then rubidium@7564: If InStr(url, "branches") Then rubidium@7564: url = Mid(url, InStr(url, "branches") + 8) rubidium@7564: url = Mid(url, 1, InStr(2, url, "/") - 1) rubidium@7564: version = version & Replace(url, "/", "-") rubidium@7564: End If glx@7784: Else glx@7917: ' svn detection failed, reset error and try git glx@7784: Err.Clear glx@7917: Set oExec = WshShell.Exec("git rev-parse --verify --short=8 HEAD") rubidium@7975: If Err.Number = 0 Then glx@7917: version = "g" & oExec.StdOut.ReadLine() glx@7917: Set oExec = WshShell.Exec("git diff-index --exit-code --quiet HEAD ../src") glx@7917: Do While oExec.Status = 0 And Err.Number = 0 glx@7917: Loop glx@7917: If Err.Number = 0 And oExec.ExitCode = 1 Then glx@7917: version = version & "M" glx@7917: End If glx@7917: glx@7917: Set oExec = WshShell.Exec("git symbolic-ref HEAD") glx@7784: If Err.Number = 0 Then glx@7917: line = oExec.StdOut.ReadLine() glx@7917: line = Mid(line, InStrRev(line, "/")+1) glx@7917: If line <> "master" Then glx@7917: version = version & "-" & line glx@7917: End If glx@7784: End If glx@7917: Else glx@7917: ' try mercurial (hg) glx@7917: Err.Clear glx@7917: Set oExec = WshShell.Exec("hg tip") glx@7784: If Err.Number = 0 Then glx@7917: version = "h" & Mid(OExec.StdOut.ReadLine(), 19, 8) glx@7917: Set oExec = WshShell.Exec("hg status ../src") glx@7917: If Err.Number = 0 Then glx@7917: Do glx@7917: line = OExec.StdOut.ReadLine() glx@7917: If Mid(line, 1, 1) <> "?" Then glx@7917: version = version & "M" glx@7917: Exit Do glx@7917: End If glx@7917: Loop While Not OExec.StdOut.atEndOfStream glx@7917: End If glx@7917: Set oExec = WshShell.Exec("hg branch") glx@7917: If Err.Number = 0 Then glx@7917: line = OExec.StdOut.ReadLine() glx@7917: If line <> "default" Then glx@7917: version = version & "-" & line glx@7917: End If glx@7917: End If glx@7784: End If glx@7784: End If rubidium@7564: End If rubidium@7564: rubidium@7564: DetermineSVNVersion = version rubidium@7564: End Function rubidium@7564: rubidium@7564: Function IsCachedVersion(version) rubidium@7564: Dim cache_file, cached_version rubidium@7564: cached_version = "" rubidium@7564: Set cache_file = FSO.OpenTextFile("../config.cache.version", 1, True, 0) rubidium@7564: If Not cache_file.atEndOfStream Then rubidium@7564: cached_version = cache_file.ReadLine() rubidium@7564: End If rubidium@7564: cache_file.Close rubidium@7564: rubidium@7564: If version <> cached_version Then rubidium@7564: Set cache_file = fso.CreateTextFile("../config.cache.version", True) rubidium@7564: cache_file.WriteLine(version) rubidium@7564: cache_file.Close rubidium@7564: IsCachedVersion = False rubidium@7564: Else rubidium@7564: IsCachedVersion = True rubidium@7564: End If rubidium@7564: End Function rubidium@7564: rubidium@7564: Dim version rubidium@7564: version = DetermineSVNVersion rubidium@7564: If Not (IsCachedVersion(version) And FSO.FileExists("../src/rev.cpp") And FSO.FileExists("../src/ottdres.rc")) Then rubidium@7564: UpdateFiles version rubidium@7564: End If