using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; using JustDance.Tools; using Sharpmake; using Ubisoft.Perforce; namespace sharpmake_sharpmake.Tools.Helpers { internal class AssemblyInfoGenerator { private static readonly int _changelist; private static readonly string _clientName; private readonly string _assemblyFilePath; private readonly string _description = ""; static AssemblyInfoGenerator() { TryGetPerforceInformation(BaseProject.ToolsPath, out _changelist, out _clientName); } public AssemblyInfoGenerator(Project project) { _assemblyFilePath = project.ResolveString(BaseProject.BuildPath + @"\tools\[project.Name]\Properties\" + "AssemblyInfo.cs"); if (!Directory.Exists(Path.GetDirectoryName(_assemblyFilePath))) { Directory.CreateDirectory(Path.GetDirectoryName(_assemblyFilePath)); } project.SourceFiles.Add(_assemblyFilePath); var descriptionAttribute = project.GetType().GetCustomAttributes(typeof(DescriptionAttribute), true).Cast().FirstOrDefault(); if (descriptionAttribute != null) { _description = descriptionAttribute.Description; } } public void AfterConfigureAll(Project.Configuration conf) { var version = string.Format("{0}.{1}.{2}.{3}", DateTime.Today.Year, DateTime.Today.Month, _changelist / 10000, _changelist % 10000); var usings = new List(); usings.Add("System.Reflection"); usings.Add("System.Runtime.InteropServices"); var attributes = new List(); attributes.Add(new AssemblyAttribute("AssemblyTitle", conf.Project.Name)); attributes.Add(new AssemblyAttribute("AssemblyDescription", _description)); attributes.Add(new AssemblyAttribute("AssemblyConfiguration", "")); attributes.Add(new AssemblyAttribute("AssemblyCompany", "Ubisoft")); attributes.Add(new AssemblyAttribute("AssemblyProduct", conf.Project.Name)); attributes.Add(new AssemblyAttribute("AssemblyCopyright", "Copyright (C) Ubisoft. All rights reserved.")); attributes.Add(new AssemblyAttribute("AssemblyTrademark", "")); attributes.Add(new AssemblyAttribute("AssemblyCulture", "")); attributes.Add(new AssemblyAttribute("AssemblyVersion", version)); attributes.Add(new AssemblyAttribute("AssemblyFileVersion", version)); attributes.Add(new AssemblyAttribute("AssemblyInformationalVersion", _changelist.ToString())); attributes.Add(new AssemblyAttribute("AssemblyMetadata", "BuildPerforceChangelist", _changelist.ToString())); attributes.Add(new AssemblyAttribute("AssemblyMetadata", "BuildPerforceClientName", _clientName)); attributes.Add(new AssemblyAttribute("AssemblyMetadata", "BuildUserName", Environment.UserName)); attributes.Add(new AssemblyAttribute("AssemblyMetadata", "BuildMachineName", Environment.MachineName)); attributes.Add(new AssemblyAttribute("AssemblyMetadata", "BuildCreationTime", DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture))); if (conf.ReferencesByName.Contains("PresentationFramework")) { attributes.Add(new AssemblyAttribute("ThemeInfo", false, "ResourceDictionaryLocation.None", "ResourceDictionaryLocation.SourceAssembly")); usings.Add("System.Windows"); } var content = string.Format(Template, string.Join("\n", usings.Select(x => "using " + x + ";")), string.Join("\n", attributes.Select(x => "[assembly: " + x.ToString() + "]"))); File.WriteAllText(_assemblyFilePath, content); } private const string Template = @"{0} //------------------------------------------------------------------------------ // // This code was generated by a tool. // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ {1} "; private static void TryGetPerforceInformation(string path, out int changelist, out string clientName) { changelist = 0; clientName = ""; try { GetPerforceInformation(path, out changelist, out clientName); } catch (Exception e) { Console.WriteLine(e); } } private static void GetPerforceInformation(string path, out int changelist, out string clientName) { changelist = 0; clientName = ""; var codePerforce = "p4-jd-code-mrc.ubisoft.org:1920"; var perforce = new PerforceWrapper("", Environment.UserName, "", codePerforce, true); var client = perforce.GetClients(Environment.UserName, Environment.MachineName).FirstOrDefault(x => Path.GetFullPath(path).ToLower().StartsWith(Path.GetFullPath(x.Root).ToLower())); if (client != null) { clientName = client.ClientName; } else { return; } var result = perforce.Run("changes", "-m1", "@" + clientName); if (result.Records.Length == 0) return; if (result.Records[0].Fields.ContainsKey("change")) { int.TryParse(result.Records[0].Fields["change"], out changelist); } } private class AssemblyAttribute { public AssemblyAttribute(string name, params string[] parameters) { Name = name; Parameters = parameters; QuoteArguments = true; } public AssemblyAttribute(string name, bool quoteArguments, params string[] parameters) { Name = name; Parameters = parameters; QuoteArguments = quoteArguments; } public string Name { get; set; } public string[] Parameters { get; set; } public bool QuoteArguments { get; set; } /// public override string ToString() { var parameters = QuoteArguments ? Parameters.Select(x => "\"" + x.ToString() + "\"") : Parameters.Select(x => x.ToString()); return Name + "(" + string.Join(", ", parameters) + ")"; } } } }