#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

235 lines
7.0 KiB

/*
* Created by SharpDevelop.
* User: Daniel Grunwald
* Date: 21.07.2005
* Time: 12:00
*/
using System;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Xml.Linq;
namespace UpdateAssemblyInfo
{
// Updates the version numbers in the assembly information.
class MainClass
{
const string BaseCommit = "f118057b0f20994c272aba765b54db10d5c1c793";
const int BaseCommitRev = 6366;
const string globalAssemblyInfoTemplateFile = "src/Main/GlobalAssemblyInfo.template";
static readonly TemplateFile[] templateFiles = {
new TemplateFile {
Input = globalAssemblyInfoTemplateFile,
Output = "src/Main/GlobalAssemblyInfo.cs"
},
new TemplateFile {
Input = "src/Main/StartUp/Project/app.template.config",
Output = "src/Main/StartUp/Project/SharpDevelop.exe.config"
},
new TemplateFile {
Input = "src/Main/StartUp/Project/app.template.config",
Output = "src/Main/ICSharpCode.SharpDevelop.Sda/ICSharpCode.SharpDevelop.Sda.dll.config"
},
new TemplateFile {
Input = "src/Setup/SharpDevelop.Setup.wixproj.user.template",
Output = "src/Setup/SharpDevelop.Setup.wixproj.user"
},
new TemplateFile {
Input = "doc/ChangeLog.template.html",
Output = "doc/ChangeLog.html"
},
};
class TemplateFile
{
public string Input, Output;
}
public static int Main(string[] args)
{
try {
string exeDir = Path.GetDirectoryName(typeof(MainClass).Assembly.Location);
bool createdNew;
using (Mutex mutex = new Mutex(true, "SharpDevelopUpdateAssemblyInfo" + exeDir.GetHashCode(), out createdNew)) {
if (!createdNew) {
// multiple calls in parallel?
// it's sufficient to let one call run, so just wait for the other call to finish
try {
mutex.WaitOne(10000);
} catch (AbandonedMutexException) {
}
return 0;
}
if (!File.Exists("SharpDevelop.sln")) {
string mainDir = Path.GetFullPath(Path.Combine(exeDir, "../../../../.."));
if (File.Exists(mainDir + "\\SharpDevelop.sln")) {
Directory.SetCurrentDirectory(mainDir);
}
}
if (!File.Exists("SharpDevelop.sln")) {
Console.WriteLine("Working directory must be SharpDevelop!");
return 2;
}
RetrieveRevisionNumber();
UpdateFiles();
if (args.Contains("--REVISION")) {
var doc = new XDocument(new XElement(
"versionInfo",
new XElement("version", fullVersionNumber),
new XElement("revision", revisionNumber),
new XElement("commitHash", gitCommitHash)
));
doc.Save("REVISION");
}
return 0;
}
} catch (Exception ex) {
Console.WriteLine(ex);
return 3;
}
}
static void UpdateFiles()
{
foreach (var file in templateFiles) {
string content;
using (StreamReader r = new StreamReader(file.Input)) {
content = r.ReadToEnd();
}
content = content.Replace("$INSERTVERSION$", fullVersionNumber);
content = content.Replace("$INSERTREVISION$", revisionNumber);
content = content.Replace("$INSERTCOMMITHASH$", gitCommitHash);
content = content.Replace("$INSERTDATE$", DateTime.Now.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture));
if (File.Exists(file.Output)) {
using (StreamReader r = new StreamReader(file.Output)) {
if (r.ReadToEnd() == content) {
// nothing changed, do not overwrite file to prevent recompilation
// every time.
continue;
}
}
}
using (StreamWriter w = new StreamWriter(file.Output, false, Encoding.UTF8)) {
w.Write(content);
}
}
}
static string GetMajorVersion()
{
string version = "?";
// Get main version from startup
using (StreamReader r = new StreamReader(globalAssemblyInfoTemplateFile)) {
string line;
while ((line = r.ReadLine()) != null) {
string search = "string Major = \"";
int pos = line.IndexOf(search);
if (pos >= 0) {
int e = line.IndexOf('"', pos + search.Length + 1);
version = line.Substring(pos + search.Length, e - pos - search.Length);
}
search = "string Minor = \"";
pos = line.IndexOf(search);
if (pos >= 0) {
int e = line.IndexOf('"', pos + search.Length + 1);
version = version + "." + line.Substring(pos + search.Length, e - pos - search.Length);
}
search = "string Build = \"";
pos = line.IndexOf(search);
if (pos >= 0) {
int e = line.IndexOf('"', pos + search.Length + 1);
version = version + "." + line.Substring(pos + search.Length, e - pos - search.Length);
}
}
}
return version;
}
static void SetVersionInfo(string fileName, Regex regex, string replacement)
{
string content;
using (StreamReader inFile = new StreamReader(fileName)) {
content = inFile.ReadToEnd();
}
string newContent = regex.Replace(content, replacement);
if (newContent == content)
return;
using (StreamWriter outFile = new StreamWriter(fileName, false, Encoding.UTF8)) {
outFile.Write(newContent);
}
}
#region Retrieve Revision Number
static string revisionNumber;
static string fullVersionNumber;
static string gitCommitHash;
static void RetrieveRevisionNumber()
{
if (revisionNumber == null) {
if (Directory.Exists("..\\.git")) {
ReadRevisionNumberFromGit();
}
}
if (revisionNumber == null) {
ReadRevisionFromFile();
}
fullVersionNumber = GetMajorVersion() + "." + revisionNumber;
}
static void ReadRevisionNumberFromGit()
{
ProcessStartInfo info = new ProcessStartInfo("cmd", "/c git rev-list --first-parent " + BaseCommit + "..HEAD");
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
using (Process p = Process.Start(info)) {
string line;
int revNum = BaseCommitRev;
while ((line = p.StandardOutput.ReadLine()) != null) {
if (gitCommitHash == null) {
// first entry is HEAD
gitCommitHash = line;
}
revNum++;
}
revisionNumber = revNum.ToString();
p.WaitForExit();
if (p.ExitCode != 0)
throw new Exception("git-rev-list exit code was " + p.ExitCode);
}
}
static void ReadRevisionFromFile()
{
try {
XDocument doc = XDocument.Load("REVISION");
revisionNumber = (string)doc.Root.Element("revision");
gitCommitHash = (string)doc.Root.Element("commitHash");
} catch (Exception e) {
Console.WriteLine(e.Message);
Console.WriteLine();
Console.WriteLine("The revision number of the SharpDevelop version being compiled could not be retrieved.");
Console.WriteLine();
Console.WriteLine("Build continues with revision number '0'...");
revisionNumber = "0";
gitCommitHash = null;
}
if (revisionNumber == null || revisionNumber.Length == 0) {
revisionNumber = "0";
//throw new ApplicationException("Error reading revision number");
}
}
#endregion
}
}