From b2ef60a595732144be6dbddbecfe4233e3a9c4bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20B=C3=B6rchers?= Date: Wed, 21 Mar 2018 22:06:26 +0100 Subject: [PATCH] Renamed ApplicationArguments, improved errorhandling in AssemblyFileInfo, changed separator in ReleaseEntry, --- .gitignore | 2 +- Creator/ApplicationArguments.cs | 6 +- Creator/AssemblyFileInfo.cs | 28 +- Creator/Helper/Utils.cs | 11 +- Creator/Program.cs | 2 +- Creator/SetupTmpl.cs | 522 -------------------------------- Creator/SetupTmpl.tt | 2 +- Katteker/ReleaseEntry.cs | 26 +- Katteker/Releases.cs | 2 +- 9 files changed, 43 insertions(+), 558 deletions(-) delete mode 100644 Creator/SetupTmpl.cs diff --git a/.gitignore b/.gitignore index ae78618..5495cd0 100644 --- a/.gitignore +++ b/.gitignore @@ -109,5 +109,5 @@ Backup*/ UpgradeLog*.XML .vs -SetupTmpl.cs *.DotSettings +/Creator/SetupTmpl.cs diff --git a/Creator/ApplicationArguments.cs b/Creator/ApplicationArguments.cs index b782395..fac204d 100644 --- a/Creator/ApplicationArguments.cs +++ b/Creator/ApplicationArguments.cs @@ -35,15 +35,15 @@ namespace KattekerCreator set => SetPropertyIfNotDefault(ref _channel, value); } - [DisplayName("OutDir")] - [Description("Directory for output")] + [DisplayName("Out")] + [Description("Directory for the output")] public string OutputDir { get => _outputDir; set => SetPropertyIfNotDefault(ref _outputDir, value); } - [DisplayName("PublishDir")] + [DisplayName("Publish")] [Description("Path for output from the point of view of the application.")] public string PublishDir { diff --git a/Creator/AssemblyFileInfo.cs b/Creator/AssemblyFileInfo.cs index c28d01d..b706521 100644 --- a/Creator/AssemblyFileInfo.cs +++ b/Creator/AssemblyFileInfo.cs @@ -21,20 +21,22 @@ namespace KattekerCreator using (var resourceInfo = new ResourceInfo()) { resourceInfo.Load(fileName); + if (resourceInfo.ResourceTypes.All(x => x.ResourceType != Kernel32.ResourceTypes.RT_VERSION)) return; var versionResource = (VersionResource) resourceInfo[Kernel32.ResourceTypes.RT_VERSION].First(); - var stringFileInfo = ((StringFileInfo) versionResource[nameof(StringFileInfo)]).Strings.FirstOrDefault() - .Value; + var stringFileInfo = ((StringFileInfo) versionResource[nameof(StringFileInfo)]).Strings + .FirstOrDefault().Value; AssemblyIconPath = GetAssemblyIcon(fileName, tempDir); if (stringFileInfo.Strings.ContainsKey("CompanyName")) - _company = stringFileInfo.Strings["CompanyName"].StringValue; + _company = stringFileInfo.Strings["CompanyName"].StringValue.TrimEnd('\0'); if (stringFileInfo.Strings.ContainsKey("FileDescription")) - _description = stringFileInfo.Strings["FileDescription"].StringValue; + _description = stringFileInfo.Strings["FileDescription"].StringValue.TrimEnd('\0'); if (stringFileInfo.Strings.ContainsKey("LegalCopyright")) - _copyright = stringFileInfo.Strings["LegalCopyright"].StringValue; + _copyright = stringFileInfo.Strings["LegalCopyright"].StringValue.TrimEnd('\0'); if (stringFileInfo.Strings.ContainsKey("ProductName")) - _productName = stringFileInfo.Strings["ProductName"].StringValue; + _productName = stringFileInfo.Strings["ProductName"].StringValue.TrimEnd('\0'); if (!stringFileInfo.Strings.ContainsKey("ProductVersion")) return; - AssemblyVersion = GetSemanticVersion(stringFileInfo.Strings["ProductVersion"].StringValue); + AssemblyVersion = + GetSemanticVersion(stringFileInfo.Strings["ProductVersion"].StringValue.TrimEnd('\0')); } } @@ -82,12 +84,12 @@ namespace KattekerCreator private static SemanticVersion GetSemanticVersion(string productVersion) { - if (!SemanticVersion.TryParse(productVersion, out var semanticVersion)) - { - Version.TryParse(productVersion, out var version); - return SemanticVersion.Parse(version.ToString(3)); - } - return semanticVersion?.Change(build: string.Empty); + productVersion = productVersion.Replace(',', '.'); + if (SemanticVersion.TryParse(productVersion, out var semanticVersion)) + return semanticVersion?.Change(build: string.Empty); + Version.TryParse(productVersion, out var version); + return SemanticVersion.Parse(version.ToString(3)); + } } } \ No newline at end of file diff --git a/Creator/Helper/Utils.cs b/Creator/Helper/Utils.cs index 2b75f8c..9a986ef 100644 --- a/Creator/Helper/Utils.cs +++ b/Creator/Helper/Utils.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using System.Security.Cryptography.X509Certificates; using Vestris.ResourceLib; @@ -43,15 +44,19 @@ namespace KattekerCreator.Helper using (var ri = new ResourceInfo()) { ri.Load(inFile); - var versionResource = (VersionResource) ri[Kernel32.ResourceTypes.RT_VERSION].First(); + if (ri.ResourceTypes.Any(x => x.ResourceType == Kernel32.ResourceTypes.RT_GROUP_ICON)) { var groupIcon = ri[Kernel32.ResourceTypes.RT_GROUP_ICON]; var iconDictionary = groupIcon.FirstOrDefault() as IconDirectoryResource; iconDictionary?.SaveTo(outFile); } - versionResource.Language = 0; - versionResource.SaveTo(outFile); + if (ri.ResourceTypes.Any(x => x.ResourceType == Kernel32.ResourceTypes.RT_VERSION)) + { + var versionResource = (VersionResource)ri[Kernel32.ResourceTypes.RT_VERSION].First(); + versionResource.Language = 0; + versionResource.SaveTo(outFile); + } } } diff --git a/Creator/Program.cs b/Creator/Program.cs index 7fd006f..890fcf5 100644 --- a/Creator/Program.cs +++ b/Creator/Program.cs @@ -139,7 +139,7 @@ namespace KattekerCreator p.StartInfo = new ProcessStartInfo { FileName = _executable, - Arguments = templateFile, + Arguments = $"\"{templateFile}\"", UseShellExecute = false }; var sw = Stopwatch.StartNew(); diff --git a/Creator/SetupTmpl.cs b/Creator/SetupTmpl.cs deleted file mode 100644 index 66460f2..0000000 --- a/Creator/SetupTmpl.cs +++ /dev/null @@ -1,522 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version: 15.0.0.0 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace KattekerCreator -{ - using System.Linq; - using System.Text; - using System.Collections.Generic; - using System; - - /// - /// Class to produce the template output - /// - - #line 1 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] - public partial class SetupTmpl : SetupTmplBase - { -#line hidden - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.Write("Unicode true\r\nManifestDPIAware true\r\n!define APPNAME \""); - - #line 8 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(AppName)); - - #line default - #line hidden - this.Write("\"\r\n!define EXECUTABLE \""); - - #line 9 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(Executable)); - - #line default - #line hidden - this.Write("\"\r\n!define SOURCEPATH \""); - - #line 10 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(SourcePath)); - - #line default - #line hidden - this.Write("\"\r\n!define COMPANYNAME \""); - - #line 11 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(CompanyName)); - - #line default - #line hidden - this.Write("\"\r\n!define DESCRIPTION \""); - - #line 12 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(Description)); - - #line default - #line hidden - this.Write("\"\r\n!define VERSION "); - - #line 13 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(Version.ToString())); - - #line default - #line hidden - this.Write("\r\n!define HELPURL "); - - #line 14 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(HelpUrl)); - - #line default - #line hidden - this.Write("\r\n!define INSTALLSIZE "); - - #line 15 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(InstallSize)); - - #line default - #line hidden - this.Write("\r\n!define ISMANAGED "); - - #line 16 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(IsManaged ? 1 : 0)); - - #line default - #line hidden - this.Write("\r\n; exampleCmd: makensis.exe /DVERSION=1.0.0.5 /DNAME=WpfApp1 Setup.nsi\r\n\r\nName \"" + - "${APPNAME}\"\r\nOutFile \""); - - #line 20 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(OutFile)); - - #line default - #line hidden - this.Write("\"\r\nInstallDir \"$LOCALAPPDATA\\${APPNAME}\"\r\nRequestExecutionLevel user\r\nSetCompress" + - "or /SOLID lzma\r\nSilentUnInstall silent\r\n; Subcaption 3 \" \"\r\nXPStyle on\r\nAutoClos" + - "eWindow true\r\nChangeUI all \""); - - #line 28 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(UserInterface)); - - #line default - #line hidden - this.Write("\"\r\nIcon \""); - - #line 29 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(IconPath)); - - #line default - #line hidden - this.Write("\"\r\nUninstallIcon \""); - - #line 30 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(UninstallIcon)); - - #line default - #line hidden - this.Write("\"\r\nShowInstDetails nevershow \r\nShowUninstDetails nevershow \r\nBrandingText \"${COMP" + - "ANYNAME}\"\r\n\r\nVIProductVersion "); - - #line 35 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(LegacyVersion.ToString(4))); - - #line default - #line hidden - this.Write(@" -VIAddVersionKey ProductName ""${APPNAME}"" -VIAddVersionKey Comments """" -VIAddVersionKey CompanyName ""${COMPANYNAME}"" -VIAddVersionKey LegalCopyright ""${COMPANYNAME}"" -VIAddVersionKey FileDescription ""${DESCRIPTION}"" -VIAddVersionKey FileVersion ""${VERSION}"" -VIAddVersionKey ProductVersion ""${VERSION}"" -VIAddVersionKey OriginalFilename """); - - #line 43 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture(OutFile)); - - #line default - #line hidden - this.Write(@""" - -;-------------------------------- -; The stuff to install -Section ""install"" ;No components page, name is not important - DetailPrint 'Installing ${APPNAME}. Please wait...' - SetShellVarContext current - SetDetailsPrint None - IfSilent +2 - RMDir /r $INSTDIR - SetOutPath $INSTDIR - - ; Create sub-directories -"); - - #line 56 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - foreach(var directory in Directories) { - - #line default - #line hidden - - #line 56 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture($" CreateDirectory \"$INSTDIR\\{directory}\"{Environment.NewLine}")); - - #line default - #line hidden - - #line 56 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - } - - #line default - #line hidden - this.Write("\r\n ; Put file there\r\n"); - - #line 59 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" -foreach(var file in Files) { - - #line default - #line hidden - - #line 59 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - this.Write(this.ToStringHelper.ToStringWithCulture($" File \"/oname={file.TargetPath}\" \"{file.SourcePath}\"{Environment.NewLine}")); - - #line default - #line hidden - - #line 59 "C:\Strukturberechnung_del\Repos\SquirrelKiller\Katteker\Creator\SetupTmpl.tt" - } - - #line default - #line hidden - this.Write("\r\n WriteUninstaller \"$INSTDIR\\uninstall.exe\"\r\n ; Desktop\r\n CreateShortCu" + - "t \"$DESKTOP\\${APPNAME}.lnk\" \"$INSTDIR\\${EXECUTABLE}\"\r\n \r\n # Start Menu\r\n " + - " CreateDirectory \"$SMPROGRAMS\\${COMPANYNAME}\"\r\n CreateShortCut \"$SMPROGRAMS\\" + - "${COMPANYNAME}\\${APPNAME}.lnk\" \"$INSTDIR\\${EXECUTABLE}\"\r\n\r\n # Update pinned T" + - "askbar\r\n IfFileExists \"$APPDATA\\Microsoft\\Internet Explorer\\Quick Launch\\User" + - " Pinned\\TaskBar\\${APPNAME}.lnk\" 0 +2\r\n CreateShortCut \"$APPDATA\\Microsoft\\Int" + - "ernet Explorer\\Quick Launch\\User Pinned\\TaskBar\\${APPNAME}.lnk\" \"$INSTDIR\\${EXEC" + - "UTABLE}\"\r\n SetOutPath $INSTDIR\\app-${VERSION}\r\n StrCpy $0 ${EXECUTABLE} -4" + - "\r\n IfFileExists \"$APPDATA\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinne" + - "d\\TaskBar\\$0.lnk\" 0 +2\r\n CreateShortCut \"$APPDATA\\Microsoft\\Internet Explorer" + - "\\Quick Launch\\User Pinned\\TaskBar\\$0.lnk\" \"$INSTDIR\\app-${VERSION}\\${EXECUTABLE}" + - "\"\r\n \r\n # Registry information for add/remove programs\r\n WriteRegStr HKC" + - "U \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${APPNAME}\" \"DisplayName\"" + - " \"${APPNAME}\"\r\n WriteRegStr HKCU \"Software\\Microsoft\\Windows\\CurrentVersion\\U" + - "ninstall\\${APPNAME}\" \"UninstallString\" \"$\\\"$INSTDIR\\uninstall.exe$\\\"\"\r\n Write" + - "RegStr HKCU \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${APPNAME}\" \"Qu" + - "ietUninstallString\" \"$\\\"$INSTDIR\\uninstall.exe$\\\" /S\"\r\n WriteRegStr HKCU \"Sof" + - "tware\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${APPNAME}\" \"InstallLocation\" \"" + - "$\\\"$INSTDIR$\\\"\"\r\n WriteRegStr HKCU \"Software\\Microsoft\\Windows\\CurrentVersion" + - "\\Uninstall\\${APPNAME}\" \"DisplayIcon\" \"$\\\"$INSTDIR\\app-${VERSION}\\${EXECUTABLE}$\\" + - "\"\"\r\n WriteRegStr HKCU \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${" + - "APPNAME}\" \"Publisher\" \"${COMPANYNAME}\"\r\n ; WriteRegStr HKCU \"Software\\Microso" + - "ft\\Windows\\CurrentVersion\\Uninstall\\${APPNAME}\" \"HelpLink\" \"${HELPURL}\"\r\n Wri" + - "teRegStr HKCU \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${APPNAME}\" \"" + - "DisplayVersion\" \"${VERSION}\"\r\n # There is no option for modifying or repairin" + - "g the install\r\n WriteRegDWORD HKCU \"Software\\Microsoft\\Windows\\CurrentVersion" + - "\\Uninstall\\${APPNAME}\" \"NoModify\" 1\r\n WriteRegDWORD HKCU \"Software\\Microsoft\\" + - "Windows\\CurrentVersion\\Uninstall\\${APPNAME}\" \"NoRepair\" 1\r\n # Set the INSTALL" + - "SIZE constant (!defined at the top of this script) so Add/Remove Programs can ac" + - "curately report the size\r\n WriteRegDWORD HKCU \"Software\\Microsoft\\Windows\\Cur" + - "rentVersion\\Uninstall\\${APPNAME}\" \"EstimatedSize\" ${INSTALLSIZE}\r\nSectionEnd ; e" + - "nd the section\r\n\r\nFunction .onInstSuccess\r\n IfSilent +2\r\n Exec \'\"$INSTDIR\\" + - "${EXECUTABLE}\"\'\r\nFunctionEnd\r\n\r\nSection \"uninstall\"\r\n DetailPrint \'Please wai" + - "t...\'\r\n SetShellVarContext current\r\n SetDetailsPrint None\r\n SetAutoClos" + - "e true\r\n \r\n # Remove Start Menu launcher\r\n Delete \"$SMPROGRAMS\\${COMPAN" + - "YNAME}\\${APPNAME}.lnk\"\r\n Delete \"$DESKTOP\\${APPNAME}.lnk\"\r\n StrCpy $0 ${EX" + - "ECUTABLE} -4\r\n Delete \"$APPDATA\\Microsoft\\Internet Explorer\\Quick Launch\\User" + - " Pinned\\TaskBar\\${APPNAME}.lnk\"\r\n Delete \"$APPDATA\\Microsoft\\Internet Explore" + - "r\\Quick Launch\\User Pinned\\TaskBar\\$0.lnk\"\r\n # Try to remove the Start Menu f" + - "older - this will only happen if it is empty\r\n RMDir \"$SMPROGRAMS\\${COMPANYNA" + - "ME}\"\r\n\r\n # Always delete uninstaller as the last action\r\n delete $INSTDIR\\" + - "uninstall.exe\r\n\r\n # Try to remove the install directory - this will only happ" + - "en if it is empty\r\n RMDir /r /REBOOTOK $INSTDIR\r\n\r\n # Remove uninstaller i" + - "nformation from the registry\r\n DeleteRegKey HKCU \"Software\\Microsoft\\Windows\\" + - "CurrentVersion\\Uninstall\\${APPNAME}\"\r\nsectionEnd"); - return this.GenerationEnvironment.ToString(); - } - } - - #line default - #line hidden - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "15.0.0.0")] - public class SetupTmplBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - protected System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} diff --git a/Creator/SetupTmpl.tt b/Creator/SetupTmpl.tt index a78a8f0..74aa2a1 100644 --- a/Creator/SetupTmpl.tt +++ b/Creator/SetupTmpl.tt @@ -27,7 +27,7 @@ XPStyle on AutoCloseWindow true ChangeUI all "<#= UserInterface #>" Icon "<#= IconPath #>" -UninstallIcon "<#= UninstallIcon #>" +UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\nsis3-uninstall.ico" ShowInstDetails nevershow ShowUninstDetails nevershow BrandingText "${COMPANYNAME}" diff --git a/Katteker/ReleaseEntry.cs b/Katteker/ReleaseEntry.cs index 4d82b16..e1e8e8a 100644 --- a/Katteker/ReleaseEntry.cs +++ b/Katteker/ReleaseEntry.cs @@ -8,6 +8,8 @@ namespace Katteker { public const string FilenameRegex = @"(^.*)-((?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(?:\+[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)?).*-(full|delta)"; + private const char Seperator = '|'; + public ReleaseEntry(string filename, SemanticVersion version, long fileSize, bool isDelta, string sha1) { Filename = filename; @@ -19,18 +21,16 @@ namespace Katteker public ReleaseEntry(string line) { - var elements = line?.Split(' '); - if (elements?.Length == 3) - { - SHA1 = elements[0]; - Filename = elements[1]; - Filesize = long.Parse(elements[2]); - var fileSegments = Regex.Match(Filename, FilenameRegex); - if (fileSegments.Groups.Count < 3) throw new ArgumentOutOfRangeException("Filename is not compilant."); - ApplicationName = fileSegments.Groups[1].Value; - Version = SemanticVersion.Parse(fileSegments.Groups[2].Value); - IsDelta = fileSegments.Groups[3].Value != "full"; - } + var elements = line?.Split(Seperator); + if (elements?.Length != 3) return; + SHA1 = elements[0]; + Filename = elements[1]; + Filesize = long.Parse(elements[2]); + var fileSegments = Regex.Match(Filename, FilenameRegex); + if (fileSegments.Groups.Count < 3) throw new ArgumentOutOfRangeException("Filename is not compilant."); + ApplicationName = fileSegments.Groups[1].Value; + Version = SemanticVersion.Parse(fileSegments.Groups[2].Value); + IsDelta = fileSegments.Groups[3].Value != "full"; } public ReleaseEntry(string applicationName, SemanticVersion version) @@ -45,7 +45,7 @@ namespace Katteker public long Filesize { get; } public bool IsDelta { get; } public string ApplicationName { get; } - public string EntryAsString => $"{SHA1} {Filename} {Filesize}"; + public string EntryAsString => $"{SHA1}{Seperator}{Filename}{Seperator}{Filesize}"; public override string ToString() => $"{ApplicationName} {Version}"; public int CompareTo(object obj) => CompareTo(obj as ReleaseEntry); diff --git a/Katteker/Releases.cs b/Katteker/Releases.cs index b688b06..a719f76 100644 --- a/Katteker/Releases.cs +++ b/Katteker/Releases.cs @@ -23,7 +23,7 @@ namespace Katteker AddRange(File.ReadAllLines(_filePath)); } - public Releases(string[] content) : this() + public Releases(IEnumerable content) : this() { AddRange(content); }