Objetive:
*Update automatically the revision number in the web.config file of a website in my project.
(I wanted to show the users looking at the remote server the revision they are looking at)
Environment
* SVN installed in my local (c:\svn)
* Remote Windows Server that updates the trunk every X minutes
* Make sure your web.config has a section like: (inside the configuration branch)
<appSettings>
<add key="version" value="1.2." />
<add key="revision" value="138" />
</appSettings>Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Text.RegularExpressions
Imports System.Configuration
Imports System.Xml
Imports System.Web
Public Module Rev2Conf
Public Sub svn2conf()
'path to svn excecutable
Dim svnPath As String = "C:\svn\bin\svn.exe"
'gets the selected project
Dim proj As Project
Dim objProj As Object()
objProj = DTE.ActiveSolutionProjects
If objProj.Length = 0 Then
Exit Sub
End If
proj = DTE.ActiveSolutionProjects(0)
'gets the path of the web project to write to the web.config
Dim x As String = proj.ProjectItems.ContainingProject.FullName
Dim p As New System.Diagnostics.Process
'first update the root to get the latest revision
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardOutput = True
p.StartInfo.RedirectStandardError = True
p.StartInfo.FileName = svnPath
p.StartInfo.Arguments = "update"
p.StartInfo.WorkingDirectory = proj.Properties.Item("FullPath").Value()
p.Start()
p.WaitForExit()
p.StartInfo.Arguments = "info"
p.Start()
Dim strerror As String = p.StandardError().ReadToEnd()
Dim output As String = p.StandardOutput().ReadToEnd()
p.WaitForExit()
'get the revision
Dim re As New Regex("Revision:\s+(\d+)\s*")
Dim ver As String
ver = re.Match(output).Groups(1).Value
'add one so the number is not one revision behind
Dim version As Integer
version = Convert.ToInt32(ver) + 1
Dim file As New System.Configuration.ExeConfigurationFileMap()
file.ExeConfigFilename = proj.Properties.Item("FullPath").Value() + "\web.config"
Dim config As System.Configuration.Configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None)
'get section
Dim section As AppSettingsSection
section = config.GetSection("appSettings")
section.Settings("revision").Value = version.ToString()
section.SectionInformation.ForceSave = True
config.Save(ConfigurationSaveMode.Full)
End Sub
End ModuleThe Other way of doing it is running it every time you build....
Macro to add SVN revision number on build of project to all WebSites in the solution
add the following code to your EnvironmentEvents macro file
Private Sub BuildEvents_OnBuildProjConfigBegin(ByVal Project As String, ByVal ProjectConfig As String, ByVal Platform As String, ByVal SolutionConfig As String) Handles BuildEvents.OnBuildProjConfigBegin
'path to svn excecutable
Dim svnPath As String = "C:\svn\bin\svn.exe"
Dim file As New System.Configuration.ExeConfigurationFileMap()
file.ExeConfigFilename = Project + "\web.config"
'only apply revision Number to WebApplications
If FileIO.FileSystem.FileExists(file.ExeConfigFilename) Then
Dim p As New System.Diagnostics.Process
'first update the root to get the latest revision
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardOutput = True
p.StartInfo.RedirectStandardError = True
p.StartInfo.FileName = svnPath
p.StartInfo.Arguments = "update"
p.StartInfo.WorkingDirectory = Project
p.Start()
p.WaitForExit()
p.StartInfo.Arguments = "info"
p.Start()
Dim strerror As String = p.StandardError().ReadToEnd()
Dim output As String = p.StandardOutput().ReadToEnd()
p.WaitForExit()
'get the revision
Dim re As New Regex("Revision:\s+(\d+)\s*")
Dim ver As String
ver = re.Match(output).Groups(1).Value
'add one so the number is not one revision behind
Dim version As Integer
version = Convert.ToInt32(ver) + 1
Dim config As System.Configuration.Configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None)
'get config section
Dim section As AppSettingsSection
section = config.GetSection("appSettings")
section.Settings("revision").Value = version.ToString()
section.SectionInformation.ForceSave = True
config.Save(ConfigurationSaveMode.Full)
End If
End Sub
I don't want do add revision to Web.config when build fails
After using the code above It was getting annoying ... every time it was adding the revision even if the build failed so....
so instead of using the BuildEvents_OnBuildProjConfigBegin I use BuildEvents_OnBuildProjConfigDone and check when Success is true
add the following to your Module EnvironmentEvents file
Private Sub BuildEvents_OnBuildProjConfigDone(ByVal Project As String, ByVal ProjectConfig As String, ByVal Platform As String, ByVal SolutionConfig As String, ByVal Success As Boolean) Handles BuildEvents.OnBuildProjConfigDone
If (Success.Equals(True)) Then
'path to svn excecutable
Dim svnPath As String = "C:\svn\bin\svn.exe"
Dim file As New System.Configuration.ExeConfigurationFileMap()
file.ExeConfigFilename = Project + "\web.config"
'only apply revision Number to WebApplications
If FileIO.FileSystem.FileExists(file.ExeConfigFilename) Then
Dim p As New System.Diagnostics.Process
'first update the root to get the latest revision
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardOutput = True
p.StartInfo.RedirectStandardError = True
p.StartInfo.FileName = svnPath
p.StartInfo.Arguments = "update"
p.StartInfo.WorkingDirectory = Project
p.Start()
p.WaitForExit()
p.StartInfo.Arguments = "info"
p.Start()
Dim strerror As String = p.StandardError().ReadToEnd()
Dim output As String = p.StandardOutput().ReadToEnd()
p.WaitForExit()
'get the revision
Dim re As New Regex("Revision:\s+(\d+)\s*")
Dim ver As String
ver = re.Match(output).Groups(1).Value
'add one so the number is not one revision behind
Dim version As Integer
version = Convert.ToInt32(ver) + 1
Dim config As System.Configuration.Configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None)
'get config section
Dim section As AppSettingsSection
section = config.GetSection("appSettings")
section.Settings("revision").Value = version.ToString()
section.SectionInformation.ForceSave = True
config.Save(ConfigurationSaveMode.Full)
End If
End If
End Sub